刚性常微分问题的数值解法及编程.docx

上传人:b****4 文档编号:24802242 上传时间:2023-06-01 格式:DOCX 页数:22 大小:209.67KB
下载 相关 举报
刚性常微分问题的数值解法及编程.docx_第1页
第1页 / 共22页
刚性常微分问题的数值解法及编程.docx_第2页
第2页 / 共22页
刚性常微分问题的数值解法及编程.docx_第3页
第3页 / 共22页
刚性常微分问题的数值解法及编程.docx_第4页
第4页 / 共22页
刚性常微分问题的数值解法及编程.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

刚性常微分问题的数值解法及编程.docx

《刚性常微分问题的数值解法及编程.docx》由会员分享,可在线阅读,更多相关《刚性常微分问题的数值解法及编程.docx(22页珍藏版)》请在冰豆网上搜索。

刚性常微分问题的数值解法及编程.docx

刚性常微分问题的数值解法及编程

创新实验论文

题目:

刚性常微分问题的数值解法

课程名称:

创新实验

学院:

理学院

专业:

数学与应用数学

年级:

应数131

学号:

1307010239234236

姓名:

袁蕊张蕾刘霖

指导教师:

罗贤兵

2015年07月14日

第一章绪论3

选题背景3

刚性问题的算法3

引言4

第二章刚性问题5

第三章预备知识8

第四章计算实验15

附页20

第一章绪论

自然界和工程技术的很多现象,其数学模型是常微分方程(组)的初值问题,普通的常微分方程的数值解法已经比较成熟,理论比较完整,也有许多方法可供选择。

但,有一类常微分方程组,求解值时遇到相当大的困难,这类常微分方程组解的分量有的变化很快,有的变化缓慢,常常出现这种现象:

变化快的分量很快趋于它的稳定值,而变化慢的分量缓慢趋于它的稳定值。

从数值解的观点看来,当变化快时应该用小步长积分,当变化快的分量已趋于稳定,或者说已经没有变化快的分量时就应该用较大的步长积分,但是理论和实际都说明,很多方法特别是显示方法的步长任不能放大,否者便出现数值不稳定现象,即误差急剧增加,已致掩盖了真解,使求解过程无法继续进行。

常微分方程组的这种性质叫做刚性,我们考虑一阶常微分方程初值问题的数值解法。

誉f(x,y)a*b(1.1)

.y(a)二y。

常微分方程的解能用初等函数、特殊函数或它们的级数与积分形式表达的非常之少,用解析办法只能求解线性常系数等特征类型的常微分方程。

在实际问题中归

结出来的求解微分方程的方法只要依靠数值解法。

所谓数值解法,就是通过某种

离散化办法,将微分方程转化为差分方程来求解。

求方程(2-1)的数值解,

即对一系列离散节点

a=Xo

建立求y(Xn)的近似值yn的递推格式,由此求得解y(x)在各节点的近似值,

n=0,1,2,…。

相邻两个节点的间距h二人q-xn称为步长,这时节点x^x0nh。

因此,这样得到的数值解法也称为差分方法。

初值问题(1.1)的数值解法,可区分为两大类:

(1)单步法:

此类方法在计算Xm上的近似值yn1时只用到了前一点禺上的信息。

女口Euler法、Runge-Kutta法和Taylor级数法这就是这类方法的典型代表。

(2)多步法:

此类方法在计算时,除了需要xn点的信息外,还需要

xn4,Xnj,…前面若干个点上的信息。

线性多步法是这类方法的典型代表。

本文讨论的是几种隐式方法(向后欧拉,梯形公式,改进欧拉)和隐式

Runge-Kutta

选取的步长h必须很小,线性常微分方程初值问题

第二章刚性问题

满足hv1/100,才能保证绝对稳定性要求。

对于非

若初值问题是稳定的,即

V=f(x,y(x)),a兰x兰b,

、y(x°)=y°,y°eRm,

dy/dx<0.用欧拉法进行数值求解时,h应满足

cf卄

1+——h<1。

若M

在方程组的情况下,

cf

cy

h应满足h=2/M。

