在Yampa模拟弹簧/阻尼系统

时间:2013-10-19 01:14:17

标签: haskell physics frp yampa

我正在尝试使用Yampa进行一些基本的系统仿真,就像我在Simulink中所做的那样。在这种情况下,我想模拟由this simulink tutorial引入的弹簧和阻尼系统。我写了以下信号函数来代表系统:

system = time >>> force >>> displacement

force = constant (m * g)

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

feedback函数创建basic feedback loop的位置如下所示:

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

哦,并且:

gain x = arr (*x)

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

plot of displacement/time

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

1 个答案:

答案 0 :(得分: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被一个样本延迟,因为它没有起始值,改变了循环的行为。