模拟使用Yampa进行弹簧/阻尼系统

10

我想使用Yampa进行一些基本的系统模拟,就像我在Simulink中所做的那样。在这种情况下,我想模拟一个弹簧和阻尼器系统,由这个Simulink教程介绍。我编写了以下信号函数来表示该系统:

system = time >>> force >>> displacement

force = constant (m * g)

displacement = feedback (-) (velocity >>> integral) (gain $ k / m) 0
velocity     = feedback (-) integral                (gain $ c / m) 0

feedback函数创建一个基本反馈循环,实现方法如下:

feedback op a b b0 = loopPre b0 inner
    where inner = arr (uncurry op) >>> a >>> (identity &&& b)

哦,还有:

gain x = arr (*x)

使用合理的正常数,我得到了一个极度不稳定的系统:

位移/时间图

在构建反馈环路或应用积分方面是否存在明显的错误?

1个回答

7

integral更改为imIntegral 0

displacement = feedback (-) (velocity >>> imIntegral 0) (gain $ k / m) 0
velocity     = feedback (-) (imIntegral 0)            (gain $ c / m) 0

来自spring.hs:

Yampa

使用Simulink:

Simulink

積分函数中发生了一些有趣的事情,将其更改为imIntegral 0可以得到与Matlab相同的曲线。

我猜测Integral被延迟了一个样本,因为它没有起始值,从而改变了循环的行为。


非常好,非常感谢!我已经使用integral进行了一些简单的测试,所以我认为这不是问题。你所说的“比例有误”,是指水平轴吗?我的代码没有绘制时间,只是每个数据点的数量。 - Daniel Buckmaster
算了,别在意那个。当我比较Matlab和Simulink时,我发现有些东西偏差了,导致y轴的差异。 - MdxBhmt
1
在Simulink中添加传输延迟会使系统不稳定,就像您发现的那样,所以这一定是原因。 - MdxBhmt
1
当然。尝试模拟一个只有 time >>> integral >>> integral 的系统。前几个样本为0,因为积分器需要预热。我从未想过这么小的延迟足以破坏系统的稳定性。 - Daniel Buckmaster
1
没错!因为在反馈回路中添加了传输延迟,你的系统中增加了很多相位,这类似于随意移动极点。编辑:是的,我刚模拟了一下那段代码,结果显示每个积分器都有2个样本的延迟。 - MdxBhmt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接