离散求解器也包含定步长和变步长两种。
3.3.5.零交点探测器(zero-crossing detectors) 3.3.6.代数循环(algebraic loop)
一些simulink模块拥有直接注入的输入端,这意味着若不知道这些输入端口的信号值,就无法计算模块的输出值。具有直接注入输入端口的模块有:
? ? ? ?
Math Function block Gain block
Integrator block's initial condition ports
Product blockState-Space block when there is a nonzero D matrix
? Sum block
? Transfer Fcn block when the numerator and denominator ? are of the same order
? Zero-Pole block when there are as many zeros as poles 当一个带有直接注入的输入端口由同一模块的输出驱动时(要么直接驱动,要么由别的带有直接注入端口的反馈间接驱动),通常就会出现代数循环。代数循环的例子就是如下所示的简单的标量循环:
从数学角度来讲,该循环暗示z=u-z,即z?12u,这就是求解表达式。但大多数代数循
环就无法通过这种检查自动计算。
创建带多个代数状态变量(如z1,z2等)的向量代数循环是非常容易的。如下图所示。
使用Algebraic Constraint模块是建模代数方程和指定初始化估值的一个方便的方法。该模块将它的输入信号f(z)限制到0,并输出代数状态z。该模块输出一个值,该值对于在模块的输入端产生一个零点是必须的。输出必须通过反馈直接影响到输入,例如,该反馈通道单独包含带有直接注入的模块。在代数限制模块对话框中,你可以提供一个初始的代数状态值以改善代数循环求解器的效率。
一个标量代数循环表示的是一个代数方程或形如F(z)=0的限制方程,这里的z是循环中的一个模块的输出,而函数F由从循环中别的模块到该模块的输入间的反馈通道组成。在上上一个例子中F(z)=z-(u-z)。在本例中,代数方程为:
z1+z2-1=0 -z1+z2-1=0
当一个模型中包含F(z)=0的限制时就会出现代数循环。这种限制可能是作为一个你所创建的系统的物理内部连接的因果关系而出现的,或者你建立的正是一个代数/差分系统(DAE)。
当一个模型包含代数循环时,simlink将在每一个时间步中调用循环求解子程序,以求得其结果。包含代数循环的模型求解过程比不包含代数循环的模型要耗时。
为求解F(z)=0,simulink循环求解器使用牛顿法求解偏导数方程。尽管该方法鲁棒性好,但若没有合适的代数状态初始化值,则可能得不到结果。因此,你可以在代数循环中通过在那条线上(处于循环中)加入一个IC模块来为那条线指定一个初始估值。如上所示,另一个方法是通过使用代数限制模块指定初始值。
只要可能,请为循环中的代数状态变量指定初始估值,也就是使用IC模块或Algebraic Constraint模块。
(1)高亮代数循环
当你更新、仿真或调试模型时,可以使simulink高亮代数循环。
为了在仿真或更新时使simulink高亮自己探测到的代数循环,请在“Configuration Parameters”对话框的“Diagnostics”面板上,设置“Algebraic loop”为error。
(2)消除代数循环
simulink能消除包含下列模块的代数循环:
? Atomic Subsystem ? Enabled Subsystem ? Model
为了能使simulink能够自动消除涉及Atomic subsystem和Enabled Subsystem的代数循环,在模块参数对话框中选择“Minimize algebraic loop occurrences”选项。