例如一阶常系数线性方程组

Uy

dxy

y(a)二y。

这里的A=ajss,

y=力山…ysT.记A的特征值为「,匕,…丄,对稳定的初值

问题应满足Re-<0.用欧拉法数值求解时,为了保证计算的稳定性,h的选取

2

应满足h<

max打

1&总

maxRe為

由下面的例子可以知道,当比值很大时,h很小,这时计算不熟

mn〔Re却很多,耗时很长,给实际计算带来了很大的困难。

例,某一物理现象可归结为一个线性方程组

其中x为时间变量,而A=

■i=-1,'2~-401■i,,3二-401-

[y(0)=(1,0,-1「

(1.2)

C21

19-20"

19

-2120

A的特征值分别为

<40

—40—40』

i)。

方程(2-11)

的解为

也Ay

 

11

y_!

(x)=-exp(一2x)+3(cos40x+sin40x)exp(-40x)

(1.3)

11

*y2(x)=—exp(-2x)-一(cos40x+sin40x)exp(」40x)

22

y3(x)=-(cos40x—sin40x)exp(-40x)

我们对解式(1.3)编程作图,可以看出这组解在开始时刻变化激烈,随后逐渐进入稳态,对应于入2,打的分量在解中的作用随时间x的推移越来越显得无足

轻重。

解式(1.3)程序和图像曲线(图1)如下面所示解程序:

h1=ezplot('(1/2)*exp(-2*x)+(1/2)*(cos(40*x)+sin(40*x))*exp(-40*x)');axis([01-11.5]);

holdon;

h2=ezplot('(1/2)*exp(-2*x)-(1/2)*(cos(40*x)+sin(40*x))*exp(-40*x)');axis([01-11.5]);

set(h2,'Color','r')

holdon;

h3=ezplot('-(cos(40*x)-sin(40*x))*exp(-40*x)');

axis([01-11.5]);

set(h3,'Color','k')

holdonlegend('y1','y2','y3')

图像:

图一

 

由于在开始的一段时间量x,解曲线变化激烈,对方程进行数值求解时,自然要求数值有较高的精度,而对较大的时间量x,解曲线变化缓慢,因此,对数

值方法的精度不必苛刻的要求,但就数值方法的稳定性而言,它并不随时间量x

的大小而改变。

例如对初值问题(1.2)用欧拉折现法,步长必须满足hv—^=辺壯0.035,这样小的步长对于较大的求解区间是难以接受的。

我们

maxl^40

看到,步长主要受特征值九2=k3=40/2的限制,如前所述,正是这两个特征

定义1.若线性系统式(2-11)中A的特征值r满足条件

(1)Rei:

0,i=0,1,,m

maxRei

(2)R=J_|i〉〉1

称式(1.2)为刚性方程,比值R为刚性比。

第三章预备知识隐式方法

1.1欧拉公式(显示)

考虑初值问题

化。

设h詁-x/i=1,2…),将式(1.4)离散化的办法有Taylor展开法、数值

微分法及数值积分法如果在点Xn将y(Xn1)=y(Xn,h)做Taylor展开,得

y(Xn1),并注意到y(Xn)二f(Xn,y(Xj),便得

 

在(1.8)若用yn近似替代y(Xn)、yn1近似替代yX彳),同样得到递推公式(1.7).

如果在[Xn,Xn1]上对y"=f(X,y(X))积分,得

y(Xn1)-y(Xn)二f(X,y(X))dX.(1.9)

那么对上式右端积分用左矩形求积公式,并用yn近似替代y(Xn)、yn1近似替代

y(Xn1),也可得递推公式(1.7).

我们知道,在xOy平面上,微分方程dy=f(x,y)的解称为积分曲线,积分

dX

曲线上一点(x,y)的切线斜率等于函数f(x,y)D的值。

如果D中每一点,都画上一条以f(x,y)在这点的值为斜率并指向x增加方向的有向线段,即在D上作出了一个由方程dy=:

f(x,y)确定的方向场,那么方程的解f=y(x).从几何dx

