当前位置: 首页 > 工具软件 > Yat > 使用案例 >

“Derivative of state ‘1‘ in block ‘X/Y/Integrator‘ at time 0.55 is not finite“类问题解决办法

戴博
2023-12-01

在MATLAB的simulink仿真时有时会遇到如下报错:

Derivative of state ‘1’ in block ‘X/Y/Integrator’ at time 0.55 is not finite.

这种报错是指在某个时间点处,某个值的运算达到了无穷大(或十分接近无穷大),以至于MATLAB将其视为数学上的“无意义”,不再予以计算。

解决这类问题的办法一般是:
1)查看建模——仿真设置,将“变步长”改成“定步长”(fixed-step),并将步长设置为小于0.001;
2)在求解器选项里把“自动”改为其他的求解器予以求解。

有些情况下这种“趋于无穷”的情况是由于步长过大、运算不精细造成的,所以方法1)有时会有效。但对于方法2),只有少数情况下修改了求解器能够解决问题,但大多数情况下出现无穷数值的情况决不仅仅是通过改变求解器就能解决的。

因此本文提出一种笔者新发现的解决方法:

点击simulink报错处的蓝色字体,将会自动定位至出现无穷大值的模块处。此时:
1)仔细观察并推导该模块所代表的物理量,如果其数学公式已知,则从表达式上推理是其中哪一项造成了无穷大的值;
2)针对造成无穷大的值的该项,上溯至该项的计算模块,即看看到底是哪一个模块是计算产生该项的;
3)在该项产生之后立即添加一个saturation模块进行限幅,所限制的上下限视实际硬件决定(可以先行估计)。

由于对模块添加了限幅,因此即使该项到达了无穷值,也依然会被限幅,不会再出现趋于无穷大的情况。

但该方法有使用条件:
1)显而易见,对该值进行限幅后,必须对整个系统影响不大,因此系统必须具有一定的鲁棒性;
2)限幅上下限的确定可以和实际相结合。

PS:有时simulink报错为“计算中出现奇点”,原理依然是分母除以了一个趋近于0的值,亦即系统中存在趋近于无穷的值。依然可以采用本文的方法解决。

此种方法的实际意义:在系统实际运行中,数学上有可能计算出无穷大的值,但由于实际硬件限制,往往存在限幅现象,因此实际上该限幅具有实际意义,能较好地反应实际硬件限制下的系统鲁棒性。

 类似资料: