如何在MATLAB中推广RK4代码求解m个常微分方程?
以下MATLAB代码表示两个一阶常微分方程的解:如何在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,
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]的东西。