过零检测通常指一种电子信号处理和分析的技术,主要用于检测信号穿过零电平(零点)的瞬间。这种技术在多个领域都有重要应用,包括电子工程、信号处理、通信系统和音频处理等。

在Simulink中,过零检测(Zero Crossing Detection) 是一种用于提高求解器的仿真精度和稳定性的功能。

变步长求解器通过动态调整时间步长,能够在变量变化缓慢时增加步长,变化迅速时减小。然而在不连续点附近,求解器步长会大幅减小,使仿真时间过长。过零检测通过定位不连续性,可以准确确定过零时间,避免在这些点使用过小的时间步,从而提高求解效率。

过零检测

一个常见的过零检测例子是使用开关控制电路。假设有一个正弦波信号作为控制输入,信号超过零时开关闭合,低于零时开关断开。过零检测可以帮助仿真精确捕捉信号通过零点的时刻,从而准确模拟开关的切换行为。如果没有过零检测,仿真可能无法准确捕捉开关的开关时刻,导致电路行为不正确或不稳定。

变步长求解器过零检测算法

Simulink 使用了两种过零检测算法,其原理与特点为:

  1. 非自适应算法
  • 是为了与旧版本的 Simulink 保持兼容而提供的默认算法。
  • 其原理是通过对过零事件进行区间封闭,并使用越来越小的时间步长来精确确定过零事件发生的时刻。
  • 适用于大部分系统的仿真,但当系统存在高度“抖动”(在过零点周围的高频振荡)时,非自适应算法可能会导致非常长的仿真时间。
  1. 自适应算法
  • 其原理是动态地对过零事件进行区间封闭或开放。
  • 适用于存在大量“抖动”的系统。
  • 可以指定一个容差区间,并在该区间周围检测过零事件,其原理如下图所示,通过信号阈值设置零交叉点周围的容差区间,在该区间内的信号被视为为零。

容差区间

需要注意的是,自适应算法会在以下任一条件满足时关闭零交叉区间封闭(停止迭代):

  • 过零误差超过阈值:阈值通过在配置参数界面中的信号阈值(Signal threshold) 选项来确定。也可以使用 ZCThreshold参数设置。默认值为 Auto,但可设置为任何大于零的实数。
  • 超过预设的连续过零点数:过零点数通过在配置参数界面中指定连续过零点数(Number of consecutive zero crossings) 选项来确定。也可以使用 MaxConsecutiveZCs参数设置。增加信号阈值会增加将执行的时间步之间的距离,这通常会加快仿真的速度,但可能会降低求解精度。

过零检测设置

变步长过零检测算法的区别

这里以官方的弹球仿真作为案例,该案例模拟了一自由落体的弹性小球的运动状态,小球一次次与地面碰撞反弹的过程中会损失能量,使得每次反弹的高度越来越小,球与地面发生碰撞的时间间隔也越来越短,直到静止。

小球初始状态

其动态特性方程为:

dvdt=−gdxdt=v \begin{aligned}&\frac{dv}{dt}=-g\\&\frac{dx}{dt}=v\end{aligned} dtdv=gdtdx=v

其中,ggg是重力加速度,x(t)x(t)x(t)是球的位置,v(t)v(t)v(t)是速度。

模型如图所示:

小球模型

求解器与过零参数设置如图所示,使用变步长求解器,非自适应过零检测算法,连续过零点数为1000。

求解设置

将仿真时间设置为20s,求解可以正常进行,运行仿真后查看其位移与速度结果。可以看到小球的位移振幅越来越小,频率越来越高。

0~20s 仿真结果

通过观察下图所示的数据,可以看到在仿真的最后阶段,小球与地面发生碰撞的时间间隔越来越短,其速度的绝对值也越来越小,意味着小球速度在零附近的振荡越来越频繁。

19~20s 仿真结果

将仿真时间设置为25s,求解将无法进行下去,错误原因是由于Compare To ZeroPosition模块在20s以后连续发生过多的过零事件,超过了预设的1000次。

错误信息

结合上图对仿真19s~20s结果的分析可知,小球在其运动的最后阶段,速度在零附近的振荡频率越来越高,过零检测的触发越来越频繁,最终在20.35s处的过零次数超过了预设次数,触发了报错。

要解决上述问题,一味的增加连续过零点数是不可取的,例如我们将连续过零点数增至100000,依旧不能使求解进行下去。

前文提到,非自适应算法不适用于存在大量“抖动”的系统,而自适应算法会设置一个容差区间,忽略区间内的过零事件,从而提高对这类系统的求解效率。

将过零检测算法设置为自适应算法重新仿真,可以看到求解可以顺利进行且只触发了2次过零检测,这是由于自适应算法下过零检测只会检测速度幅值小于设定容差(0.001)的过零事件。

调整过零点数后依旧报错

通过数据图可以看到小球在20s后的振动几乎为零。

自适应算法过零次数

