当前位置:文档之家› 常微分方程的Euler解法

常微分方程的Euler解法

毕业论文题目:常微分方程的Euler解法及其程序设计学院:数学与信息科学学院专业:数学与应用数学毕业年限: 2011年6月学生:学号:指导教师:常微分方程的Euler解法及其程序设计摘要本文总结了常微分方程的Euler解法,对各种格式给出了误差估计,设计了这些格式的计算程序.关键词常微分方程;Euler解法;误差分析;程序设计Euler Method of Ordinary Differential Equation and ItsProgrammingAbstract Euler method of ordinary differential equation is summarized,the error of each format is analyzed and its programming is designed in this paper. Keywords Ordinary differential equation; Euler method; Error analysis; Programming科学技术中常常需要求解常微分方程的定解问题,这类问题最简单的形式,即为微分方程(,)dyf x y dx= (1)的初值问题00(,),().dyf x y dx y x y ⎧=⎪⎨⎪=⎩ (2)定理 (存在与唯一性定理)如果方程(1)的右端函数(,)f x y 在闭矩形域000000:,R x a x x a y b y y b -≤≤+-≤≤+上满足如下条件:(1)在R 上连续;(2)在R 上关于变量y 满足利普希茨(Lipschitz )条件,即存在常数L ,使对于R 上任何一对点(,)x y 和(,)x y 有不等式:(,)(,)f x y f x y L y y -≤-,则初值问题(2)在区间00000x h x x h -≤≤+上存在唯一解00(),()y y x y x y ==,其中0(,)min(,),max (,)x y R bh a M f x y M∈==.根据存在与唯一性定理,只要(,)f x y 关于y 满足Lipschitz 条件(,)(,)f x y f x y L y y -≤-,即可保证其解()y y x =存在并唯一.然而解析方法只能用来求解少数较简单和典型的常微分方程,例如线性常系数微分方程等,对于变系数常微分方程的解析求解就比较困难,而一般的非线性常微分方程就更不用说,因此,在大多数情况下,实际问题中归结出来的微分方程主要靠数值解法求解.所谓数值解法,就是寻找()y x 在一系列离散节点121n n x x x x +<<<<<上的近似值121,,,,n n y y y y +.相邻两个节点的间距1n n h x x +=-称为步长,假定h为定数,节点为0,0,1,2,n x x nh n =+=.1 Euler 解法 (1)Euler 格式Euler 格式的计算公式为1(,)n n n n y y hf x y +=+ (0,1,2)n =. (3) 下面用4种方法推导公式(3) a 泰勒展开法在n x 处展开1()()n n y x y x h +=+有 '2''11()()()()2!n n n n y x y x hy x h y ξ+=++ 1()n n n x x ξ+≤≤, (4)略去余项,得'1()()()()(,())n n n n n n y x y x hy x y x hf x y x +≈+=+.用近似值n y 代替()n y x ,把上式右端所得结果记为1n y +,得1(,)n n n n y y hf x y +=+ (0,1,2)n =.b 数值差商由导数定义知'1()()()(,())n n n n n y x y x y x f x y x h+-≈=,所以1()()(,())n n n n y x y x hf x y x +≈+.用n y 代替()n y x ,把上式右端所得结果记为1n y +,即得公式(3). c 数值积分在区间[]1,n n x x +上对微分方程(1)进行积分,得11()()(,())n nx n n x y x y x f x y x dx ++=+⎰, (5)利用左矩形公式得1()()(,())n n n n y x y x hf x y x +≈+.用n y 代替()n y x ,把上式右端所得结果记为1n y +,即得公式(3). d 几何方法在Oxy 平面中,微分方程{00.'(,),()y f x y y x y ==的解()y y x =称为它的积分曲线.积分曲线上的一点(,)x y 的切线斜率等于函数(,)f x y 的值.如果按函数(,)f x y 在Oxy 平面上建立一个方向场,那么,积分曲线上的每一点的切线方向均与方向场在该点的方向一致.基于上述对微分方程解的几何解释,从初始点000(,)p x y 出发,依方向场在该 点的方向上推进到1x x =上一点1p ,然后再从1p 依方向场的方向推进到2x x =上 的一点2p .循环前进,可作出一条折线012p p p (如图1)图1一般地,设已作出该折线的极点n p ,过(,)n n n p x y 依方向场的方向再推进到111(,)n n n p x y +++,显然,两个极点n p ,1n p +的坐标有下列关系:11(,)n nn n n ny y f x y x x ++-=-,1(,)n n n n y y hf x y +=+.若初值0.y 已知,则依上式可逐步算出1000(,)y y hf x y =+, 2111(,)y y hf x y =+,1(,)n n n n y y hf x y +=+.即得Euler 格式的计算公式(3).(2)梯形格式如果用梯形公式计算(5)式右端的积分,得[]111()()(,())(,())2n n n n n n hy x y x f x y x f x y x +++≈++ (0,1,2)n =. 对于上式右端,用n y 代替()n y x ,把上式右端所得结果记为1n y +,即得梯形公式[]111(,)(,)2n n n n n n hy y f x y f x y +++=++ (0,1,2)n =. (6)梯形公式(6)是关于1n y +的隐式方程,因此称梯形法为隐式方法,而公式(3)是1n y +的显式形式,因此称欧拉法为显式方法.(3)改进的Euler 格式先用Euler 格式求得一个初步的近似值1n y +,称之为预测值,预测值1n y +的精度可能很差,再用梯形公式将它校正一次,得1n y +,这个结果称之为校正值.而这样建立的预测—校正系统通常称为改进的Euler 格式.预测 1(,)n n n n y y hf x y +=+校正 111(,)(,)2n n n n n n hy y f x y f x y +++⎡⎤=++⎣⎦ 这一计算格式亦可表示为:[]11(,)(,(,))2n n n n n n n n hy y f x y f x y hf x y ++=+++, 或表示为下列平均化形式:11(,)(,)1()2p n n n c n n p n p c y y hf x y y y hf x y y y y ++⎧⎪=+⎪⎪=+⎨⎪⎪=+⎪⎩2 误差与精度 (1)截断误差在实际计算中,即使初始值是准确的,但所得的数值解往往与初始值问题的准确解有一定的误差.用111()n n n y x y ε+++=-,表示在节点1n x +处准确解与数值解之差,称之为整体截断误差,它不仅与1n x x +=这步计算有关,而且与121,,,n n x x x --这些步计算有关.为方便估计,假定()i y i n ≤为准确的,即在()()i i y y x i n =≤的前提下估计误差111()n n n E y x y +++=-,这种误差称为局部截断误差.如果局部截断误差11(),p n E O h ++=这里h 是等距节点的步长,则称所用的数值解的方法的阶数是p ,或称该方法有p 阶精确度.显然,步长h 越小,阶数p 越高,则局部截断误差越小,计算结果的精度也越高.(2)Euler 格式是一阶方法首先,可以通过几何直观来考察Euler 格式的精度.假设()n n y y x =,即顶点n p 落在积分曲线()y y x =上,那么,按Euler 格式作出的折线1n n p p +便是()y y x =过点n p 的切线(如图2).从图形上看,这样定出的顶点1n p +显著地偏离了原来的积分曲线,可见Euler 格式是相当粗糙的.图2首先考虑Euler 格式的局部截断误差1n E +,由(4)式得'2''11()()()()2!n n n n y x y x hy x h y ξ+=++1()n n n x x ξ+≤≤. 由Euler 格式,有'1(,)()n n n n n n y y hf x y y hy x +=+=+,上面两式相减,则Euler 格式的局部截断误差显然为22111()''()''()22n n n n h h E y x y y y x ξ+++=-=≈.若令max ''()a x bM y x ≤≤=,则有221()2n M E h O h +≤=, 这表明Euler 格式是一阶方法.下面考虑Euler 格式的整体截断误差n ε. 由(3)式和(4)式,有1111()()(,())n n n n n y x y x hf x y x E ----=++,111(,)n n n n y y hf x y ---=+.两式相减得111111[(,())(,)]n n n n n n n h f x y x f x y E εε------≤+-+.由Lipschitz 条件及22i M E h ≤,有 22111(1)22n n n n M MhL h hL h εεεε---≤++=++.反复使用这个不等式,得21(1)2n n M hL h εε-≤++12222200(1)(1)(1)(1)222n ni n i M M M hL h hL h hL h hL εε--=≤++++≤≤+++∑20(1)1(1)2n nM hL hL h hLε+-=++0(1)[(1)1]2n n MhhL hL Lε=+++-. 又1(),(1)[(1)]nnhLb a L hL nh b a hL hL e -=-+=+≤,所以()()0(1)2b a L b a Ln Mh e e Lεε--≤+-. 上式表明,Euler 格式的整体截断误差由初始误差0ε和局部截断误差界22M h 决定. 又00()y x y =,所以00ε=,则()n O h ε=.这表明当0→h 时,0→n ε,也就是说当h 充分小时近似值n y 能和)(n x y 充分接近,即数值解是收敛的.综上所述,Euler 格式的整体截断误差比局部截断误差低一阶,这表明Euler 格式的精度是比较差的,为了提高精度,减小误差,可采用梯形格式. (3)梯形格式是二阶方法首先考察梯形格式的局部截断误差. 由泰勒展式,有231()()'()''()()2n n n n h y x y x hy x y x O h +=+++, (7) 21'()'()''()()n n n y x y x hy x O h +=++. (8) 由(8)式,有1'()'()''()()n n n y x y x y x O h h+-=+.将上式代入(7)式,得311()()['()'()]()2n n n n hy x y x y x y x O h ++=+++, (9)又由梯形公式(6),有 []111(,)(,)2n n n n n n hy y f x y f x y +++=++. (10)由微分中值定理,有1111111(,)(,())(,)[()]n n n n y n n n f x y f x y x f x y y x η+++++++=+-1111'()(,)[()]n y n n n y x f x y y x η++++=+-,这里η是介于1n y +与1()n y x +之间的值,将上式代入(10)式,有11111['()'()](,)[()]22n n n n y n n n h hy y y x y x f x y y x η+++++=+++-.将上式与(9)式相减,得梯形格式的局部截断误差为311111()(,)[()]()2n n y n n n hy y x f x y y x O h η+++++-=-+, 即有31111()()1(,)2n n y n y y x O h hf x η+++-=-.因此梯形方法是二阶方法.梯形方法是隐式的,可用迭代法求解,其迭代公式如下:{(0)1(1)()111(,)(,)(,)2n n n n k k n n n n n n y y hf x y h yy f x y f x y +++++=+⎡⎤=++⎣⎦ (0,1,2,)k =. 下面分析迭代过程的收敛性: 因为(1)()111111(,)(,)2k k n n n n n n h y y f x y f x y +++++++⎡⎤-=-⎣⎦, 于是有(1)()11112k k n n n n hLy y y y +++++-≤-,式中L 为(,)f x y 对y 满足Lipschitz 常数,如果h 选取充分小,使得12hL<,则当k →∞时有(1)11k n n y y +++→,这说明迭代过程是收敛的.可见,梯形格式虽提高了精度,但在应用迭代公式进行实际计算时,每迭代一次,都要重新计算函数f 的值,而迭代又要反复进行若干次,计算量很大,为减小计算量,便可采用改进的Euler 格式.3 程序设计(1)Euler 格式的算法及其程序设计 应用Euler 方法计算初值问题'(,),()y f t y y a η== a t b ≤≤的解()y t 在区间[],a b 上的N 个等距点的近似值的算法. 输入 端点,a b ; 区间等分数N; 初值η 输出 ()y t 在t 的N 个点处的近似值y1 step()/;;;h b a N t ayη←-←←2step对1,2,,,i N=做34step step-3 step(,);;y y hf t y t a ih←+←+4step输出(,)t y 5step停机例:求解初值问题 {'2/(0)1y y x yy=-=01x<<.源程序如下:# include <stdio.h># include <math.h>void main(){int i;double a,b,c,h,t,y,z;a=0;b=1;c=1;h=(b-a)/10;t=a;y=c;for(i=1;i<=10;i++){y=y+h(y-2*t/y);t=a+i*h;z=sqrt(1+2*t);printf("%f %f %f\n",t,y,z);}}运行结果如下:(2)改进的Euler 格式的算法及其程序设计应用改进的Euler 方法计算初值问题'(,),()y f t y y a η== a t b ≤≤的解()y t 在区间[],a b 上的N+1个等距点的近似值的算法.输入 端点,a b ; 区间等分数N; 初值η输出 ()y t 在t 的N+1个点处的近似值y .1step ()/;;;h b a N t a y η←-←←2step 输出(,)t y .3step 对1,2,,,i N =做45step step -4step (,);;(,);1().2p c p p c y y hf t y t a ih y y hf t y y y y ←+←+←+←+5step 输出(,)t y6step 停机下面用改进的Euler 格式计算上面的例题:求解初值问题 {'2/(0)1y y x y y =-= 01x <<. 源程序如下:# include <stdio .h># include <math .h>void main(){int i;double a,b,c,h,t,y,y1,y2,z;a=0;b=1;c=1;h=(b-a)/10;t=a;y=c;for(i=1;i<=10;i++){y1=y+h(y-2*t/y);t=a+i*h;y2=y+h(y1-2*t/y1);y=(y1+y2)/2;z=sqrt(1+2*t);printf("%f %f %f\n",t,y,z);}}运行结果如下:y和其数值从上面的运行结果可以看出,该常微分方程欧拉解法的精确解n y x很接近.由此可知,常微分方程欧拉解法对大量计算数据来说精度是很解()n高的,可以满足绝大多数工程上的要求.由于欧拉解法的稳定性和收敛性,可以通过减少h的值来进一步提高其精度.参考文献[1] 庆扬,王能超,易大义.数值计算方法[M].:华中科技大学,2006[2] 林成森.数值计算方法[M].:科学,2005[3] 信真,车刚明,欧阳洁,封建湖.计算方法[M].:西北工业大学,2000[4] 朱长青.数值计算方法及其应用[M].:科学,2006[5] 曾喆昭,文卉.数值计算[M].:清华大学,2005[6] 丽娟.常微分方程的Euler解法及其计算机实现[J].师学院学报(自然科学版),2005,24(6):11-14[7] 马燕,根耀,杜利锋,竹林.常微分方程的数值解法及其在计算机中的实现[J].大学学报(自然科学版),2000,19(2):23-25[8] 均亮,邓易冬,徐宏坤.基于C++的常微分方程欧拉解法的误差分析[J].信息技术,2007,7:92-94。

相关主题