漫谈Simulink:什么是代数环?
本文内容所有内容仅代表本人观点,和Mathworks无关
在使用Simulink仿真的过程中,往往会看到关于代数环的错误提示或者警告信息。例如
Block diagram 'xxx' contains 1 algebraic loop(s). To see more details about the loops...
那么到底什么是代数环呢?
这篇文章目的就是来科普一下这个问题。为了介绍代数环,我们先来期待一下这个暑期即将上映的电影 《The Secrete Life of Pets》, 其中有一幕非常适合来解释什么是代数环。请看下图:
图中有四只可爱的狗狗,他们首尾相连,形成一个环路。
现在,我们可以把每只狗定义成为一个系统。这个系统有输入(食物)和输出(排泄物),很显然每个系统的输出会成为下一个系统的输入。
进一步的,我们假设每个系统的输入和输出是没有延时的。也就是说,在t时刻,每只狗的输入会立刻成为输出。对于这样的系统,我们称其具有Direct Feedthrough。
在这样的假设下,
第一只狗t时刻的输入 u1(t) ----> 第一只狗t时刻的输出 y1(t)
第一只狗t时刻的输出 y1(t)---> 第二只狗t时刻的输入u2(t)--> ... -> 第一只狗t时刻的输入u1(t)
现在问题来了,第一只狗t时刻的输入u1(t)到底应该是多少?这个数值不能随便定义,因为他自己会决定自己。这样的逻辑就构成了一个代数环。
这个代数环能不能解呢? 如果假设每只狗的输出都是输入的一半,我们会得到这样一个关系
u1(t) = 0.5*0.5*0.5*0.5*u1(t)
也就是说,只有u1(t) = 0解。
如果每只狗的输入都等于输出,那么这个u1(t) 可以取任何数。
如果每只狗的输入和输出都是一个非常复杂的非线性函数,那么我们就需要用数值方法来解这个非线性关系。
请注意,这只是在t时刻。一旦模型存在代数环,那么在仿真的每个时间点,我们都要进行这样复杂的代数运算, 这会大大的影响仿真的速度。另外,如果我们想把模型转换成c/c++代码用到硬件上的时候,是不允许出现有代数环的情况的。
所以,对于搭建好的模型,我们需要检查一下有没有代数环。
从MATLAB R2015b开始,有如下的功能可以方便的帮你找到系统中的代数环。
>> Simulink.BlockDiagram.getAlgebraicLoops(ModelName)
现在问题又来了: 1. 找到代数环以后该怎么处理呢?2. 图中的实线和虚线的代数环有什么区别呢?