【发布时间】:2017-10-27 15:41:28
【问题描述】:
我花了几个小时思考一个我认为完全容易解决的问题。我就是不明白。 在 Coursera(空中机器人)的作业中,我要求使用 matlab 中的 ODE45 函数对 PD 控制器进行编程。目标是(仅!)物体沿 z 轴的垂直稳定。
二阶微分方程为
u(t) = m*(zd'' + Kp*(zd-z)+Kv(zd'-z')+g)
这里d代表想要的位置,z单独代表实际位置,'或''代表第一个o。二阶导数。 而 u 是合力,需要将对象保持或获取到它应该在的位置。
现在我试图将其简化为如下的一阶 euqations 系统:
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+kvz(4)-kvz(2)-kpz(1)+kpz(3)-g;
谁能帮帮我。我尝试了较少的方程式,但大多数情况下我得到相同的错误或错误: 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
谢谢。
【问题讨论】:
-
我不清楚
zd和z代表什么?当dz和z也在浮动时,如果你不使用zd作为变量名,也许会更清楚 -
是的。这可能是个好主意。但问题是:带有 zd 的所有内容都代表所需的垂直位置,没有 'd' 的所有内容都代表当前位置好吗?
-
什么是
z(6)?根据您的初始条件,您似乎只有五个状态。积分函数的输入和输出需要与初始条件具有相同的维度。 -
z(6) 是我尝试将 u = z5 纳入等式的有益尝试。
标签: matlab ode differential-equations feedback