主要内容

讨论二阶导数过零检测

变步长求解器动态调整时间步长,当变量变化缓慢时,时间步长增大,当变量变化迅速时,时间步长减小。这种行为导致求解器在不连续区域附近采取许多小步骤,因为变量在这个区域内快速变化。这提高了准确性,但可能导致过多的模拟时间。

金宝app®使用一种称为讨论二阶导数过零检测精确地定位一个不连续点,而不需要借助过小的时间步长。通常这种技术会提高模拟运行时间,但它会导致一些模拟在预期的完成时间之前停止。

金宝appSimulink为此使用了两种算法:非自适应算法和自适应算法。有关这些技术的信息,请参见过零算法

演示过零检测的效果

此示例提供了三个模型来说明过零行为:example_bounce_two_integrators,example_doublebounce,example_bounce

这个example_bounce_two_integrators模型演示了除非使用自适应算法,否则过多的零交叉会导致模拟在预期完成时间之前停止。

这个example_bounce该模型采用更好的模型设计,使用双积分器实现球的动力学,而不是example_bounce_two_integrators

这个example_doublebounce模型演示了自适应算法如何成功地解决一个具有两个不同的过零要求的复杂系统。

考虑到example_bounce_two_integrators模型它使用两个单独的积分器来计算模拟期间球的垂直速度和位置。

  1. 通过运行打开模型open_system(“example_bounce_two_integrators”)在命令行。

  2. 一旦出现框图,设置解算器详细信息>过零选项>算法中的参数解算器的模型配置参数非适应.设置模型的停止时间为20秒。您可以在Simulink工具条或金宝app解算器窗格中的模型配置参数。

  3. 模拟模型。

您现在可以查看和分析模拟结果。

在仔细检查模拟的最后一部分时,您将看到速度在零之上徘徊。

改变模拟停止时间至25秒,模拟模型。由于在比较零和位置块中过多的连续过零事件,模拟停止并产生错误。

金宝appSimulink将停止对模型'example_bounce_two_integrators'的模拟,因为下面标识的2个过零信号导致了在时间间隔20.357636989536076和20.357636990631594之间连续1000个过零事件。-------------------------------------------------------------------------------- 连续的零交叉:1000零点交叉信号名称:RelopInput块类型:RelationalOperator块路径:' example_bounce_two_integrators /比较零/比较 ' -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 连续的零交叉:500零点交叉信号名称:IntgLoLimit块类型:集成块路径:“example_bounce_two_integrators /位置 ' --------------------------------------------------------------------------------

尽管您可以通过调整模型配置参数>解算器>连续过零次数参数,做出这个改变仍然不允许模拟持续25秒。

改变解算器详细信息>过零选项>算法中的参数解算器的模型配置参数适应的并再次模拟模型25秒。

放大模拟的最后5秒,可以看到结果更完整,更接近弹跳球动力学的预期解析解。你看到的颤振量是系统状态趋近于零的结果,在数值模拟中是预期的。

这个example_bounce模型使用二阶积分器块来模拟弹跳球的动力学。这是为求解器性能建立球动力学双积分模型的首选方法。比较求解器的性能example_bounce_two_integratorsexample_bounce,尝试在两个模型上运行求解分析器。有关两个模型的详细比较,请参见仿真弹跳球

有关自适应和非自适应过零检测算法的并行比较,请参见双弹跳球:使用自适应过零位置

防止过多过零

使用下表可防止模型中出现过多的过零错误。

变化类型 变化的过程 利益

增加允许的过零次数

增加价值连续过零次数. 选择权解算器窗格中的。

这可能会给您的模型足够的时间来解决过零问题。

放松信号阈值

挑选适应的算法下拉并增加信号阈值选择在解算器窗格中的。

求解器需要更少的时间来精确定位零交叉点。这可以减少模拟时间,并消除过多的连续过零错误。然而,放松信号阈值可能会降低精度。

使用适应的算法

挑选适应的算法下拉的解算器窗格中的。

该算法动态调整过零阈值,提高了检测精度,减少了连续检测过零的次数。使用此算法,您可以选择指定两个时间的宽容信号阈值

为特定块禁用零交叉检测

  1. 清除启用过零检测勾选块参数对话框上的复选框。

  2. 挑选使用本地设置过零控制把车倒在地上解算器对话框中的。

局部禁用零交叉检测可以防止某个特定块因为连续过零而停止模拟。所有其他区块继续受益于零穿越检测提供的更高的准确性。

对整个模型禁用过零检测

挑选禁用所有过零控制把车倒在地上解算器对话框中的。

这可以防止在模型中的任何位置检测到过零。结果是,您的模型不再受益于过零检测提供的更高精度。

如果使用ode15s求解时,考虑调整数值微分公式的顺序

从列表中选择一个值最高订单把车倒在地上解算器对话框中的。

有关更多信息,请参见最高订单

减小最大步长

输入一个值作为最大步长选择在解算器对话框中的。

求解器采取足够小的步骤来解决零交叉。然而,减小步长会增加仿真时间,在使用自适应算法时很少需要减小步长。

模拟器如何错过零穿越事件

反弹和双反弹模型,在仿真弹跳球双弹跳球:使用自适应过零位置表明关于不连续(抖振)的高频波动会导致模拟提前停止。

