在 Yampa 中模拟弹簧/阻尼器系统

Posted

技术标签:

【中文标题】在 Yampa 中模拟弹簧/阻尼器系统【英文标题】:Simulating a spring/damper system in Yampa 【发布时间】:2013-10-27 23:31:06 【问题描述】:

我正在尝试使用 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)

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

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

【问题讨论】:

【参考方案1】:

integral 更改为imIntegral 0

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

来自 spring.hs:

使用 Simulink:

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

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

【讨论】:

太好了,非常感谢!我用integral 做了一些简单的测试,所以我认为这不是问题。 “比例关闭”是指水平轴吗?我的代码没有绘制时间,只是每个数据点的#。 该死,没关系,当我比较 matlab 和 simulink 时,我发现了一些在 y 尺度上产生差异的东西。 在 simulink 中添加传输延迟会使系统不稳定,类似于您发现的系统,所以一定是这样。 哦,当然。尝试模拟一个只有time >>> integral >>> integral 的系统。在积分器预热时,前几个样本为 0。没想到小小的延迟就足以破坏系统的稳定性。 是的!由于您在反馈回路中添加了传输延迟,因此您在系统中添加了很多相位,这类似于将极点扔到周围。编辑:是的,只是模拟了该代码,它显示了 2 个样本延迟,每个积分器一个。

以上是关于在 Yampa 中模拟弹簧/阻尼器系统的主要内容,如果未能解决你的问题,请参考以下文章

matlab simulink 单气室油气弹簧阻尼特性分析

尺寸检查器的自动调整大小掩码中的支柱和弹簧似乎在 iOS5 模拟器中不起作用 [关闭]

网页里那种鼠标移上去会出现弹簧的阻尼效果是怎么做出来的?不要用flash做,用js或css3

MCK矩阵三质量-弹簧系统受激振力

网格弹簧质点系统模拟(Spring-Mass System by Fast Method)

webots自学笔记弹簧与阻尼添加