上看,就是位于此方向场中的曲线,它在所经过的每一点都与方向场的该点的方向一致。

从初始点P0(xo,yo)出发,过这点的积分曲线为y=y(x),斜率为f(X0,y°).设在x=x°附近y(x)可用过Po点的切线近似表示,切线方程为y=y°•f(Xo,y°)(x-Xo).当x=Xi时,y(xj的近似值为y°•f(心yo)(%-x°),并记为yi,这就是得到x=%时计算y(xj的近似公式

y二yif(洛,%)&-为).

当x=X2时,y(X2)的近似值为yi•f(xi,yJ(X2-xj,并记为y•于是就得到当

X=X2的近似公式

丫2*1f(为,%)卜2-Xi).

重复上面方法,一般可得当X=Xn彳的计算y(XnJ的近似公式

yni二ynf(Xn,yn)(Xni—Xn).

如果h=Xj-Xi/i=i,2…),则上面公式就是(i.7).将P°,P,…,Pn连续起来,就得到一条折线,所以Euler方法又称为折线法。

由公式(i.4)看出,已知yo便可算出力.已知yi,便可算出七,如此继续下去,这种只用前一步的值yk便可计算出y「的递推公式称为单步法。

i.2向后欧拉公式(隐式)

yn替代

若在(1.6)中,其右边的积分由数值积分的右矩形公式近似,并用

y(Xn)替代y(Xn1),则可得到

(i.io)

乂=y(Xo)

■:

yn1=ynhf(Xni,yni)

并称(i.io)为后退Euler公式。

i.3梯形公式(隐式)

yn替代

若在公式(i.6)中,其右边积分用数值梯形积分公式近似,并用

y(Xn),yni替代f(Xni),则可得到梯形方法公式

h

yn1-yn2[f(xn,yn^f(xn1,yn-1)](1.

梯形方法同头退Euler方法一样都是隐式单步法。

对于隐式方法,通常采用迭代法。

对后退Euler方法,先Euler方法计算y.i,并将它作为初值,即

yn0)i.=y0hf(xn,yn),再把它代入(1.7)的右端,便得到后退Euler方法的迭

代公式为

<(0)

(1.12)

yn41=yn+hf(xn,yn)

(k+)丄-七/(k)

yn*=yn+hf(Xn卅ynd

同样地,仍用Euler方法提供初始值,梯形方法的迭代公式为

yn)i*nhf(Xn,yn)

(1.13)

k=0,1,

h

yn「=yn+?

[f(Xn,yn)+f(禺杯y^)]

1.4改进欧拉(隐式)

yn1=ynhf(Xn,yn)

yn+=yn+§(f(Xn』n)+f(Xn*,yn卅)

1.5Runge-Kutta法

龙格-库塔方法的基本思路是想办法计算f(x,y)在某点上的函数值,然后对这些函数值做数值线性组合,构造出一个近似的计算公式;再把近似的计算公式和解的泰勒展开式相比较,便得前面的若干项相吻合,从而达到较高的精度,一

般的显示R-K方法的形式如下:

r

yn41=yn灼iki

*=hf(Xn,Yn)(1.14)

i-4

ki=hf(Xn+dh,yn+迟0jkj),(2MiMr)

Ljm

当式(1.14)的布局截断误差达到O(hp1)时成公式(1.14)为p阶r段R-K方法。

类似于显示方法我们可以得到Runge-Kattu隐式方法

r

yn1二ynh''iki

(i=1,2,r)

i#

常用隐式R-K方法:

1级2阶中点公式:

yn^=yn+hfxn+^h,——)

l22丿

2级2阶梯形公式:

yn1=ynhfXn,ynfX.1,『n1

hyn^=yn+?

(Ki+K2)

2级4阶R-K公式:

<6412

K2=fxn+A^h,yn+3_2<3知+丄如

6124

在Matlab中,专门提供勒求解微分方程的ode函数,如ode45,ode23,ode113,ode15s,ode23s等等。

Ode求解器分为变步长和固定布场两种求解模式,其中,ode45是采用R-K法的变步长求解器,和它一样的还有ode23。

目前,ode45是

使用最多的求解函数,主要用于求解非刚性常微分方程。

(如果求解时长时间没

有相应,贝U方程是刚性的,可以换用ode23求解),ode函数的调用方式大都类

似,以ode45为例,常用的语法格式有:

[T,Y]=ode45(odefun,tspan,yO);

函数

问题类型

精确度

说明

ode45

非刚性

中等

米用算法为4-5阶Runge-Kutta法,大多数情况下首选的函数

ode23

非刚性

基于Bogacki-Shampine2-3阶Runge-Kutta公式,在精确要求不咼的场合,以及对于轻度刚性方程,ode23的效率可能好于ode45

ode113

非刚性

低到高

基于变阶次Adams-Bashforth-MoutlonPECE算法。

在对误差要求严格的场合或者输入参数doefun代表的函数本身计算量很大情况比ode45效率咼。

ode113可以看成一个多步解算器,因为它会利用前几次时间节点上的解计器当前时间节点的解。

因此它不适应与非连续系统。

ode15s

刚性

低到中

基于数值差分公式(后向差分公式,BDFs也叫Gear方

法),因此效率不是很高。

同ode113一样,ode15s也是一个多步计算器。

当ode45求解失败,或者非常慢,并且怀疑问题是刚性的,或者求解微分代数问题时可以考虑用ode15s

ode23s

刚性

基于修正的二阶Rosenbrock公式。

由于是单步解算器,当精度要求不咼时,匕效率可能会咼于ode15s。

他可以

解决一些ode15s求解起来效率不太咼的刚性冋题。

ode23t

适度刚

ode23可以用来求解微分代数方程。

ode23tb

刚性

当方程是刚性的,并且求解要求精度不高时可以使用。

第四章实验计算

例如:

刚性常微分方程

y(x)=-15y(x)

y(0)=1

这个初值问题的解析解为yx二e」5x,那么它在0.1处的解为?

解:

理论解:

1.向后欧拉(隐式)源程序

functiony=Euler_2(fun,x0,y0,xN,N)

x=zeros(1,N+1);y=zeros(1,N+1);x

(1)=x0;y

(1)=y0;

h=(xN-x0)/N;

forn=1:

N

x(n+1)=x(n)+h;

z0=y(n)+h*feval(fun,x(n),y(n));fork=1:

3

z1=y(n)+h*feval(fun,x(n+1),z0);ifabs(z1-z0)<1e-3break;

endz0=z1;

end

y(n+1)=z1;

end

T=[x',y']

functionz=f(x,y)

z=-15*y;

迭代100次

j电rrrn<»mrtpupwvtruw*■v

»Euler_2(#0,130,L100),

Columns池throith卵

D.Z50O5159X29SE:

0.鬲血閘彌轩闾fl.:

5O1$23W6O5S59

Colukns99throujhlGl

1232525K00721430.2290miS54B»270.22570560;634C3

■■_■

迭代1OOOO次

fx»Euler.aC,0,1,04h10000)

Columns9997through9998

0.2232891920L19670.223255703657172

Columns9999thrmigh10000

0.223222*********0.22318S742OU328

Column10001

0.223155268724772

源程序作图比较:

(红色线是迭代的结果,蓝色线是准确值)functiony=Euler_2(fun,xO,yO,xN,N)

x=zeros(1,N+1);y=zeros(1,N+1);

x

(1)=xO;y

(1)=yO;h=(xN-xO)/N;

forn=1:

N

x(n+1)=x(n)+h;

zO=y(n)+h*feval(fun,x(n),y(n));

fork=1:

3

z1=y(n)+h*feval(fun,x(n+1),z0);

ifabs(z1-z0)<1e-3

break;

end

z0=z1;

end

y(n+1)=z1;

end

T=[x,y];

plot(x,y,'r')

CommandWindow

5uler_S('0,1,(J.13100);

axiS{[0D.10.2(LG):

holdw;

色Let「(一15#ie■'j[OjC.1]J;

axis(CO0.10.20,引)

由图可看出当取端点较小迭代次数较大时,误差较小。

2.梯形公式(隐式)源代码

functiony=Euler_3(fun,xO,yO,xN,N)

x=zeros(1,N+1);y=zeros(1,N+1);

x

(1)=x0;y

(1)=y0;h=(xN-xO)/N;

forn=1:

N

x(n+1)=x(n)+h;

z0=y(n)+h*feval(fun,x(n),y(n));

fork=1:

3

z1=y(n)+h/2*(feval(fun,x(n),y(n))+feval(fun,x(n+1),z0))

J

ifabs(z1-z0)<1e-3

break;

end

z0=z1;

end

y(n+1)=z1;

end

T=[x',y']

functionz=f(x,y)

z=-15*y;

迭代次数100次

Euler3(JzJ鼻0〉0.1j

100);

0.0950000000000001

0.240521461194936

0.0960000000000001

0.236940697931545

0,0970000000000001

0.23341324329109

0.0980000000000001

0.229933303631593

0.0390000000000001

0.226515097136278

0.1

0.223142853627662,

迭代次数10000次时

Euler3Cz,0,1,0,1,10000)

C^luuis5HOthjoufhSJS6

AlM晰加354

i.zzn&isTiim

ColwuisSWTthiMchIKK)]

氐洱32融衲TIM

fl,2232M5925:

1⑸軒】W49犬1

叽229】63血皿啪

«.223IN16UOM;S

3.改进欧拉公式(隐式)源代码

functiony=Euler_4(fun,xO,yO,xN,N)

x=zeros(1,N+1);y=zeros(1,N+1);

x

(1)=x0;y

(1)=y0;h=(xN-xO)/N;

forn=1:

N

x(n+1)=x(n)+h;

z0=y(n)+h*feval(fun,x(n),y(n));

y(n+1)=y(n)+h/2*(feval(fun,x(n),y(n))+feval(fun,x(n+1),z0));end

T=[x',y']

functionz=f(x,y)

z=-15*y;

迭代次数100次时

Euler4Cz\0;l30.b100)

迭代次数10000次时

Euler_4CzJ』0?

1』0.1,10000}

C^lunfit9990thicMh9的百

d盟翼9軸就:

1林:

九2口4捕10:

如3枱042X31$帥射曲3也M口仙0:

第14篦40{餡斯4苏1H別齋

C»lwuu999Tfhitujh10^0]

4h223»40:

HT14SI也就扯酋0.£»]»?

]I04S3T1«.?

