求解微分方程matlab时出错
Error while solving differential equations matlab
我正在寻找解决这个微分方程的方法。
我对求解此类方程式的经验很少,所以这是我的新手代码
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
虽然 运行 这些功能我有这样的错误
Index exceeds matrix dimensions.
Error in threepoint (line 11) f=[x(6);
Error in odearguments (line 87) f0 = feval(ode,t0,y0,args{:}); %
ODE15I sets args{1} to yp0.
Error in ode45 (line 113) [neq, tspan, ntspan, next, t0, tfinal, tdir,
y0, f0, odeArgs, odeFcn, ...
Error in lab1 (line 2) [t,h]=ode45('threepoint', [0 1000], [0 0.25]);
任何人都可以告诉我我错在哪里以及如何解决这些错误?
提前致谢!
请仔细看help ode45
。我承认这部分用法可能不太清楚,所以也看看doc ode45
。
这就是您的问题的本质。您想要求解包含 10 个变量的微分方程,每个变量都是 t
的函数。那么,像 ode45
这样的通用求解器如何知道它需要在每个时间步处理 10 个分量的数组?从它唯一可以做到的地方:初始值!
您的调用方式如下 ode45
:
[t,h]=ode45('threepoint', [0 1000], [0 0.25]);
第二个数组,Y0
,是初始值。从文档中可以清楚地看出这一点。由于您提供的是 2 元素向量,ode45
巧妙地意识到您只有 2 个方程。当您尝试在 threepoint()
中使用 Y(6)
和其他高索引值时,您会收到以下错误:索引超出矩阵维度。因为您的索引 6
超出了数组的大小,即 2
.
您始终需要使用适当大小的初始值(在您的特定情况下长度为 10),以便将问题的维度告知求解器。即使 ode45
可以从某处断言方程的大小,您 确实必须为解决方案的所有 10 个分量提供 初始值。
我正在寻找解决这个微分方程的方法。
我对求解此类方程式的经验很少,所以这是我的新手代码
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
虽然 运行 这些功能我有这样的错误
Index exceeds matrix dimensions.
Error in threepoint (line 11) f=[x(6);
Error in odearguments (line 87) f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 113) [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in lab1 (line 2) [t,h]=ode45('threepoint', [0 1000], [0 0.25]);
任何人都可以告诉我我错在哪里以及如何解决这些错误? 提前致谢!
请仔细看help ode45
。我承认这部分用法可能不太清楚,所以也看看doc ode45
。
这就是您的问题的本质。您想要求解包含 10 个变量的微分方程,每个变量都是 t
的函数。那么,像 ode45
这样的通用求解器如何知道它需要在每个时间步处理 10 个分量的数组?从它唯一可以做到的地方:初始值!
您的调用方式如下 ode45
:
[t,h]=ode45('threepoint', [0 1000], [0 0.25]);
第二个数组,Y0
,是初始值。从文档中可以清楚地看出这一点。由于您提供的是 2 元素向量,ode45
巧妙地意识到您只有 2 个方程。当您尝试在 threepoint()
中使用 Y(6)
和其他高索引值时,您会收到以下错误:索引超出矩阵维度。因为您的索引 6
超出了数组的大小,即 2
.
您始终需要使用适当大小的初始值(在您的特定情况下长度为 10),以便将问题的维度告知求解器。即使 ode45
可以从某处断言方程的大小,您 确实必须为解决方案的所有 10 个分量提供 初始值。