Интересная проблема.
Вы запрашиваете стабилизацию следующей линейной системы с дискретным временем:
| x(t+1)| = | 1 dt | | x(t)| + | 0 | u(t)
|xspeed(t+1)| | 0 1 | |xspeed(t)| | 1 |
, где dt
- время выборки, а u(t)
- количество, которое вы addToXspeed()
. (Кроме того, система подвержена случайным помехам в первой переменной x
, которые я не показываю в приведенном выше уравнении.) Теперь, если вы «установите управляющий вход равным линейной обратной связи состояния», то есть
u(t) = [a b] | x(t)| = a*x(t) + b*xspeed(t)
|xspeed(t)|
тогда «замкнутая» система становится
| x(t+1)| = | 1 dt | | x(t)|
|xspeed(t+1)| | a b+1 | |xspeed(t)|
Теперь, чтобы получить «асимптотическую устойчивость» системы, мы оговариваем, что собственные значения матрицы с замкнутым контуром помещаются «внутри сложной единичной окружности», и мы делаем это путем настройки a
и b
. Мы помещаем собственные значения, скажем, в 0,5.
Поэтому характеристический полином матрицы с обратной связью, который равен
(s - 1)(s - (b+1)) - a*dt = s^2 -(2+b)*s + (b+1-a*dt)
должно равняться
(s - 0.5)^2 = s^2 - s + 0.25
Этого легко достичь, если мы выберем
b = -1 a = -0.25/dt
или
u(t) = a*x(t) + b*xspeed(t) = -(0.25/dt)*x(t) - xspeed(t)
addToXspeed(u(t))
что более или менее соответствует вашему собственному ответу
targetxspeed = -x * FACTOR;
addToXspeed(targetxspeed - xspeed);
где, если нас просят поместить собственные значения в 0,5, мы должны установить FACTOR = (0.25/dt)
.