当前位置:文档之家› Euler法和改进的Euler法实验报告

Euler法和改进的Euler法实验报告

用Euler法和改进的Euler法求u’=-5u(0≤t≤1),u(0)=1的数值解,步长h=0.1,0.05,并比较两个算法的精度。

解:
1)当步长h=0.1时
编写程序如下所示
clf
clear
clc
%直接求解微分方程
y=dsolve('Dy=-5*y','y(0)=1','t')
%Euler法
h=0.1;
t=0:h:1;
n=length(t);
u=zeros(1,n);
u(1)=1;
zbu(1,1)=t(1);
zbu(2,1)=u(1);
for i=2:n
f=-5*u(i-1);
u(i)=u(i-1)+h*f;
zbu(1,i)=t(i);
zbu(2,i)=u(i);
end
zbu
%改进的Euler法
v=zeros(1,n);
v0=zeros(1,n);
v(1)=1;
zbv(1,1)=t(1);
zbv(2,1)=v(1);
for i=2:n
f=-5*v(i-1);
v0(i)=v(i-1)+h*f;
v(i)=v(i-1)+h/2*(f-5*v0(i));
zbv(1,i)=t(i);
zbv(2,i)=v(i);
end
zbv
plot(t,u,'r*','markersize',10)
hold on,
plot(t,v,'r.','markersize',20)
hold on,
ezplot(y,[0,1])
hold on,
title('Euler法和改进的Euler法比较(h=0.1)),
grid on
legend('Euler法','¸改进的Euler法','解析解')
%解真值
h=0.1;
t=0:h:1;
n=length(t);
for i=1:n
y(i)=1/exp(5*t(i)); %通过第一部分程序直接解得的解析解
zby(1,i)=t(i);
zby(2,i)=y(i);
end
zby
我们可以得到计算后的结果图像如图一所示
图1 Euler法和改进的Euler法比较(h=0.1)
同时,我们得到Euler法,改进的Euler法和解析解的在各点处数值分别如下所示:
t坐标0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
改进欧拉 1.0000 0.6250 0.3906 0.2441 0.1526 0.0954 0.0596 0.0373 0.0233 0.0146 0.0091
表1 Euler法和改进的Euler法在各点数值比较(h=0.1)为了比较Euler法和改进的Euler法的算法精度,在这里我们利用相对误差的概念进行评判。

对于Euler法和改进的Euler法的每个的估计值有:
相对误差=|估计值-真值 |
真值
从而我们可以通过计算得到如下的相对误差表:
t坐标0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
改进欧拉0 0.0305 0.0618 0.0942 0.1275 0.1618 0.1972 0.2336 0.2712 0.3099 0.3498 表2 Euler法和改进的Euler法在各点相对误差比较(h=0.1)为了评定算法精度,我们对每种算法的在所有点处的相对误差求平均,可以得到Euler法的平均相对误差为0.5443,改进的Euler法的平均相对误差为0.1670。

由此我们可以得出改进的欧拉法的算法进度更高。

2)当步长h=0.05时
程序编写如下
clf
clear
clc
%直接求解微分方程
y=dsolve('Dy=-5*y','y(0)=1','t')
%Euler法
h=0.01;
t=0:h:1;
n=length(t);
u=zeros(1,n);
u(1)=1;
zbu(1,1)=t(1);
zbu(2,1)=u(1);
for i=2:n
f=-5*u(i-1);
u(i)=u(i-1)+h*f;
zbu(1,i)=t(i);
zbu(2,i)=u(i);
end
zbu
%改进的Euler法
v=zeros(1,n);
v0=zeros(1,n);
v(1)=1;
zbv(1,1)=t(1);
zbv(2,1)=v(1);
for i=2:n
f=-5*v(i-1);
v0(i)=v(i-1)+h*f;
v(i)=v(i-1)+h/2*(f-5*v0(i));
zbv(1,i)=t(i);
zbv(2,i)=v(i);
end
zbv
plot(t,u,'r*','markersize',10)
hold on,
plot(t,v,'r.','markersize',20)
hold on,
ezplot(y,[0,1])
hold on,
title('Euler法和改进的Euler法比较(h=0.1)),
grid on
legend('Euler法','¸改进的Euler法','解析解')
%解真值
h=0.01;
t=0:h:1;
n=length(t);
for i=1:n
y(i)=1/exp(5*t(i)); %通过第一部分程序直接解得的解析解 zby(1,i)=t(i);
zby(2,i)=y(i);
end
zby
计算后的结果图像为
图1 Euler法和改进的Euler法比较(h=0.05)
同时,我们得到Euler法,改进的Euler法和解析解的在各点处数值分别如下所示:
t坐标0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50
改进欧拉 1.0000 0.7813 0.6104 0.4768 0.3725 0.2910 0.2274 0.1776 0.1388 0.1084 0.0847
t坐标0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00
改进欧拉0.0662 0.0517 0.0404 0.0316 0.0247 0.0193 0.0150 0.0118 0.0092 0.0072
此时,求出两种算法的相对误差的平均值分别为:
Euler法改进的Euler法
0.2960 0.0321
由此可见改进的Euler法的算法精度高于Euler法。

由以上的分析我们可以得出如下结论:
1. Euler法和改进的Euler法相比较,改进的Euler法的计算精度更高,相对误差
也比较小。

因此在求解微分方程的数值解时,改进的Euler法优于Euler法。

2. 在上述两种方法中当步长h越小则计算精度越高,相对误差较小。

因此,计
算能力允许的范围内,选取步长越小可以得到更加精确的结果。

3. 在利用这两种方法计算数值解的过程中,前一次迭代的结果会对下一轮求得
的数值产生影响。

因此,一旦上一轮迭代所得的结果有偏差,下一轮结果的
偏差将大于上一轮的偏差。

因此会导致伴随迭代次数的增加而产生更大的偏
差。

相关主题