Моделирование системы 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 задерживается одним образцом, так как он не имеет начального значения, изменяя поведение цикла.