求解微分方程matlab时出错

时间:2016-06-06 23:33:16

标签: matlab differential-equations

我正在寻找解决这个微分方程的方法。

equations

我在解决这类方程方面经验不足,所以这里是我的菜鸟代码

function lab1()
[t,h]=ode45('threepoint', [0 1000], [0 0.25]);
plot(t, h);  

function f = threepoint(x, y)
%THREEPOINT Summary of this function goes here
%   Detailed explanation goes here
m = 15000;
R1 = 0.1;
R2 = 0.1;
P1 = 0.1;
P2 = 0.1;
B = 4;
rbk = 0.5;
f=[x(6);
    x(7);
    x(8);
    x(9);
    x(10);
    (-x(6) / (m * sqrt( x(6)*x(6) + x(7)*x(7)))) * (R1 + R2) + (cos(x(3))/m) * P1 + (cos(x(3))/m) * P2;
    (-x(7) / (m * sqrt( x(6)*x(6) + x(7)*x(7)))) * (R1 + R2) + (cos(x(3))/m) * P1 + (cos(x(3))/m) * P2;
    -(M/I) - (1/I1)* (B/2 + y(1))*P1 + (1/I2)*(B/2+y(2))*P2;
    (rbk/I1)*(P1-R1);
    (rbk/I2)*(P2-R2);
    ];  
end

在运行这些功能时,我遇到了像

这样的错误
  

指数超出矩阵维度。

     

三点错误(第11行)f = [x(6);

     

odearguments中的错误(第87行)f0 = feval(ode,t0,y0,args {:}); %   ODE15I将args {1}设置为yp0。

     

ode45错误(第113行)[neq,tspan,ntspan,next,t0,tfinal,tdir,   y0,f0,odeArgs,odeFcn,...

     

lab1中的错误(第2行)[t,h] = ode45('三点',[0 1000],[0 0.25]);

任何人都可以告诉我我在哪里弄错了,我该如何解决这些错误? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

请仔细查看help ode45。我承认这部分用法可能不太清楚,所以请看一下doc ode45

这是你问题的本质。您想要求解10个变量的微分方程,每个变量都是t的函数。那么,像ode45这样的通用求解器如何知道它需要在每个时间步使用10个组件数组?从它唯一的地方:初始值!

以下是您拨打ode45的方式:

[t,h]=ode45('threepoint', [0 1000], [0 0.25]);

第二个数组Y0是初始值。从文档中可以清楚地看出这一点。由于您提供了2元素向量,ode45巧妙地意识到您只有2个方程式。当您尝试在Y(6)中使用threepoint()和其他高索引值时,您会收到错误:索引超出矩阵维度。因为您的索引6超出了数组的大小,即2

您始终需要使用具有适当大小的初始值(在特定情况下长度为10),以便通知求解器您的问题的维度。即使ode45可以从某处确定方程的大小,您也必须为解决方案的所有10个组件提供初始值。