仔细观察20s~25s的仿真结果,可以看到小球并未停止振动,而是维持了极小幅度的振动,其速度依旧在不停地在0附近振荡,但由于使用了自适应算法,系统会忽略小于设定容差的过零事件,因此不会触发过零检测。

容差区间

综上所述,非自适应算法与自适应算法的区别可概况为:

  • 非自适应算法:始终精确定位过零点,适用于简单、低频的过零系统,但可能导致仿真时间增加。
  • 自适应算法:通过动态调整定位过程,更适合处理高频抖动和复杂系统,能够在精度与仿真效率之间找到平衡,通常优于非自适应算法。

过零检测对仿真速度的影响

通过上述对过零检测的介绍,可能会产生一个疑问:既然过零检测功能的目的是为了提高求解器在过零点附近的求解效率,从而降低仿真用时,为什么有时过零检测反而会导致仿真时间的增加?

实际上,过零检测对仿真速度的影响取决于具体情况,增加还是减少仿真时长,关键在于是否有不连续事件过零点的处理方式

1. 增加仿真时长的情况

  • 不连续点频繁出现:系统中存在大量过零点(高频零交叉事件)。
  • 使用非自适应算法:在过零点附近,非自适应过零检测会不断缩小时间步长,反复迭代,增加计算量,导致仿真时间显著增加,甚至会导致仿真“停滞”。
  • 高精度求解需求:过零检测试图精确捕捉零点,导致更多计算步骤,尤其在信号抖动时更加明显。

2. 减少仿真时长的情况

  • 定位不连续性:过零检测能够准确识别零交叉点,帮助变步长求解器避免在不连续点附近使用过小的时间步,从而提高计算效率。
  • 减少误差:如果不使用过零检测,求解器可能错过不连续点,导致仿真误差过大,需要整体缩小步长来提高精度,反而增加仿真时长。

总结一下:

过零检测对仿真时长的影响并非固定,需根据模型的具体特性进行调整。

如果系统中过零点较少且不连续性易于捕捉,过零检测可以减少仿真时长

如果系统中过零点频繁(如带抖动的信号或高频开关),过零检测可能会增加仿真时长,尤其是使用非自适应算法时。

因此,合理选择过零检测算法(自适应算法 vs 非自适应算法)和调整阈值参数可以在精度与效率之间找到平衡。

定步长求解器的过零检测

上文对过零检测的讨论均使用基于变步长求解器这个前提,那么定步长求解器有没有可能使用过零检测呢?

定步长过零检测

过零检测原本仅应用于变步长求解器,直到MATLAB R2022a版开始支持定步长求解器的过零检测。

对于定步长求解器而言,具有连续状态和不连续信号的模型可能需要较小的固定步长才能在不连续点附近获得准确的仿真结果。启用固定步长过零检测后,Simulink 可以自动检测和定位不连续性并纠正模型中的连续状态,允许使用更大的步长并实现更快的仿真时间,而不会影响仿真精度。

定步长过零检测特别适用于:

  • 连续状态。
  • 存在由具有连续采样时间的信号驱动的过零模块。
  • 存在频繁切换或其他限制求解器步长的事件。

定步长过零检测设置

定步长过零检测的设置方法如图所示,当在启用了过零检测的仿真中检测到不连续性或过零时,求解器会尝试通过迭代过程确定发生过零的时间,迭代过程通过下述两个参数来控制:

  1. 围捕迭代的最大次数(Maximum number of bracketing iterations): 指定求解器为定位过零时间而执行的最大迭代次数。
  2. 每一步的最大过零点数(Maximum number of zero-crossings per step): 指定求解器尝试在单个模拟时间步长内定位的最大零交叉数

定步长过零检测案例

图示是一个可用于生成锯齿波的自复位积分器,其中每次达到 1 时,状态都会重置为 1/3。

仿真模型

这里使用变步长求解器ode45的仿真结果作为基准,仿真结果为:

变步长求解器基准结果

使用定步长求解器ode3,步长0.1s,不开启过零检测:

定步长求解器,步长0.1s,关闭过零检测

可以看到使用0.1s的步长,仿真结果不是很准确。为了提高求解精度,需要减小固定步长,可以看到当步长取0.01s时,仿真结果的精度明显提高:

定步长求解器,步长0.01s,关闭过零检测

现在开启定步长求解器的过零检测(使用默认参数),依旧使用0.1s的步长,可以看到开启过零检测(ZC On)后求解精度得到了提高。

定步长求解器,步长0.1s,开启过零检测

以上案例说明,定步长求解器在启用过零检测后,会提高当前步长下的求解精度。同时意味着要达到相同求解精度可以使用更大的时间步长,变相的提高了求解速度,降低仿真时间。

总结

本文介绍了Simulink的过零检测功能,及其对仿真精度和效率的影响。

其实许多仿真软件在处理非连续性状态切换问题时,都有类似于过零检测的功能,虽然不同软件的术语和实现方法有所不同,但核心目标都是:

  • 准确捕捉状态改变的时刻,确保仿真精度。
  • 避免数值误差,提高求解器的稳定性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