微分方程转移到Matlab ODE45 - 是我的错误吗?

时间:2017-10-27 15:41:29

标签: matlab ode differential-equations feedback

几个小时后,我思考一个我认为很容易解决的问题。我只是得不到。 在Coursera(Aerial Robotics)的作业中,我要求使用matlab的ODE45函数对PD控制器进行编程。目标是(仅!)物体沿z轴的垂直稳定。

二阶的差分补偿是

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

这里d停留在所需的位置,z单独代表实际位置和'或者''代表第一个o。二阶导数。 而且你需要保持或得到它应该存在的对象。

现在我尝试将其缩减为第一顺序的系统,如下所示:

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

我认为我有zd(0)的5个起始变量,zd'(0)= z2(0),z(0)= z3(0),z'(0)= z4( 0)和你(0)。目标是获得你(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; < / p>

任何人都可以帮助我。我尝试了较少的方程式,但大多数情况下我得到的错误或错误与此相同: CONTROLLER / FLIGHT返回长度为5的向量,但初始条件向量的长度为6.返回的向量 CONTROLLER / FLIGHT和初始条件向量必须具有相同数量的元素。

编辑: 如果我改变中央功能如下,我不会得到任何错误,但它不起作用,因为我的对象只是落到地上; - )

[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

感谢。

1 个答案:

答案 0 :(得分:0)

在思考并尝试了一段时间后,我想出了这个解决方案:

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

这完成了模拟四轴飞行器垂直运动的工作。