连续时间下的弹球建模
以下示例说明如何配置一个对连续时间下的弹球进行仿真的 Stateflow® 图。球在空中连续运动,直至触地,此时发生不连续变化,球突然更改其方向和速度。有关详细信息,请参阅Continuous-Time Modeling in Stateflow。
模型 sf_bounce
包含一个在连续时间下更新的 Stateflow 图。局部变量用位置和速度描述自由落体球的动态特性。在仿真过程中,模型使用过零检测来确定球何时触地。
弹球的动态特性
您可以使用下面的一阶微分方程组,通过位置 p 和速度 v 来指定球在重力作用下如何自由落下:
当 p <= 0 时,球触地并反弹。您可以通过更新球的位置和速度对反弹建模:
将位置重置为 p = 0。
将速度重置为刚触地之前的值的负数。
考虑到能量损失,将新速度乘以分布系数 (-0.8)。
配置连续时间仿真的图
在模型中,BouncingBall 图实现模态逻辑,以仿真自由落体的连续动态特性以及与反弹关联的离散变化。在图属性对话框中,以下设置使 BouncingBall 图能够在连续时间内仿真:
更新方法为
Continuous
,因此图采用连续时间仿真对弹球的动态特性建模。选择启用过零检测,因此 Simulink® 求解器可以准确确定球何时触地。否则,Simulink 模型不能准确仿真物理特性,球会像是落入地下。
定义连续时间变量
BouncingBall 图有两个连续时间变量:p
表示位置,v
表示速度。对于其中每个变量:
作用域为
Local
。类型为
double
。更新方法为
Continuous
。
为了向 Simulink 模型提供图的连续状态,BouncingBall 图使用两个输出变量:p_out
和 v_out
。对于其中每个变量:
作用域为
Output
。类型为
double
。更新方法为
Discrete
。
该图隐式定义连续时间变量的时间导数:
p_dot
是位置p
的导数。v_dot
是速度v
的导数。
在“模型资源管理器”中,您可以在图中查看连续时间局部变量和对应的输出。隐式导数变量不会出现在模型资源管理器或符号窗格中。
自由落体的连续动态特性建模
BouncingBall 图包含名为 Falling
的单个状态,它以数值方式求解自由落体的微分方程。到该状态的默认转移会将初始位置设为 10 米,初始速度设为 15 米/秒。状态中的 during
动作:
定义位置和速度的导数
将球的位置和速度值赋给输出变量
p_out
和v_out
反弹的离散特性建模
Falling
状态具有一个自环转移,将反弹的不连续性建模为一个瞬时模式更改(球的运动方向突然反转)。转移的条件调用边沿检测运算符 falling
。此运算符通过检测位置何时越过零阈值并变为负值来确定球何时触地。如果条件有效,则条件动作会在球触地时重置位置和速度。
验证图语义
BouncingBall 图符合Guidelines for Continuous-Time Simulation中定义的设计要求。具体来说,该图:
在发生默认转移时初始化局部变量 p 和 v。
在
during
动作中为导数 p_dot 和 v_dot 赋值。在转移动作中写入局部变量 p 和 v。
不包含事件、内部转移、基于事件的时序逻辑或更改检测运算符。
查看仿真结果
运行模型后,Scope 模块会对球的位置和速度绘图。位置图展示了预期的反弹模式。