Перенос дифференциального уравнения в Matlab ODE45 - была ли моя ошибка?

В течение нескольких часов я размышляю над проблемой, которую, как мне кажется, легко решить. Я просто не понимаю. В задании для Coursera (Aerial Robotics) я попросил запрограммировать контроллер PD с помощью функции ODE45 из Matlab. Целью является (только!) Вертикальная стабилизация объекта по оси z.

Дифференциальное уравнение второго порядка для этого имеет вид

u(t) = m*(zd'' + Kp*(zd-z)+Kv(zd'-z')+g)

здесь d обозначает желаемое положение, только z обозначает фактическое положение, а «или» обозначает первое o. 2-я производная. И u - результирующая сила, необходимая для удержания или получения объекта на месте.

Теперь я попытался свести это к системе уравнений первого порядка следующим образом:

zd = z1

dz1/dt = z2

dz2/dt= u(t)/m - (Kp*(zd-z)+Kv(zd'-z')+g)

z=z3

dz3/dt=z4

u=z5

dz5/dt=z6

И я думаю, что у меня есть 5 начальных переменных для zd (0), zd '(0) = z2 (0), z (0) = z3 (0), z' (0) = z4 (0) и u (0) . И цель - получить u (t).

Теперь я попробовал этот код, который, к сожалению, всегда выдает ошибку:

z0 = [s_des(1), s_des(2), s(1), s(2), u];
tlim=[t, t+.01];
[t,z]=ode45(@flight, tlim, z0);

function dzdt=flight(t,z)
    dzdt_1 = z(2);
    dzdt_2 = z(5)/m+kv*z(4)-kv*z(2)-kp*z(1)+kp*z(3)-g;
    dzdt_3 = z(4);
    dzdt_5 = z(6);
    dzdt=[dzdt_1; dzdt_2; dzdt_3; dzdt_5];
end

Здесь переменные s_des, s содержат начальные или фактические значения.

Ошибка:

Показатель превышает размеры матрицы. Ошибка контроллера / полета (строка 42) dzdt_2 = z (5) / m + kv z (4) -kv z (2) -kp z (1) + kp z (3) -g;

Может кто-нибудь помочь мне. Я пробовал меньше уравнений, но чаще всего получаю ту же ошибку или ошибку, что и эта: КОНТРОЛЛЕР / ПОЛЕТ возвращает вектор длины 5, но длина вектора начальных условий равна 6. Вектор, возвращаемый КОНТРОЛЛЕР / ПОЛЕТ, и вектор начальных условий должно иметь одинаковое количество элементов.

edit: если я изменяю центральную функцию следующим образом, я не получаю никаких ошибок, но это не работает, так как мой объект просто падает на землю ;-)

[t,z]=ode45(@flight, tlim, z0);

function dzdt=flight(t,z)
    dzdt_1 = z(2);
    dzdt_2 = z(5)/m+kv*z(4)-kv*z(2)-kp*z(1)+kp*z(3)-g;
    dzdt_3 = z(4);

    dzdt=[dzdt_1; dzdt_2; dzdt_3; 0; 0];
end

Спасибо.


person Andreas K.    schedule 27.10.2017    source источник
comment
Мне неясно, что означают zd и z? Может быть, было бы яснее, если бы вы не использовали zd в качестве имени переменной, когда dz и z также плавают вокруг   -  person Wolfie    schedule 27.10.2017
comment
да. Это может быть хорошей идеей. Но на вопрос: все с zd обозначает желаемое вертикальное положение, а все без d обозначает текущее положение ОК?   -  person Andreas K.    schedule 27.10.2017
comment
Что такое z(6)? Исходя из ваших начальных условий, похоже, что у вас всего пять состояний. Входные и выходные данные вашей функции интеграции должны иметь такую ​​же размерность, что и начальные условия.   -  person horchler    schedule 27.10.2017
comment
z (6) - это моя плодотворная попытка включить в уравнение u = z5.   -  person Andreas K.    schedule 28.10.2017


Ответы (1)


Поразмыслив и пытаясь какое-то время, я пришел к следующему решению:

tlim=[tinit, tinit+.01];

iniCond=[s_des(1)-s(1),s_des(2)-s(2), s_des(1), s_des(2)];

[tSol, eSol]=ode45(@control, tlim, iniCond);

u=kv*m*eSol(end, 2) + m*kp*eSol(end,1) + m*g 

   function derror = control(time, error)
        A=[0 1 0 0;-kp  -kv 0 0;0 0 0 1;-kp -kv 0 0];
        b=[0 0 0 u/m-g]';
        derror=A*error+b;
    end

И это имитировало вертикальное движение квадрокоптера.

person Andreas K.    schedule 29.10.2017