Dan*_*ter 10 haskell physics frp yampa
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
当feedback
函数创建一个基本的反馈回路,并像这样实现的:
feedback op a b b0 = loopPre b0 inner
where inner = arr (uncurry op) >>> a >>> (identity &&& b)
Run Code Online (Sandbox Code Playgroud)
哦,并且:
gain x = arr (*x)
Run Code Online (Sandbox Code Playgroud)
有了明显的正常数,我得到了一个非常不稳定的系统:
在我构建反馈循环或应用集成的方式中是否存在明显错误?
更改integral
到imIntegral 0
displacement = feedback (-) (velocity >>> imIntegral 0) (gain $ k / m) 0
velocity = feedback (-) (imIntegral 0) (gain $ c / m) 0
Run Code Online (Sandbox Code Playgroud)
从spring.hs:
使用Simulink:
在积分函数中发生了一些有趣的事情,改变为imIntegral 0
给出与matlab相同的曲线.
我的猜测是Integral
延迟了一个样本,因为它没有起始值,改变了循环的行为.