查看: 108|回复: 1|关注: 0
打印 上一主题 下一主题

[已解决] 代数环(algebraic loop)是什么?在 Simulink 中如何解决?

[复制链接]

1

主题

2

帖子

0

最佳答案
跳转到指定楼层
1#
发表于 4?天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代数环(algebraic loop)是什么?在 Simulink 中如何解决?

1

主题

2

帖子

0

最佳答案
2#
?楼主| 发表于 4?天前 | 只看该作者
关于代数环的说明,请参考帮助文档:
https://www.mathworks.cn/help/simulink/ug/simulating-dynamic-systems.html

一般而言,当具有直接馈通(direct feedthrough)特性的模块,输入由模块自身的输出直接提供,或经过其他具有直接馈通特性的模块后再提供时,就会发生代数环,并可能产生报错。

代数环很难用数学方法去解决。Simulink 提供了代数环的求解器,可以处理一些代数环。例如图中的模型,所有模块都是直接馈通的,且模块的输入由自身输出提供,形成了代数环。


此时,模块的数学方程为:
  1. y(t) = u(t) - y(t)
复制代码

可见,当模块计算输出时,需要用到输入,而输入却是自身的输出(尚未计算)。此时,Simulink 会通过迭代计算模块的输出,并获得正确的结果:
  1. y(t) = u(t) / 2
复制代码

有时这种迭代计算会非常复杂,但原则是相同的。然而这种内置的求解器,并不能求解所有的代数环。

当检测到代数环时,您有两个选项:保持代数环,或者消除代数环。如果模型的执行速度尚可(可以承受迭代求解代数环造成的计算负担),则可以选择保持代数环。否则,请选择(通过修改模型)消除代数环。

方法之一是使用初始条件块或代数约束块,参考之前的文档,来帮助代数环的计算。然而,在有些情况下,这种方法并不奏效。此时,则需要修改模型来打断代数环。

在许多情况下,解决代数环的方法是对系统进行重新建模。在某些情况下,向系统顶层添加小延迟(离散延迟块或连续延迟模块)可能会消除代数环。但是,在某些情况下,这会增加不必要的动态过程,从而影响结果。

如果您的代数环涉及积分器(integrator),且积分器的重置信号或初始信号由自身输出提供,请修改 StatePort 选项。您可以在积分器的说明文档下找到有关此状态端口的详细信息。

更多信息请参考:


答案来源:
https://ww2.mathworks.cn/matlabcentral/answers/95310-what-are-algebraic-loops-in-simulink-and-how-do-i-solve-them
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表