主要内容

讨论二阶导数过零检测

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

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

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

演示过零检测的效果

这个例子提供了三个模型来说明零交叉行为:example_bounce_two_integratorsexample_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求解时,考虑调整数值微分公式的顺序

中选择一个值最大的订单拉下解算器对话框中的。

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

减小最大步长

的值马克斯步长选择在解算器对话框中的。

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

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

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

如果解算器的误差公差太大,解算器也可能完全错过零交叉。这是可能的,因为过零检测技术检查信号的值是否在一个主要的时间步后改变了符号。符号变化表示发生了过零,过零算法搜索精确的过零时间。但是,如果在一个时间步长内发生了零交叉,但该步长开始和结束时的值没有指示符号变化,则求解器将在不检测到它的情况下跳过该交叉。

下图显示了一个过零的信号。在第一个例子中,积分器跨越事件,因为符号在时间步间没有改变。在第二种情况下,求解器检测符号变化,从而检测过零事件。

考虑bounce模型的双积分器实现。

使用Solver Profiler对模拟的最后0.5秒进行分析表明,该模拟在比较为零块的输出和22个事件位置块。

增加价值相对宽容参数1)依照而不是默认的1 e - 3.中可以修改此参数解算器的细节部分的解算器窗格中配置参数对话框或使用set_param指定RelTol作为“1飞行”

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

区块过零检测

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

如果检测到任何零交叉,Simulink软件将在每个改变符号的变量的先前值和当前值金宝app之间插入,以估计零交叉的时间,即不连续。

请注意

过零检测算法只能对数据类型的信号使用过零事件

禁止零交叉路口

下表列出了注册零交叉的块,并解释了块如何使用零交叉。

零交叉检测数

腹肌

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

强烈反对

二,一个检测上门限是否被占用,一个检测下门限是否被占用。

比较恒定的

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

比较为零

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

死区

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

启用

第一,如果启用端口在子系统块中,它提供检测零交叉的能力。的细节,使用启用子系统

从文件

一是检测输入信号在上升或下降方向上是否有不连续

从工作空间

一是检测输入信号在上升或下降方向上是否有不连续

打穿越

一个或两个。如果没有输出端口,当输入信号达到阈值时,只有一个过零检测。如果有一个输出端口,第二个过零将用于将输出从1带回0,从而创建一个类似脉冲的输出。

如果

一,检测If条件是否满足。

积分器

如果复位端口存在,则检测何时发生复位。

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

极大极小

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

关系操作符

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

继电器

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

饱和

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

二阶积分器

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

标志

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

信号编辑器

一是检测输入信号在上升或下降方向上是否有不连续

一步

一,检测步长时间。

开关

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

开关情况

一,检测case条件是否满足。

触发

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

启用和触发子系统

两个,一个用于启用端口,一个用于触发端口。更多细节,请参阅:使用启用和触发的子系统

请注意

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

实现示例:饱和度块

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

  • 输入信号达到上限。

  • 输入信号离开上限。

  • 输入信号达到下限。

  • 输入信号离开下限。

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

状态事件的检测依赖于内部过零信号的构造。这个信号在框图中是不可访问的。对于饱和度块,用于检测上限过零的信号为zcSignal = UpperLimit-u,在那里u为输入信号。

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

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

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

  • 要么-如果出现上升或下降的情况,就会出现过零。

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

相关的话题