我正在针对学校项目使用 bvp4c 在MATLAB中求解微分方程。问题是使用防摆来计划高架起重机的轨迹。
发生的问题是,系统不遵守预设的边界条件(fe起重机的位置应在间隔 <0,1> 中,并且最终位置不符合此间隔,并且最后没有边界)。 最令人担忧的是,角度不遵守边界条件(应从 0 rad 开始,从随机值开始)。
有人可以帮我解决这个问题吗?
我的代码如下:
function solveBVP
run parametry.m % parameters of overhead crane (g, m0, m1, L1)
global tf_su g m0 m1 L1 sol
tf_su = 2; % final time
options = bvpset('RelTol',1e-6,'NMax',1000,'Stats','on');
solinit=bvpinit(linspace(0,tf_su,1000),@odeInit,[0 0 0 0]);
sol = bvp4c(@myODE, @odeBC, solinit,options);
sol.th0=[sol.x;sol.y(1,:)]';
sol.th1=[sol.x;sol.y(2,:)]';
disp(sol.parameters);
close all
figure
hold on
plot(sol.x,sol.y(1,:),'Linewidth',1);
plot(sol.x,sol.y(2,:),'Linewidth',1);
hold off
grid on
grid minor
legend('Position','Angle')
xlabel('Time [s]')
ylabel('Postion [m] - Angle [rad]')
end
function dydt = myODE(t,y,p)
global tf_su g m0 m1 L1
% y(1) ... cart
% y(2) ... arm
% y(3) ... dcart
% y(4) ... darm
u=pi^2/tf_su^2*(p(2)+p(4))*cos(pi*t/tf_su);
for i = 2:5
u=u-(i*pi/tf_su)^2*p(i-1)*cos(i*pi*t/tf_su);
end
dydt = [y(3) y(4) u 0];
dydt(3) = (m0*L1*sin(y(2))*y(4)^2 + m1*g*sin(y(2))*cos(y(2))) / (m0 + m1*sin(y(2))^2) + u ./ (m0 + m1*sin(y(2))^2);
dydt(4) = ((m0+m1)*g*sin(y(2)) + m1*L1*y(4)^2*sin(y(2))*cos(y(4))) / (m0 + m1*L1*sin(y(2))^2) + u*cos(y(2)) ./ ((m0 + m1*sin(y(2))^2)*L1);
end
function res = odeBC(ya, yb, p)
res = [ya(1)
ya(2)
ya(3)
ya(4)
yb(1) - 1
yb(2)
yb(3)
yb(4)
];
end
function v = odeInit(t)
global tf_su
v=[0;
-pi+pi*t/tf_su;
0;
pi/tf_su;
]';
end