Моделирование системы spring/демпфера в Ямпе
Я пытаюсь использовать Ямпу для какой-то базовой симуляции системы, как в Симулинке. В этом случае я хочу имитировать систему spring и демпфера, представленную этим учебным пособием по 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)
Oh и:
gain x = arr (*x)
С разумными положительными константами я получаю дико неустойчивую систему:
![plot of displacement/time]()
Есть ли что-то явно неправильное в том, как я создаю контуры обратной связи или применяю интеграцию?
Ответы
Ответ 1
Измените 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
дает ту же кривую, что и в матлабе.
Я предполагаю, что integral
задерживается одним образцом, так как он не имеет начального значения, изменяя поведение цикла.