如果求解器误差公差太大,则求解器也可以完全错过零点。这是可能的,因为零交叉检测技术检查是否在一个大时间步骤后信号的值已经改变了符号。标志更改表示发生过零交叉,零交叉算法搜索精确的交叉时间。但是,如果在时间步骤中发生零交叉,但步骤的开始和结尾处的值不表示符号改变,则求解器步步在交叉路上而不检测到它。

下图显示了一个过零的信号。在第一个实例中,积分器跳过事件,因为符号在时间步长之间没有改变。在第二种情况下,解算器检测符号变化,因此检测过零事件。

考虑反弹模型的两个积分器的实现。

使用解算器探查器对模拟的最后0.5 s进行分析表明,模拟在最后一个时间点检测到44个过零事件比较为零块的输出和22个事件位置

增加价值相对宽容参数到1)依照而不是默认的1 e - 3.中可以修改此参数解算器详细信息部分解算器窗格中配置参数对话或使用set_param指定RelTol作为'1E-2'

用求解器的新相对容错分析模拟的最后0.5秒显示,它只检测到24个过零事件比较为零块和12个事件在输出时位置

分块过零检测

块可以注册一组过零变量,每个过零变量都是具有不连续性的状态变量的函数。当出现相应的不连续性时,过零函数从正值或负值穿过零点。在每个模拟步骤结束时更新注册的过零变量,任何改变符号的变量都被标识为发生过零事件。

如果检测到任何过零点,则Si​​mulink软件在每个变量的先前和当前值之间插值金宝app,该变量改变了符号以估计零点的次数,即不连续性。

过零检测算法只能为数据类型的信号包含过零事件

禁止零交叉路口

下表列出了记录过零的块,并解释了这些块如何使用过零。

过零检测次数

防抱死制动系统

第一,检测输入信号何时在上升或下降方向过零。

反冲

两个,一个用于检测上阈值何时接合,另一个用于检测下阈值何时接合。

比较常数

第一,检测信号何时等于常数。

比较为零

一,检测信号何时等于零。

死区

二,一个检测什么时候进入死区(输入信号减去下限),一个检测什么时候退出死区(输入信号减去上限)。

使可能

一个,如果使能端口位于子系统块的内部,它提供了检测过零点的能力。有关详细信息,使用启用子系统

从文件

第一,检测输入信号在上升或下降方向上的不连续性

从工作空间

第一,检测输入信号在上升或下降方向上的不连续性

打穿越

一两个。如果没有输出端口,当输入信号达到阈值时,只有一个过零检测。如果有输出端口,则使用第二个过零将输出从1恢复到0,以创建脉冲式输出。

如果

一个,检测何时满足IF条件。

积分商

如果存在重置端口,则检测何时发生重置。

如果输出是有限的,则有三个过零点:一个检测何时达到饱和上限,一个检测何时达到饱和下限,一个检测何时剩余饱和。

最大最小值

第一,对于输出向量的每个元素,检测输入信号是新的最小值还是最大值。

关系操作符

一,检测指定的关系何时为真。

继电器

一、如果继电器关闭,检测开关点。如果继电器是开的,则检测开关点。

饱和

二,一个检测何时达到或离开上限,一个检测何时达到或离开下限。

二阶积分器

五、二要检测何时的状态x达到上限或下限时,检测两种状态dx/dt达到上限或下限,以及检测状态何时离开饱和。

标志

一,检测输入什么时候穿过零。

信号编辑器

第一,检测输入信号在上升或下降方向上的不连续性

一步

一,检测步长时间。

开关

一、检测开关状态何时发生。

开关箱

第一,检测何时满足案例条件。

触发

第一,如果一个触发端口在一个子系统块内,它提供检测零交叉的能力。有关详细信息,请参见使用触发子系统

启用和触发子系统

两个,一个用于使能端口,一个用于触发端口。有关详细信息,请参阅:使用启用和触发的子系统

过零检测也可以用于statflow®使用连续时间模式的图表。看到为连续时间模拟配置状态流程图(状态流)为更多的信息。

实现示例:饱和度块

注册零交叉的Simulink块的金宝app一个例子是饱和。过零检测识别饱和度块中的这些状态事件:

  • 输入信号达到上限。

  • 输入信号离开上限。

  • 输入信号达到下限。

  • 输入信号离开下限。

金宝app定义自己的状态事件的Simulink块被认为具有内在的零交叉使用Hit Crossing块来接收过零事件的显式通知。看到禁止零交叉路口对于包含零交叉的块列表。

状态事件的检测取决于内部过零信号的构造。方框图无法访问该信号。对于饱和块,用于检测上限过零的信号为zcSignal=上限-U,在那里U为输入信号。

过零信号有一个方向属性,可以有以下值:

  • 不断上升的—当信号升到或通过零,或当信号离开零变为正时,就会发生过零。

  • 落下—当信号降至或通过零,或当信号离开零变为负时,就会发生过零。

  • 任何一个- 如果发生上升或下降的条件,则会发生零交叉。

饱和挡块上限,方向为零路口任何一个.这使得进入和离开饱和事件可以使用相同的过零信号来检测。

相关话题