常微分方程的数值解法实验报告

发布 2019-09-07 00:35:00 阅读 1591

专业班级:信息软件姓名:吴中原学号:120108010002

一、实验目的。

1、熟悉各种初值问题的算法,编出算法程序;

2、明确各种算法的精度与所选步长有密切关系;通过计算更加了解各种

算法的优越性。

二、实验题目。

1、根据初值问题数值算法,分别选择二个初值问题编程计算;

2、试分别取不同步长,考察某节点处数值解的误差变化情况;

3、试用不同算法求解某初值问题,结果有何异常;

4、分析各个算法的优缺点。

三、实验原理与理论基础。

一) 欧拉法算法设计。

对常微分方程初始问题。

用数值方法求解时,我们总是认为(6-1)、(6-2)的解存在且唯一。

欧拉法是解初值问题的最简单的数值方法。从(6-2)式由于y (x0) =y0已给定,因而可以算出。

设x1 = h充分小,则近似地有:

记 从而我们可以取。

作为的近似值。利用及f (x1, y1)又可以算出的近似值:

一般地,在任意点处的近似值由下式给出。

这就是欧拉法的计算公式,h称为步长。

2)四阶龙格-库塔法算法设计:

欧拉公式可以改写为:,它每一步计算的值一次,截断误差为。

改进的欧拉公式可以改写为: ,它每一步要计算的值两次,截断误差为。

改进的欧拉方法之所以比欧拉方法具有更高的精度,是因为在每一步它都比欧拉方法多计算了一次的值。因此,要进一步提高精度,可以考虑在每一步增加计算的次数。

如果考虑在每一步计算的值四次,则可以推得如下公式:

此公式称为标准四阶龙格-库塔(runge-kutta)公式,它的截断误差为。虽然用龙格-库塔方法每一步需要四次调用,计算量较改进的欧拉方法大一倍,这里由于龙格-库塔方法的步长增大了一倍,因而两种方法总的计算量相同,但龙格-库塔方法精确度更高。所以龙格-库塔公式兼顾了精度和计算工作量的较为理想的公式,在实际计算中最为常用。

四、实验内容。

一)问题重述:

科学计算中经常遇到微分方程(组)初值问题,需要利用euler法,改进euler法,rung-kutta方法求其数值解,诸如以下问题:

1) 0 < x1

分别取h=0.1,0.2,0.4时数值解。

初值问题的精确解。

2)用r=3的adams显式和预 - 校式求解。

取步长h=0.1,用四阶标准r-k方法求值。

3)用改进euler法或四阶标准r-k方法求解。

取步长0.01,计算数值解,参考结果

(4)利用四阶标准r- k方法求二阶方程初值问题的数值解。

(i) (ii)

(iii(iv

二)实验**:

1、欧拉法程序。

function y=euler(a,b,m,y0)

a=1,b=2,m=10,f=t*y^(1/3),y0=1;

h=(b-a)/m;

t=zeros(1,m+1);

t=a:h:b;

y=zeros(1,m+1);

yy=zeros(1,m+1);

y(1)=y0;

for k=1:m

y(k+1)=y(k)+h*t(k)*y(k)^(1/3);

endyb=y(m+1);

yy=((t.^2+2)./3).^1.5;

det=yy-y;

plot(t,y,'r-',t,yy,'b:',t,det);

2、改进欧拉法程序。

function h=heeuler(a,b,m,ya,f)

a=0,b=1,m=10,f=t*t+t-y,y0=0;

h=(b-a)/m;

t=zeros(1,m+1);

y=zeros(1,m+1);

p=0;q=0;

t=a:h:b;

y(1)=ya;

for k=1:m

p=feval(f,t(k),y(k));

q=feval(f,t(k+1),y(k)+h*p);

y(k+1)=y(k)+0.5*h*(p+q);

endyy=t.*t-t+1-exp(-t);

det=yy-y;

plot(t,y,'r-',t,yy,'b:',t,det);

h=[t',y',yy',det']

function f=ff(t,y);

f=t.^2+t-y;

3、四阶龙格-库塔法程序。

function h=r_k4(a,b,m,ya,f)

a=0,b=1,m=10,f=t*t+t-y,y0=0;

h=(b-a)/m;

t=zeros(1,m+1);

t=a:h:b;

y=zeros(1,m+1);

k1=0;k2=0;k3=0;k4=0;

y(1)=ya;

for k=1:m

k1=feval(f,t(k),y(k));

k2=feval(f,t(k)+0.5*h,y(k)+0.5*h*k1);

k3=feval(f,t(k)+0.5*h,y(k)+0.5*h*k2);

k4=feval(f,t(k)+h,y(k)+h*k3);

y(k+1)=y(k)+1/6*(k1+2*k2+2*k3+k4);

endyy=t.*t-t+1-exp(-t);

det=yy-y;

plot(t,y,t,yy,t,det);

h=[t',y',yy',det']

function f=ff(t,y);

f=t.^2+t-y;

五、实验结果

1) 0 < x1

分别取h=0.1,0.2,0.4时数值解。

初值问题的精确解。

euler('han',0,0,2,0.1)ans =

euler('han',0,0,2,0.2)ans =

euler('han',0,0,2,0.4)ans =

2、四阶龙格-库塔法结果。

取步长h=0.1,用四阶标准r-k方法求值。

rk4('han',-1,0,1,0.1)ans =

6、实验结果分析与小结。

1、步长h越小则计算精度越高,相对误差越小。因此,在计算能力允许的范围内,步长越小,得到的结果更精确。

2、改进欧拉法和欧拉法相比较,改进欧拉法的计算精度要更高,相对误差也较小。因此在求常微分方程的数值解时,改进欧拉法比欧拉法更精确。