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)

有了合理的正常数,我得到了一个非常不稳定的系统:

位移/时间图

我构建反馈循环或应用集成的方式是否存在明显错误?

4

1 回答 1

7

更改integralimIntegral 0

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

来自 spring.hs:

扬帕

使用 Simulink:

Simulink

积分函数中发生了一些有趣的事情,变为imIntegral 0给出与 matlab 中相同的曲线。

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

于 2013-10-20T19:40:08.230 回答