在MATLAB中的线性化系统上使用ode45,非零边界条件是否存在限制?

时间:2020-10-31 13:07:26

标签: matlab ode differential-equations

首先,我知道简单的答案是肯定的。我有一些函数和一个脚本供我调用以尝试使用其求解机械模型。我有一个常数函数:

   function [m1, m2, m3, M, alpha, R, g, l, kys, I3, k1, k2, c1, c2, kr] = variable_constants2()
m1=2500;
m2=1500;
m3=8000;
M=m1+m2+m3;
alpha=pi/8;
R=10;
g=-9.81;
l=2*R*sin(alpha)/alpha;
kys=(1/(72*alpha))*(18*alpha^2+9*alpha*sin(2*alpha)...
    -32*sin(alpha)^2);
I3=m3*kys;
k1=1e4;
k2=1e4;
c1=1e4;
c2=1e4;  
kr=1e4;
end

我有一个定义系统质量矩阵的函数(是的,我知道许多变量尚未使用,我现在暂时将它们留在那儿)

function M = mass(q)
    [m1, m2, m3, M, alpha, R, g, l, kys, I3, k1, k2, c1, c2 kr] = variable_constants2();
    M = zeros(6,6);
    M(1,1)=1;
    M(2,2)=-(2*m3+m1);
    M(2,6)=-(2*m3*l*sin(q(5)));
    M(3,3)=1;
    M(4,4)=-m2;
    M(5,5)=1;
    M(6,6)=-(2*I3-2*m3*l);
end

我有一个函数以q_dot = M ^ -1 * q的形式设置状态空间模型。其中q是系统状态变量的矩阵:

function dYdt = f(t,q,P)
    [m1, m2, m3, M, alpha, R, g, l, kys, I3, k1, k2, c1, c2 kr] = variable_constants2();
    q_matrix=[q(2)
        k1*q(1)+k2*(q(3)-q(1))+m1*g+2*m3*g+q(2)*(c1+c2)+q(6)^2*cos(q(5))
        q(4)
        k2*(q(3)-q(1))+m2*g+q(4)*(c1+c2)
        q(6)
        2*m3*l*q(6)*q(2)*cos(q(5)) + 2*kr*q(5) + 2*m3*l*(g*sin(q(5)) ...
            +q(2)*sin(q(5))*q(6))];
    M = mass2(q);
    dYdt = M\q_matrix;
end

最后,我正在尝试运行一个脚本,该脚本计算此微分方程组的解:

[m1, m2, m3, M, alpha, R, g, l, kys, I3, k1, k2, c1, c2, kr] = variable_constants2();
tspan = linspace(0,50,100);
Y0=[-0.564513980920171,-8.788646829574525,-0.567,-4.099961183480138, **0**, **0**];

[t,q] = ode45(@f2,tspan,Y0);

用星号括起来的两个零应该能够为非零,我希望它们适用于模型,但是当尝试将其更改为非零值时,求解器会失败。 MATLAB似乎在无限循环,或者至少在做某事导致求解器冻结。我可能没有让它运行足够长的时间,但是当我能够让它运行时,我将查看是否收到错误消息。如果它们为零,则输出 q 完全正确,我可以轻松地绘制它们,但否则会遇到问题。 f2中描述的模型是否存在问题?我一直很困。谢谢。

0 个答案:

没有答案