三阶及四阶Runge-Kutta法

 

1. 实验目的

  1. 能运用Matlab编程实现Runge-Kutta法与求解微分方程初值问题的数值解;
  2. 能用图像来比较数值解与精确解;
  3. 熟悉Matlab编程环境。

2. 实验内容

  1. 实验题目

用三阶、四阶Runge-Kutta方法求常微分方程初值问题

的数值解,步长h=0.2,0.5,1,并与真解进行比较。

     2.实验原理

 三阶Runge-Kutta方法:

三阶及四阶Runge-Kutta法_第1张图片

三阶及四阶Runge-Kutta法_第2张图片

 

3. 实验步骤

步1. 用dsolve函数求初值问题的解析解;

步2. 用ezplot函数做出解析解的图像;

步3. 用Matlab编写三阶、四阶Runge-Kutta法求解初值问题的通用程序;

步4. 用编写的程序求初值问题的数值解;

步5. 用plot函数将数值解显示在图像里,并与解析解进行比较。

4. 结果与分析

分别取步长h为1、0.5、0.2可以得到下列图像

三阶及四阶Runge-Kutta法_第3张图片

三阶及四阶Runge-Kutta法_第4张图片

三阶及四阶Runge-Kutta法_第5张图片

5. 实验总结

通过上面的实验我们能够得到四阶Runge-Kutta与三阶Runge-Kutta法能够较快且较好的得到比较精确的解。

function [u,t]=Runge_Kutta3(t0,u0,T,h)
% t表示区间[t0,T]上步长为h节点构成的向量
% u表示由3阶Runge-Kutta法得到的数值解构成的向量
t=[t0:h:T];
n=length(t);
u=zeros(1,n);
u(1)=u0;
for i=2:n
   K1=t(i-1)*u(i-1);
   K2=(t(i-1)+0.5*h)*(u(i-1)+0.5*h*K1);
   K3=t(i)*(u(i-1)-h*K1+2*h*K2);
   u(i)=u(i-1)+h*(K1+4*K2+K3)/6;
end

function [u,t]=Runge_Kutta4(t0,u0,T,h)
% t表示区间[t0,T]上步长为h节点构成的向量
% u表示由4阶Runge-Kutta法得到的数值解构成的向量
t=[t0:h:T];
n=length(t);
u=zeros(1,n);
u(1)=u0;
for i=2:n
   K1=t(i-1)*u(i-1);
   K2=(t(i-1)+0.5*h)*(u(i-1)+0.5*h*K1);
   K3=(t(i-1)+0.5*h)*(u(i-1)+0.5*h*K2);
   K4=t(i)*(u(i-1)+h*K3);
   u(i)=u(i-1)+h*(K1+2*K2+2*K3+K4)/6;
end
clc
clear all
u_true=dsolve('Du=t*u','u(0)=1','t');
t0=0; T=2;h=0.5;u0=1;kmax=1;
[u2,t2]=Runge_Kutta3(t0,u0,T,h);
[u3,t3]=Runge_Kutta4(t0,u0,T,h);
ezplot(u_true,[t0,T])
hold on
plot(t2,u2,'bs')
hold on
plot(t3,u3,'bo')
grid on
hold off
legend('u true','RK3法','RK4法')

 

你可能感兴趣的:(matlab学习)