Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

弹球的仿真

此示例说明如何使用 Simulink® 以两种不同方法对弹球建模。

概述

图 1:球以 15 米/秒的速度从 10 米的高度向上抛。

弹球模型是混合动态系统的经典示例。混合动态系统是既包括连续动态又包括离散转移的系统,其中系统动态可能会发生变化,状态值可能会有跳跃。弹球的连续动态特性可简单地由下式给出:

$$
\frac{d v}{d t} = -g,
$$

$$
\frac{d x}{d t} = v,
$$

其中,$g$ 是重力加速度,$x(t)$ 是球的位置,$v(t)$ 是速度。因此,系统有两个连续状态:位置 $x$ 和速度 $v$

该模型的混合系统方面源于球与地面碰撞的建模。假设球与地面发生部分弹性碰撞,则碰撞前的速度 $v^-$、碰撞后的速度 $v^+$ 可以通过球的恢复系数 $\kappa$ 来关联,如下所示:

$$
v^+ = -\kappa v^-, \qquad x = 0
$$

因此,弹球在转移条件 $x=0$ 下显示连续状态(速度)下出现一个跳跃。

弹球是展示 Zeno 现象的最简单模型之一。一般来说,Zeno 行为的特征可非正式地表示为某些混合系统在有限时间间隔内发生无限数量的事件。在弹球模型中,球在失去能量的同时,将以越来越小的时间间隔与地面发生多次碰撞。因此,模型会经历 Zeno 行为。具有 Zeno 行为的模型很难在计算机上进行仿真,但在许多常见的重要工程应用中又时常出现。

使用两个 Integrator 模块对弹球进行建模

打开此模型

您可以使用两个 Integrator 模块对弹球进行建模。左边的 Integrator 模块是对第一个方程建模的速度积分器,右边的 Integrator 模块是位置积分器。导航到位置积分器模块对话框,您会发现其下限为零。这种情况表示存在一个限制:球无法降到地面以下。

位置积分器的状态端口和对应的比较结果用于检测球何时落地并重置两个积分器。速度积分器的状态端口用于计算 $v^+$

要观察系统的 Zeno 行为,请导航到 Configuration Parameters 对话框的 Solver 窗格。在 Zero-crossing options 部分,确认 Algorithm 设置为 Nonadaptive 且仿真 Stop time 设置为 25 秒。运行仿真。

请注意观察,随着球越来越频繁地落地并失去能量,仿真会出错。因此,仿真会超过允许的 Number of consecutive zero crossings 的默认限值 1000。现在导航到 Configuration Parameters 对话框。在 Zero-crossing options 部分,将 Algorithm 设置为 Adaptive。此算法包含对这种震颤行为的复杂处理。因此,您现在可以对系统进行超过 20 秒的仿真。然而,请注意 21 秒到 25 秒之间的状态震颤,以及 Simulink 关于模型中大约 20 秒处存在强烈震颤的警告。

使用 Second-Order Integrator 模块对弹球建模

打开此模型

您可以使用单个 Second-Order Integrator 模块来对此系统建模。在本例中,第二个方程 $dx/dt=v$ 位于 Second-Order Integrator 模块的内部。导航到 Second-Order Integrator 模块对话框,注意如前所述,$x$ 的下限为零。导航到模块对话框上的 Attributes 选项卡,注意 Reinitialize dx/dt when x reaches saturation 选项处于选中状态。此参数允许我们在瞬时 $x$ 达到饱和限制时,将 $dx/dt$(弹球模型中的 $v$)重新初始化为新值。因此,对于弹球模型,此选项意味着当球触地时,其速度可以设置为不同值,即撞击后的速度。请注意计算与地面碰撞后速度的循环。为了捕获即将触地之前球的速度 $v^-$,使用 Second-Order Integrator 模块的 $dx/dt$ 输出端口和 Memory 模块。然后使用 $v^-$ 计算回弹速度 $v^+$

导航到 Configuration Parameters 对话框的 Solver 窗格。确认 Zero-crossing options 部分中的 Algorithm 设置为 Nonadaptive,仿真 Stop Time 设置为 25 秒。对模型进行仿真。请注意,仿真没有遇到任何问题。在 t = 20 秒后,您可以对模型进行仿真而不会出现过多震颤,同时无需将 Algorithm 设置为 Adaptive。

Second-Order Integrator 模型是弹球建模的首选方法

通过将每次弹跳所需的时间相加,可以分析计算出球以零速度落地的准确时间 $t^*$。此时间是由下式给出的无穷等比数列的总和:

$$
t^* = \frac{1}{g}\left(v_0+ v_1\left(\frac{1+\kappa}{1-\kappa}\right) \right),\qquad v_1=\sqrt{v_0^2+2gx_0}.
$$

此处,$x_0$$v_0$ 分别是位置和速度的初始条件。对于 $t&#62;t^*$,球的速度和位置必须相同,都为零。在下图中,两次仿真的结果都绘制在 $t^*$ 附近。图中的红色竖线是给定模型参数对应的 $t^*$。如果 $t<t^*$ 且远离 $t^*$,则这两个模型将生成准确且相同的结果。因此,在绘图中只能看到来自第二个模型的品红色线。然而,第一个模型的仿真结果在 $t^*$ 后并不精确;如果 $t&#62;t^*$,它会继续显示过多的震颤行为。相反,使用 Second-Order Integrator 模块的第二个模型在 $t &#62; t^*$ 精确稳定为零。

图 2:两种方法的仿真结果的比较。

图 2 的结论表明,与第一个模型相比,第二个模型具有更好的数值特征。Second-Order Integrator 模型具有较高准确度的原因如下。第二个微分方程 $dx/dt=v$ 位于 Second-Order Integrator 模块内部。因此,模块算法可以利用这两种状态之间的已知关系,并部署启发式方法来抑制某些条件下不希望出现的震颤行为。当两种状态由于积分误差和震颤行为而不再相互一致时,这些启发式方法变为活动状态。因此,您可以使用系统的物理知识来缓解某些类型的 Zeno 模型的仿真陷入 Zeno 状态的问题。