Matlab simulink 代数环问题


问题描述

最近在仿真中遇到报错,提示存在代数环

无法求解涉及 'Unknown_Extrinsic_Parameters/Subsystem2/vel_controller/v,w' 的代数环,因为它包含不能向其分配代数变量的模块,例如具有离散值输出的模块、具有非双精度或复数输出的模块、Stateflow 模块或非虚拟子系统。请考虑打破代数环。例如,向代数环中添加一个 Delay 或 Memory 模块。要查看有关代数环的更多详细信息,请使用命令 Simulink.BlockDiagram.getAlgebraicLoops(bdroot)


原因分析:

代数环的概念:代数环概念 - MATLAB & Simulink - MathWorks 中国

简而言之:当模块计算输出时,需要用到输入,而输入却是自身的输出(尚未计算)。此时,Simulink 会通过迭代计算模块的输出,并获得正确的结果。

例如:

t=0.时计算y(0)需要y(0)和u(0),但是很显然y(0)此时没有值,因此程序自然会报错。


解决方案:

经过广泛查阅得知有以下几种解决方案:

参考:代数环(algebraic loop)是什么?在 Simulink 中如何解决? – MATLAB中文论坛 (ilovematlab.cn)

如何解决simulink中的代数环问题 – MATLAB中文论坛 (ilovematlab.cn)

1,修改、重新建模模型,通过数学变换,使得避免出现代数环。(未尝试,仿真模型过于复杂难以修改)

2,增加延时环节,simulink中有delay与memory两个模块可以实现此功能。但是有人建议不要用memory打破代数环()

Why you should never break a continuous algebraic loop with a Memory block » Guy on Simulink - MATLAB & Simulink (mathworks.com)

3,给定变量初始值。如上述例子所说,只要有了y(0)的初始值,那么程序正常计算,打破代数环。使用IC模块,或者有积分环节时指定积分起始值也可以。

IC:设置信号的初始值 - Simulink - MathWorks 中国