Интересная проблема. То, что вы просите за это стабилизация следующей линейной системы с дискретным временем:
| 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)
.
ФАКТОР должен быть между 0 и 1. – abc
Какой тип 'x'? В любом случае числа плавающей точки могут быть недостаточно точными. Кстати, ваш код «x = x-x * f', который совпадает с« x = (1-f) x'. Это немного назад определение «Фактор». – Kobi
В контексте, можете ли вы запрограммировать? У вас есть переменные (если да, то можно определить, когда значение изменено)? Если '0,5' займет половину времени, чем' 1', чтобы достичь нуля или даже времени? – Kobi