主要内容

讨论二阶导数过零检测

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

金宝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. 方框图出现后,设置>过零选项>算法参数中的解算器窗格中的Model配置参数非适应.设置模型停止时间为20秒。可以在Simulink工具条或金宝app解算器模型配置参数的窗格。

  3. 模拟模型。

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

仔细检查模拟的最后一部分,你会发现速度徘徊在零以上。

改变模拟停止时间到25秒,模拟模型。由于在Compare to Zero和Position块上有过多的连续过零事件,模拟停止并出现错误。

金宝appSimulink将停止模型'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秒。

改变>过零选项>算法参数中的解算器窗格中的Model配置参数自适应并再次模拟模型25秒。

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

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

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

防止过多过零点

使用下表来防止模型中过多的过零误差。

变化类型 变化的过程 好处

增加允许的零交叉次数

的值增加连续过零的次数.选项解算器窗格中的配置参数。

这可能会给你的模型足够的时间来解决零点交叉。

放松信号阈值

选择自适应算法拉下并增加值信号阈值选项解算器窗格中的配置参数。

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

使用自适应算法

选择自适应算法的下拉菜单。解算器窗格中的配置参数。

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

禁用特定块的过零检测

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

  2. 选择使用本地设置讨论二阶导数过零控制下拉解算器窗格中的“配置参数”对话框。

局部禁用过零检测可防止特定块因为过多的连续过零而停止模拟。所有其他块继续受益于越零检测提供的提高精度。

禁用整个模型的过零检测

选择禁用所有讨论二阶导数过零控制下拉解算器窗格中的“配置参数”对话框。

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

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

属性中选择一个值最大的订单下拉解算器窗格中的“配置参数”对话框。

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

减小最大步长

属性的值最大步长选项解算器窗格中的“配置参数”对话框。

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

模拟器如何错过过零事件

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

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

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

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

使用Solver Profiler对模拟的最后0.5秒进行分析,显示模拟在点处检测到44个过零事件与零比较块和22个事件的输出位置块。

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

用求解器的新相对公差分析模拟的最后0.5 s表明,它仅检测到24个零交叉事件与零比较块和12个事件的输出位置块。

块中过零检测

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

如果检测到任何过零点,Simulink软件将在每个变量的先前值和当前值之间进行插金宝app值,以估计过零点的次数,即不连续点。

请注意

过零检测算法只对数据类型的信号支持过零事件

注册零交叉的块

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

零交叉检测数

腹肌

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

强烈反对

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

与常量比较

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

与零比较

第一,检测信号什么时候等于零。

死区

两个,一个用于检测何时进入死区(输入信号减去下限),一个用于检测何时退出死区(输入信号减去上限)。

启用

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

从文件

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

从工作空间

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

打穿越

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

如果

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

积分器

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

如果输出受限,则有三个零交叉:一个用于检测何时达到饱和上限,一个用于检测何时达到饱和下限,一个用于检测何时剩余饱和。

极大极小

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

关系操作符

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

继电器

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

饱和

两个,一个用于检测何时达到上限或超出上限,一个用于检测何时达到下限或超出下限。

二阶积分器

五,二侦测状态x达到上限或下限时,两种状态进行检测dx/dt达到上限或下限,并检测状态何时离开饱和。

标志

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

信号编辑器

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

一步

第一,检测步长。

开关

一、检测开关条件何时发生。

开关情况

一是检测情况条件是否满足。

触发

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

启用和触发子系统

两个,一个用于启动端口,一个用于触发端口。详情请参见:使用启用和触发的子系统

请注意

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

实现示例:饱和块

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

  • 输入信号达到上限。

  • 输入信号超出上限。

  • 输入信号达到下限。

  • 输入信号离开下限。

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

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

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

  • 不断上升的-过零发生在信号上升到零或经过零,或者信号离开零变成正数时。

  • 下降-过零发生在信号降至零或过零时,或者信号离开零并变为负值时。

  • 要么-如果出现上升或下降条件,就会发生过零。

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

相关的话题