[Matlab科学计算] 四阶Runge-Kutta法解常微分方程

四阶Runge-Kutta法格式的详细推导请查找相关数值分析书籍,这里直接给出四阶Runge-Kutta法的经典格式和Matlab代码

                                                    \large {\color{Red} {\color{Red} }\left\{\begin{matrix} y_{n+1}=y_{n}+\frac{h}{6}\left ( K_{1}+2K_{2}+2K_{3}+K_{4} \right )\\ K1=f(x_{n},y_{n})\\ K_{2}=f(x_{n}+\frac{h}{2},y_{n}+\frac{h}{2}K_{1}) \\ K_{3}=f(x_{n}+\frac{h}{2},y_{n}+\frac{h}{2}K_{2})\\ K_{4}=f(x_{n}+h,y_{n}+hK_{3}) \end{matrix}\right.}

Matlab代码如下:自行修改常微分方程即可

%% 四阶Runge-Kutta法解常微分方程
% 待求解方程 y'= y-2x/y (0<x<1), y(0) = 1;
% 设步长 h = 0.1;
clc,clear
set(0,'defaultfigurecolor','w')
x0 = 0; %自变量初值
xn = 1; %自变量终值
y0 = 1; %因变量初值
h = 0.1; %步长
[x,y] = RungeKutta4(x0, xn, y0, h); %自定义4阶龙格库塔法
[x2,y2] = ode45(@fun, [0,1], y0);   %matlab内部函数
plot(x,y,'r.')
hold on
plot(x2,y2,'b')

function [x,y] = RungeKutta4(x0, xn, y0, h)
n = (xn-x0)/h;
x = zeros(n+1,1);
y = zeros(n+1,1);
x(1) = x0;
y(1) = y0;
for i = 1:n
   x(i+1) = x(i)+h;
   K1 = fun(x(i), y(i));
   K2 = fun(x(i)+h/2, y(i)+K1*h/2);
   K3 = fun(x(i)+h/2, y(i)+K2*h/2);
   K4 = fun(x(i)+h, y(i)+K3*h);
   y(i+1) = y(i)+h/6*(K1+2*K2+2*K3+K4);
end
end

function f = fun(x,y)
f = y-2*x/y;
end

结果如下图所示,可以看出自编函数计算结果与matlab内部函数计算结果基本相同

猜你喜欢

转载自blog.csdn.net/zhwzhaowei/article/details/108966098