ode45或四阶龙格-库塔法求解耦合常微分方程组时的Matlab误差

ode45或四阶龙格-库塔法求解耦合常微分方程组时的Matlab误差,matlab,ode,numerical-integration,Matlab,Ode,Numerical Integration,我是Matlab编程的初学者,同时也是Runge-Kutta方法的初学者 我试图用四阶龙格-库塔方法来解决一个耦合常微分方程组 这是我的问题 G = 1.4; g = 1.4; k = 0; z = 0; b = 0.166667; syms n; x2 = symfun(sym('x2(n)'),[n]); x1 = symfun(sym('x1(n)'),[n]); x3 = symfun(sym('x3(n)'),[n]); x4 = symfun(sym('x4(n)'),[n]);

我是Matlab编程的初学者,同时也是Runge-Kutta方法的初学者

我试图用四阶龙格-库塔方法来解决一个耦合常微分方程组

这是我的问题

G = 1.4;
g = 1.4;
k = 0;
z = 0;
b = 0.166667;

syms n; 
x2 = symfun(sym('x2(n)'),[n]);
x1 = symfun(sym('x1(n)'),[n]);
x3 = symfun(sym('x3(n)'),[n]);
x4 = symfun(sym('x4(n)'),[n]);
x5 = symfun(sym('x5(n)'),[n]);

k1 = [x2 * x1 *n *(1 - z * x2)*(x1 - n) - 2 * x3 * n *(1 - z * x2) - x4^2 * x2 *(1 - z * x2)- G *x3 *x2 ]./ [( G * x3 - (x1 - n)^2 * x2 *(1 - z * x2)) * n];   
k2 = [x2 * (1 - z * x2)*(x1 * x2 * ( x1 - 2 *n)*( x1 - n) + 2* x3 * n + x4^2 * x2 ) ]./ [( G * x3 - (x1 - n)^2 * x2 *(1 - z * x2)) * n * (x1 - n)];
k3 = [x3 * x2 * (2 * n * x1 - n)^2 * ( 1 - z * x2) + G * x1 * (x1 - 2 *n)* (x1 - n) + x4^2 * G]./ [( G * x3 - (x1 - n)^2 * x2 *(1 - z * x2)) * n * (x1 - n)];
k4 = [x4 * ( x1 + n)] ./ [n * (x1- n)];
k5 = - [x5] ./ [n * (x1- n)];

f = @(n,x) [k1;  k2;  k3;  k4; k5];
[n,xa] = ode45(f,[0 1],[1-b 1/b 1-b 0.01 0.02]);
错误是

使用参数时出错(第93行)
@(N,X)[K1;K2;K3;K4;K5]返回长度为1的向量,但长度
初始条件向量为5。返回的向量 @(N,X)[K1;K2;K3;K4;K5]和初始条件向量必须具有
相同数量的元素。

ode45中的错误(第114行)
[neq、tspan、ntspan、next、t0、tfinal、tdir、y0、f0、odeArgs,
odeFcn


请指导我如何使用四阶龙格-库塔法解决上述问题…

错误源于将符号函数(与函数句柄混合)与数值解算器一起使用。 您需要为
ode45
创建数字函数才能正常工作(我还将所有
[
]
替换为
进行分组):

这是为我安装的Matlab运行的


但是,由于函数产生了
Infs
,所以输出都是
NaNs
;我可能通过替换括号引入了错误,但我不知道实际的方程式是什么,所以我将把它留给您。:

通常,您首先查阅文档。如果不可用,请使用您选择的搜索引擎要作为第一个结果查找的实例

这里有一个多维的例子

function dy = rigid(t,y)
    dy = zeros(3,1);    % a column vector
    dy(1) = y(2) * y(3);
    dy(2) = -y(1) * y(3);
    dy(3) = -0.51 * y(1) * y(2);
end

options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
[T,Y] = ode45(@rigid,[0 12],[0 1 1],options);

plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
这可以作为一个蓝图。在相关页面中,他们对第一个例子中的范德波尔方程使用了与你更接近的不同语法

function dydt = vdp1(t,y)
    dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];
end

[t,y] = ode45(@vdp1,[0 20],[2; 0]);