231634^433103»3l30ieH03«:

4

R-K隐式4阶方法

1.源程序

functionR=rk4(f,a,b,ya,yb,N);

T=a:

h:

b;

Y

(1)=ya;

forj=1:

N

K1=feval(f,T(j)+h*(3+3A(1/2))/6,Y(j)+k1*1/4+k2*(3+2*3A(1/2)))/12;

K2=feval(f,t(j)+h*(3-3A(1/3))/6,y(j)+k1*(3-2*3A(1/2))/12+k2*1/4);

Y(j+1)=Y(j)+(k1+k2)/2;

end

R=[T'Y']

functionz=f(x,y)

z=-15*y;

>>rk4('f',0,0.1,1000)

0*240521461184936

0.236940697931545

0.23341324329109

0,229938303631593

0.226515097136278

0.223142853627662.

0*0950000000000001

0.0960000000000001

0,0970000000000001

0,0980000000000001

.0990********

0.1

总结:

经多次试验发现向后欧拉,梯形公式,改进欧拉公式都是取端点越小迭代次数越大时,越接近于准确值。

当放大端点值时也应增加迭代次数。

在取端点值一样且迭代次数一样时,梯形公式和改进欧拉公式比向后欧拉更接近于准确值。

但在计算端点较大时,他们不太实适用,因为耗时长。

Runge-kutta解此刚性常微分方程组比较使适用。

所以隐式R-K方法是解刚性常微分一般方法。

【1】黄云清

【2】张德峰

【3】袁兆鼎

参考文献

舒适等著数值计算方法2009

著Matlab数值分析与应用2007

等著刚性常微分方程初值问题的数值解法1987

论文

成绩

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1