讨论二阶导数过零检测
变步长求解器动态调整时间步长,使其在变量变化缓慢时增大,在变量变化迅速时减小。这种行为导致求解器在不连续点附近采取许多小步骤,因为变量在这个区域内快速变化。这提高了精度,但可能导致过多的模拟时间。
动态仿真模块®使用一种叫做讨论二阶导数过零检测精确地定位不连续性而不诉诸于过小的时间步长。通常,这种技术可以提高模拟运行时间,但它可能导致一些模拟在预期完成时间之前停止。
Simulink为此使用了两种算法:非自适应算法和自适应算法。有关这些技术的信息,请参见零交点的算法.
演示过度过零检测的效果
这个例子提供了三个模型来说明零跨越行为:example_bounce_two_integrators
,example_doublebounce
,example_bounce
.
的example_bounce_two_integrators
模型演示了过多的过零如何导致模拟在预期完成时间之前停止,除非使用自适应算法。
的example_bounce
模型采用了更好的模型设计,使用双积分器实现了球的动力学,比example_bounce_two_integrators
.
的example_doublebounce
模型演示了自适应算法如何成功地解决具有两个不同的过零要求的复杂系统。
考虑到example_bounce_two_integrators
模型。它使用两个单独的积分器来计算模拟过程中球的垂直速度和位置。
通过运行打开模型
open_system(“example_bounce_two_integrators”)
在命令行。方框图出现后,设置求解器详细信息参数解算器窗格中的模型配置参数
非适应
.设置模型的停止时间为20秒。您可以在Simulink工具条或解算器模型配置参数的窗格。模拟模型。
现在可以查看和分析模拟结果。
仔细检查模拟的最后一部分,您将看到速度徘徊在零以上。
改变模拟停止时间,并对模型进行仿真。由于在Compare to Zero和Position块上连续过零事件过多而导致错误,模拟停止。
Simulink将停止对example_bounce_two_integrators模型的模拟,因为下面识别的2个过零信号在20.357636989536076和20.357636990631594之间的时间间隔内造成了1000个连续的过零事件。-------------------------------------------------------------------------------- 连续的零交叉:1000零点交叉信号名称:RelopInput块类型:RelationalOperator块路径:“example_bounce_two_integrators /比较零/比较 ' -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 连续的零交叉:500零点交叉信号名称:IntgLoLimit块类型:集成块路径:“example_bounce_two_integrators /位置 ' --------------------------------------------------------------------------------
尽管您可以通过调整型号配置参数> Solver >连续过零次数参数,做此更改仍然不允许模拟持续25秒。
改变求解器详细信息参数解算器窗格中的模型配置参数自适应
再对模型进行25 s的模拟。
放大模拟的最后5秒,你可以看到结果更完整,更接近预期的弹跳球动力学解析解。你看到的颤振量是系统状态接近零的结果,在数值模拟中是预期的。
的example_bounce
该模型使用二阶积分器块对弹跳球的动力学进行建模。这是建立球动力学双积分模型的首选方法。比较求解器的性能example_bounce_two_integrators
而且example_bounce
,尝试在两个模型上运行求解分析器。有关这两个模型的详细比较,请参见弹跳球的模拟.
有关自适应和非自适应过零检测算法的并行比较,请参见双弹球:使用自适应过零定位.
防止过零口
使用下表来防止模型中过度的过零错误。
变化类型 | 变化的过程 | 好处 |
---|---|---|
增加允许的零交叉次数 |
的值增加连续过零的次数.选择在解算器“配置参数”对话框中的。 |
这可能给您的模型足够的时间来解决过零问题。 |
放松信号阈值 |
选择自适应从算法下拉并增加的值信号阈值选择在解算器“配置参数”对话框中的。 |
该求解器精确定位零点交叉点所需的时间较短。这可以减少模拟时间,并消除过多的连续过零误差。然而,放松信号阈值可能会降低精度。 |
使用自适应算法 |
选择自适应从算法下拉的解算器“配置参数”对话框中的。 |
该算法动态调整过零阈值,提高了精度,减少了检测到的连续过零次数。使用此算法,您可以选择指定时间的宽容和信号阈值. |
禁用特定块的过零检测 |
|
局部禁用过零检测可防止特定块因过多连续过零而停止模拟。所有其他区块继续受益于过零检测提供的更高的准确性。 |
对整个模型禁用过零检测 |
选择 |
这可以防止在模型的任何地方检测到零交叉。结果是,您的模型不再受益于过零检测提供的提高的准确性。 |
如果使用 |
选项中选择一个值 |
有关更多信息,请参见最大的订单. |
减小最大步长 |
的值 |
求解器采取足够小的步骤来解决过零问题。然而,减小步长会增加仿真时间,在使用自适应算法时很少需要。 |
模拟器如何错过过零事件
弹跳和双弹跳模型,在弹跳球的模拟而且双弹球:使用自适应过零定位表明关于不连续(抖振)的高频波动可以导致模拟过早停止。
如果求解器的误差容限太大,求解器也有可能完全错过零交叉。这是可能的,因为过零检测技术检查信号的值是否在一个主要的时间步长之后改变了符号。符号的变化表明已经发生过零,过零算法搜索精确的过零时间。但是,如果在一个时间步内发生了零交叉,但是在步骤的开始和结束处的值并不表示符号变化,那么求解器就会跳过该交叉而不检测到它。
下图显示了一个过零的信号。在第一个实例中,积分器逐步跳过事件,因为符号在时间步之间没有改变。在第二种情况下,求解器检测符号变化,因此检测过零事件。
考虑弹跳模型的双积分器实现。
使用求解器分析器对模拟的最后0.5秒进行分析表明,模拟在点检测到44个过零事件比较为零块和22个事件的输出位置块。
的值增加相对宽容参数1)依照
而不是默认值1 e - 3
.您可以在解算器的细节部分的解算器窗格中配置参数对话框或使用set_param
指定RelTol
作为“1飞行”
.
用求解器的新相对公差分析模拟的最后0.5 s表明,它只检测到24个过零事件比较为零块和12个事件的输出位置块。
区块过零检测
一个块可以注册一组过零变量,每个过零变量都是一个状态变量的函数,状态变量可以具有不连续性。当相应的不连续发生时,过零函数从正的或负的值穿过零。注册的过零变量在每个模拟步骤结束时更新,任何改变符号的变量都被识别为有过零事件。
如果检测到任何过零,Simulink软件就会在每个改变符号的变量的上一个值和当前值之间进行插值,以估计过零的次数,即不连续点。
请注意
零交叉检测算法可以只对数据类型的信号进行零交叉事件的托起双
.
登记过零的街区
下表列出了注册零交叉点的块,并解释了这些块如何使用零交叉点。
块 | 零交叉检测数 |
---|---|
第一,检测输入信号何时在上升或下降方向过零。 |
|
两个,一个用于检测何时使用上阈值,一个用于检测何时使用下阈值。 |
|
第一,检测信号何时等于常数。 |
|
第一,检测信号何时等于零。 |
|
两个,一个检测何时进入死区(输入信号减去下限),一个检测何时退出死区(输入信号减去上限)。 |
|
第一,如果一个Enable端口在子系统块内部,它提供了检测零交叉的能力。的细节,使用启用子系统. |
|
一是检测输入信号何时在上升或下降方向上出现不连续 |
|
一是检测输入信号何时在上升或下降方向上出现不连续 |
|
一个或两个。如果没有输出端口,当输入信号达到阈值时,只有一次过零检测。如果有一个输出端口,则使用第二个零交叉将输出从1带回0,以创建一个类似脉冲的输出。 |
|
第一,检测If条件是否满足。 |
|
如果复位端口存在,则检测复位发生的时间。 如果输出是有限的,有三个零交叉点:一个用于检测何时达到饱和上限,一个用于检测何时达到饱和下限,一个用于检测何时剩下饱和。 |
|
第一,对于输出向量的每个元素,检测输入信号何时是新的最小值或最大值。 |
|
第一,检测指定的关系何时为真。 |
|
一,如果继电器是关闭的,检测开关点。如果继电器打开,检测开关点。 |
|
两个,一个检测何时达到或离开上限,另一个检测何时达到或离开下限。 |
|
五、二、检测时的状态x达到上限或下限时,检测两种状态dx/dt达到上限或下限,并检测状态何时离开饱和。 |
|
第一,检测输入何时过零。 |
|
一是检测输入信号何时在上升或下降方向上出现不连续 |
|
一、检测步进时间。 |
|
第一,检测切换条件何时发生。 |
|
第一,检测什么时候case条件被满足。 |
|
第一,如果一个触发器端口在一个子系统块内部,它提供了检测零交叉的能力。有关详细信息,请参见使用触发子系统. |
|
两个,一个用于启动端口,一个用于触发端口。更多细节,请参阅:使用启用的和触发的子系统 |
|
一是检测输入信号何时在上升或下降方向上出现不连续。 |
请注意
状态流也可以使用过零检测®使用连续时间模式的图表。看到为连续时间模拟配置状态流程图(Stateflow)为更多的信息。
实现示例:饱和块
注册零交叉的Simulink块的一个例子是饱和。过零检测识别饱和块中的这些状态事件:
输入信号达到上限。
输入信号超出上限值。
输入信号达到下限。
输入信号离开下限。
定义它们自己的状态事件的Simulink块被认为具有内在的零交叉.使用Hit Crossing块来接收过零事件的显式通知。看到登记过零的街区用于包含零交叉点的块列表。
状态事件的检测依赖于内部过零信号的构造。框图无法访问此信号。对于饱和块,用于检测零交叉的上限的信号为zcSignal = UpperLimit
-u
,在那里u
是输入信号。
过零信号有一个方向属性,它可以有以下值:
不断上升的-过零发生在信号上升到零或过零时,或者信号离开零变为正时。
下降—过零发生在信号降至零或过零时,或者信号离开零变为负时。
要么-如果出现上升或下降情况,则发生过零。
为饱和块上限,过零方向为要么.这样就可以使用相同的过零信号来检测进入和离开饱和事件。