plot(t,y(:,1),'-',t,y(:,2),'--')
title('Solution of van der Pol Equation, \mu = 1');
xlabel('time t');
ylabel('solution y');
legend('y_1','y_2')
根据这些示例,将代码重写为

G = 1.4;
g = 1.4;
k = 0;
z = 0;
b = 0.166667;



function dotx = dxdn(n,x) 
    t1 = n*(x1-n)    
    t2 = x(2)*(1 - z * x(2))

    den123 = ( G * x(3) - (x(1) - n)^2 * t2)

    k1 = ( x(1)*t1*t2 - 2 * x(3) * n *(1 - z * x(2)) - x(4)^2 * t2- G *x(3) *x(2) ) / (den123*n);   
    k2 = ( t2*(x(1) * x(2) * ( x(1) - 2 *n)*( x(1) - n) + 2* x(3) * n + x(4)^2 * x(2) ) ) / (den123 * t1);
    k3 = ( x(3) *  (2 * n * x(1) - n)^2 * t2 + G * x(1) * (x(1) - 2 *n)* (x(1) - n) + x(4)^2 * G ) / (den123*t1);
    k4 = ( x(4) * ( x(1) + n) ) / t1;
    k5 = - x(5) / t1;

    dotx = [k1;  k2;  k3;  k4; k5];
end 

[n,xa] = ode45(@dxdn,[0.001 1],[1-b; 1/b; 1-b; 0.01; 0.02]);

由于在
n=0处被零除,因此无法在该奇点处开始迭代。在上面的代码中,这可以通过从一些(非常)奇点开始来缓解小正值
n
,您也可以尝试从
n=1e-8
或更小的值开始。所有组件的斜率都非常大,因此积分可能会很慢,结果可能不会太精确,接近于零。要正确处理单数ODE,请在math.stackexchange论坛中提问。

是否可以像删除s一样简单一个列向量只有一列。@TroyHaskin…我的问题是$$v'(\eta)=k1,d'[\eta]=k2,p'[\eta]=k3,phi'[\eta]=k4,w'[\eta]=k5,v[1]=(1-\beta),d[1]=1/\beta,p[1]=(1-\beta),\phi[1]=0.01,w[1]=0.02$$@TroyHaskin…我已将v更改为x1,p更改为x2…在用RK4解决它之后…我想为$$\dfrac{v[\eta]}{v[1]}$..绘制图形,即v[[eta]]/v[1]..,但在这里我找不到$$v[\eta]的值$$在解决方案中…请指导我如何解决和绘制上述问题的图形…代码正在解决您的方程组。但是,
k1
k2
,…的当前形式具有
0
分母。必须对其进行修正以产生正确的结果。@TroyHaskin…n的范围可以是o到1。@co在上面的问题中,我是否知道存在哪个范围的n个解决方案…@TroyHaskin…,请告诉我绘制图的命令…用于v[[Eta]]/v[1]…即存在哪个解决方案的n个范围内的x(1)[[Eta]]/x(1]
G = 1.4;
g = 1.4;
k = 0;
z = 0;
b = 0.166667;



function dotx = dxdn(n,x) 
    t1 = n*(x1-n)    
    t2 = x(2)*(1 - z * x(2))

    den123 = ( G * x(3) - (x(1) - n)^2 * t2)

    k1 = ( x(1)*t1*t2 - 2 * x(3) * n *(1 - z * x(2)) - x(4)^2 * t2- G *x(3) *x(2) ) / (den123*n);   
    k2 = ( t2*(x(1) * x(2) * ( x(1) - 2 *n)*( x(1) - n) + 2* x(3) * n + x(4)^2 * x(2) ) ) / (den123 * t1);
    k3 = ( x(3) *  (2 * n * x(1) - n)^2 * t2 + G * x(1) * (x(1) - 2 *n)* (x(1) - n) + x(4)^2 * G ) / (den123*t1);
    k4 = ( x(4) * ( x(1) + n) ) / t1;
    k5 = - x(5) / t1;

    dotx = [k1;  k2;  k3;  k4; k5];
end 

[n,xa] = ode45(@dxdn,[0.001 1],[1-b; 1/b; 1-b; 0.01; 0.02]);