当前位置:
文档之家› 欧拉格式 改进欧拉格式 后退欧拉格式
欧拉格式 改进欧拉格式 后退欧拉格式
误差图的编写程序如下:
>> x=0:0.1:1;
e1=[0 0.0046 0.0086 0.0125 0.0166 0.0209 0.0257 0.0311 0.0373 0.0445 0.0527];
e2=[0 -0.0046 -0.0089 -0.0132 -0.0179 -0.0232 -0.0293 -0.0364 -0.0449 -0.0551 -0.0674];
1.0000 1.7848 1.7321
(2)、后退的Euler格式
计算常微分方程的结果为:
>> [x,y]=backeuler('doty',0,1,1,10);
y1=sqrt(1+2.*x); % 对应的准确解
disp(' x y y1')
disp([x',y',y1'])
x y y1
0 1.0000 1.0000
0.8000 1.6165 1.6125
0.9000 1.6782 1.6733
1.0000 1.7379 1.7321
(4)、三者的误差图
注:‘*’表示Euler格式的数值解与准确解的误差,‘b’表示后退的Euler格式的数值解与准确解的误差,‘r-’表示改进的Euler格式的数值解与准确解的误差。
5、实验总结
通过编程实现了常微分方程初值问题数值解法中的欧拉方法及其后退、改进的算法,并比较了其数值解与精确解之间的误差。可以看出后退的欧拉方法得到的数值解精确度较差,而改进的欧拉方法得到的结果则相对较好。
6、教师评语及评分
(4)、根据结果,绘制Euler格式、后退的Euler格式和改进的Euler格式三者的误差图
根据表1可得:
Euler格式的数值解与准确解之间的误差e1:
e1=y-y1=[0 0.0046 0.0086 0.0125 0.0166 0.0209 0.0257 0.0311 0.0373 0.04450.0527];
1.4832
0.7
1.5803
1.5128
1.5525
1.5492
0.8
1.6498
1.5676
1.6165
1.6125
0.9
1.7178
1.6183
1.6782
1.6733
1.0
1.7848
1.6647
1.7379
1.7321
3、详细设计
(1)、Euler格式
欧拉格式的matlab实现程序(euler.m)如下:
微分方程数值解实验报告
实验序号:1日期:2013年10月15日
班级
10应数A班
姓名
黄达
学号
201005050148
实验名称
Euler格式
实验所用软件及版本
Maltab2008
1、实验目的
进一步理解Euler格式、后退的Euler格式、改进的Euler格式的设计思路和算法流程,培养动手实践能力和分析能力。
function[x,y]=neweuler(fun,x0,xfinal,y0,n)
ifnargin<5,n=10;
end
h=(xfinal-x0)/n;
x(1)=x0;y(1)=y0;
fori=1:n
x(i+1)=x(i)+h;
z0=y(i)+h*feval(fun,x(i),y(i));
y(i+1)=y(i)+h/2*(feval(fun,x(i),y(i))+feval(fun,x(i+1),z0));
end
编写一个doty.m文件,如下:
functionf=doty(x,y)
f=y-2*x/y;
在matlab命令窗口输入:
[x,y]=neweuler('doty',0,1,1,10);
y1=sqrt(1+2.*x); % 对应的准确解
disp(' x y y1')
disp([x',y',y1'])
f=y-2*x/y;
在matlab命令窗口输入:
[x,y]=backeuler('doty',0,1,1,10);
y1=sqrt(1+2.*x); % 对应的准确解
disp(' x y y1')
disp([x',y',y1'])
(3)、改进的Euler格式
改进的Euler格式的matlab实现程序(neweuler.m)如下:
后退的Euler格式的matlab实现程序(backeuler.m)如下:
function[x,y]=backeuler(fun,x0,xfinal,y0,n)
ifnargin<5,n=10;
end
h=(xfinal-x0)/n;
x(1)=x0;y(1)=y0;
fori=1:n
x(i+1)=x(i)+h;
1.1000
1.0909
1.0959
1.0954
0.2
1.1918
1.1743
1.1841
1.1832
0.3
1.2774
1.2517
1.2662
1.2649
0.4
1.3582
1.3237
1.3434
1.3416
0.5
1.4351
1.3910
1.4164
1.4142
0.6
1.5090
1.4540
1.4860
0.1000 1.0909 1.0954
0.2000 1.1743 1.1832
0.3000 1.2517 1.2649
0.4000 1.3237 1.3416
0.5000 1.3910 1.4142
0.6000 1.4540 1.4832
0.7000 1.5128 1.5492
0.8000 1.5676 1.6125
2、实验内容
编写Euler格式、后退的Euler格式、改进的Euler格式的程序代码,用于计算下列常微分方程,将计算结果列于表1,并绘制三者的误差图,给出相应的结论。
准确解 ,步长取 。
表1. Euler格式的数值结果(保留5位有效数字)
Euler格式
后退Euler
格式
改进的Euler格式
准确解
0.1
e3=[0 0.0005 0.0009 0.0013 0.0017 0.0022 0.0027 0.0033 0.0040 0.0048 0.0058];
plot(x,abs(e1),'*');
hold on
plot(x,abs(e2),'b');
hold on
plot(x,abs(e3),'r-');
0.2000 1.1918 1.1832
0.3000 1.2774 1.2649
0.4000 1.3582 1.3416
0.5000 1.4351 1.4142
0.6000 1.5090 1.4832
0.7000 1.5803 1.5492
0.8000 1.6498 1.6125
0.9000 1.7178 1.6733
z0=y(i)+h*feval(fun,x(i),y(i));
fork=1:3
z1=y(i)+h*feval(fun,x(i+1),z0);
ifabs(z1-z0)<1e-3
break;
end
z0=z1;
end
y(i+1)=z1;
end
编写一个doty.m文件,如下:
functionf=doty(x,y)
后退的Euler格式的数值解与准确解之间的误差e2:
e2=y-y1=[0 -0.0046 -0.0089 -0.0132 -0.0179 -0.0232 -0.0293 -0.0364 -0.0449 -0.0551-0.0674];
改进的Euler格式的数值解与准确解之间的误差e2:
e3=y-y1=[0 0.0005 0.0009 0.0013 0.0017 0.0022 0.0027 0.0033 0.0040 0.0048 0.0058].
0.9000 1.6183 1.6733
1.0000 1.6647 1.7321
(3)、改进的Euler格式
计算常微分方程的结果为:
>> [x,y]=neweuler('doty',0,1,1,10);
y1=sqrt(1+2.*x); % 对应的准确解
disp(' x y y1')
disp([x',y',y1'])
function[x,y]=euler(fun,x0,xfinal,y0,n)
ifnargin<5,n=10;
end
h=(xfinal-x0)/n;
x(1)=x0;y(1)=y0;
fori=1:n
x(i+1)=x(i)+h;
y(i+1)=y(i)+h*feval(fun,x(i),y(i));
end
x y y1
0 1.0000 1.0000
0.1000 1.0959 1.0954
0.2000 1.1841 1.1832
0.3000 1.2662 1.2649
0.4000 1.3434 1.3416
0.5000 1.4164 1.4142
0.6000 1.4860 1.4832