如何在MATLAB中推广RK4代码求解m个常微分方程?

如何在MATLAB中推广RK4代码求解m个常微分方程?,matlab,Matlab,以下MATLAB代码表示两个一阶常微分方程的解: dy1 = @(x,y1,y2) y2; dy2 = @(x,y1,y2) 4*x + 10*sin(x) - y1; %initial values x0 = pi; xn = 2*pi; y1 = 0; % initial value of y1 y2 = 2; % initial value of y2 h = 0.1; % step size for x = x0 : h : xn-h L1 = h*dy2(x, y1,

以下MATLAB代码表示两个一阶常微分方程的解:


dy1 = @(x,y1,y2) y2; 
dy2 = @(x,y1,y2) 4*x + 10*sin(x) - y1;

%initial values
x0 = pi;
xn = 2*pi;
y1 = 0; % initial value of y1
y2 = 2; % initial value of y2  
h = 0.1; % step size

for x = x0 : h : xn-h
  L1 = h*dy2(x, y1, y2);
  K1 = h*dy1(x, y1, y2);
  L2 = h*dy2(x + h/2, y1 + K1/2, y2 + L1/2);
  K2 = h*dy1(x + h/2, y1 + K1/2, y2 + L1/2);
  L3 = h*dy2(x + h/2, y1 + K2/2, y2 + L2/2);
  K3 = h*dy1(x + h/2, y1 + K2/2, y2 + L2/2);
  L4 = h*dy2(x + h, y1 + K3, y2 + L3);
  K4 = h*dy1(x + h, y1 + K3, y2 + L3);
  y2 = y2 + (L1 + 2*L2 + 2*L3 + L4)/6;
  y1 = y1 + (K1 + 2*K2 + 2*K3 + K4)/6;
  x = x + h;
  fprintf ('%f \t %f\t %f\n',x,y2,y1);
end

我如何使这段代码变得通用,以便它能够轻松地解决m个分解的一阶常微分方程(即,dy1,dy2,…,dym)


非常感谢您的帮助。

只需使用状态向量,就像您在为ode45()编码一样,而不是为您的状态使用单个标量变量。例如:

dy = @(x,y) [y(2); 4*x + 10*sin(x) - y(1)];
%initial values
x0 = pi;
xn = 2*pi;
y0 = [0;2]; % initial value of y
h = 0.1; % step size
x = x0 : h : xn-h;
n = numel(x);
y = zeros(numel(y0),n);
y(:,1) = y0;
for i=1:n-1
    K1 = h * dy(x(i)      , y(:,i)       );
    K2 = h * dy(x(i) + h/2, y(:,i) + K1/2);
    K3 = h * dy(x(i) + h/2, y(:,i) + K2/2);
    K4 = h * dy(x(i) + h  , y(:,i) + K3  );
    y(:,i+1) = y(:,i) + (K1 + 2*K2 + 2*K3 + K4)/6;
end
如果需要更改状态变量和微分方程的数量,只需更改函数句柄和初始条件即可。循环代码保持完全相同。此外,还可以将函数句柄、范围和初始条件传递给ode45(),并直接将结果与结果进行比较。例如:

[x,y] = ode45( dy, [x0 xn], y0 );

你在寻找什么吗?@Vicky事实上,我在寻找类似[特别是Kai的答案,但使用MATLAB]的东西。