Simulink代数环
我有次碰到一个问题,Simulink报告“Cannot solve algebraic loops...”
Simulink可以求解代数环,但是这常常会降低仿真速度。所以,algebraicloop diagnostic可以设置为Error、Warning或者是None。在这里,设置为Warning,所以模型就会报告错误,不进行仿真计算。
什么是代数环?
当方程两边都出现同一个变量时,即产生了代数环。如:
当Simulink中存在非模型延迟时,通常会产生代数环。比如,传感器将输出信号反馈到输入端。
读取错误消息
调试错误的第一步就是阅读和理解错误信息。代数环的产生源于不同情况,要弄清楚错误产生原因则应该理解错误信息。
Cannot solve algebraic loop involving 'model/.../Sensor System'because it consists of blocks that cannot be assigned algebraicvariables, i.e., blocks with discrete-valued outputs, blocks withnon-double or complex outputs, Stateflow blocks, or non virtualsubsystems.
【不能求解存在于'model/.../SensorSystem'的代数环,因为它包含了不能指定代数变量的模块,比如,有离散输出的模块、有非double或复数输出的模块、Stateflow模块、无效子系统。】
分析这段话,我们可以知道Simulink不能求解代数环,除非它可以给代数变量赋值。不能指定代数变量的模块将会在错误信息中列出。
Ø 离散值输出,比如logic模块[0 或 1]
Ø 有non-double输出的模块
Ø 输出复数(3+2i)的模块
Ø Stateflow 模块
Ø 无效子系统
分析错误信息与模型的练习
首先,可以看到所有的信号类型为uint8。它们属于non-double类型,所以这是原因之一。另外注意子系统的阴影,则表示它是一个atomic子系统。atomic子系统是无效子系统,它也是引起问题的模块之一。
可能的解决办法
因为存在atomic 子系统,所以建议将优化项Minimizealgebraic loop occurrences 勾选上。
子系统可以看成为输入变量和状态变量的函数
在一些系统中,输出信号的计算并不直接利用输入信号。这时,就可以将系统方程分为两步:
这个选项也可以在configuration parameters ->modelreference blocks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
消除代数环的方法可参照:《数字计算机仿真中消除代数环问题的研究》,邱杰,原巍兰。