1 大学数学实验 Experiments in Mathematics 实验 4 常微分方程数值解 清华大学数学科学系 为什么要学习微分方程数值解 ? 微分方程是研究函数变化规律的重要工具,有着广泛 的应用。如 : 物体的运动 , 电路的电压 , 人口增长的预测 ? 许多微分方程没有解析解,数值解法是求解的重要手 段,如 2 , dy yx dx = + () () xt axy yt axy by =? =? & & 实验4的基本内容 3. 实际问题用微分方程建模,并求解 2. 龙格 -库塔方法的 MATLAB实现 *4. 数值算法的收敛性、稳定性与刚性方程 1. 两个最常用的数值算法 : ? 欧拉( Euler)方法 ? 龙格 -库塔( Runge-Kutta)方法 实例1 海上缉私 海防某部缉私艇上的雷达发现正东方向 c海里处有一艘走私船 正以速度 a向正北方向行驶,缉私艇立即以最大速度 b(>a)前往 拦截。如果用雷达进行跟踪时,可保持缉私艇的速度方向始终 指向走私船。 ? 建立任意时刻缉私艇位置及 航线的数学模型 ,并求解 ; ? 求出缉私艇追上走私船的时间。 a 北 b c 艇船 实例1 海上缉私 建立坐标系如图 : t=0 艇在 (0, 0), 船在 (c, 0); 船速 a, 艇速 b 时刻 t 艇位于 P(x, y), 船到达 Q(c, at) 模型 : 0 y x c R(c,y ) α Q(c,at) P(x,y) b cos , sin dx dy bb dt dt α α== 22 22 () ()( ) () ()( ) dx b c x dt cx aty dy b at y dt cx aty ?? = ? ?+? ? ? ? ? = ? ?+? ? 由方程无法得到 x(t), y(t)的解析解 需要用数值解法求解 “常微分方程初值问题数值解”的提法 00 '(,),()yfxyyx y= =设 的解y=y(x)存在且唯一 不求解析解 y = y(x)(无解析解或求解困难 ) 12 n xx x< <<<LL而在一系列离散点 () ( 1,2,) n yx n= L n 求 的近似值y 通常取等步长 h 0n x xnh= + ? 0 x 0 y )(xyy = y x y 1 y 2 y n )( n xy 1 x 2 x n x 2 y P 0 x 0 x 1 x 2 x 3 x y=y(x) y 0 P 1 P 2 P 3 欧拉方法 00 '(,),()y fxy yx y== 基本 思路 1 [, ] nn xx + 在小区间 上 1 (, ) [ , ] nn fxy xx + 中的x取 内的某一点 1 '[( ) ()]/, nn yyx yxh + = ? 11 ( ) ( ) ( , ( )), [ , ] nn n yx yx hfxyx x x x ++ =+ ∈ x取不同点 各种欧拉公式 n x x取左端点 1 ()() (,() nnnn yx yx hfx yx + =+ 1 (, ), 0,1, nn nn yyhfxyn + =+ =L 向前欧拉公式 显式公式 11 (), ( ) nnn n yyxy yx ++ ≈≈ P 3 欧拉方法 11 ( ) ( ) ( , ( )), [ , ] nn n yx yx hfxyx x x x + + = +∈ 11 (), ( ) nnn n x yyxy yx + + ≈≈取右端点, 111 (, ),0,1, nn nn yyhfxyn ++ = +=L 向后欧拉公式 隐式公式 y P 0 x 0 x 1 x 2 x 3 x y 0 y=y(x) P 1 P 2 n+1 y右端 未知,需迭代求解 (0) 1 (, ) nn nn yyhfxy + =+初值 (1) () 111 (, 0,1,2, , 0,1,2, kk nn nn yyhfxy kn + +++ =+ ==LL () 11 lim k nn k yy ++ →∞ = 向前欧拉公式 向后欧拉公式 1 (, ) nn nn yyhfxy + =+ 111 (, ) nn nn yyhfxy + ++ =+ 二者平均得到 梯形公式 111 [( , ) ( , )], 0,1, 2 nn nn nn h yy fxyfxyn ++ =+ + = L 仍为隐式公式,需迭代求解 将梯形公式的迭代过程简化为两步 1 (, ) nn nn yyhfxy + =+ 预测 111 [( , ) ( , )], 0,1, 2 nn nn nn h yy fxyfxyn +++ =+ + = L 校正 改进欧拉公式 龙格-库塔方法 11 ( ) ( ) ( , ( )), [ , ] nn n yx yx hfxyx x x x + + =+ ∈ ? 向前,向后欧拉公式: 用 [x n , x n+1 ]内1个点的导 数代替 f(x, y(x)) ? 梯形公式,改进欧拉公式: 用 [x n , x n+1 ]内2个点导数的平均值代替 f(x, y(x)) 龙格-库塔方法的基本思想 在 [x n , x n+1 ]内多取几个点,将它们的导数加权平 均代替 f(x, y(x)), 设法构造出 精度更高 的计算公式。 常用的 (经典 ) 龙格 —库塔 公式 不足 :收敛速度较慢 1 1 1 2221 1 1 (, ) (, ) (, ),3,4, L nn i i nn nn i ininiij j yyhk kfxy kfxchychk kfxchychak i L λ + = ? = ? =+ ? ? ? = ? =+ + ? ? ??? ? ? =+ + = ? ? ∑ ∑ L L级 ?阶龙格 -库塔 方法的 一般形式 11234 1 21 32 43 (22 ) 6 (, ) (/2, /2) (/2, /2) (, ) nn nn nn nn nn h yy kkkk kfxy kfxhyhk kfxhyhk kfxhyhk + ? =+ + + + ? ? = ? ? =+ + ? ? =+ + ? =++? ? ? 1,10,1,, 1 11 =≤≤= ∑∑ ? == i j iji L i iijii acac λλ 满足 使精度尽量高 4级 4阶 微分方程组和高阶方程初值问题的数值解 欧拉方法和龙格 -库塔方法可直接推广到微分方程组 0000 (,,) (,,) () ,() yfxyz zgxyz yx y zx z ′= ? ? ′= ? ? = = ? 向前欧拉公式 ),,( yyxfy ′=′′ 1 yy= ? ? ? =′ =′ ),,( 212 21 yyxfy yy 高阶方程需要先降阶为一阶微分方程组 ? ? ? ? ? = += += + + L,2,1,0 ),,( ),,( 1 1 n zyxhgzz zyxhfyy nnnnn nnnnn 3 龙格 —库塔方法的 MATLAB 实现 T n T n fffxxxxtxxtftx ),(,),(,)(),,()( 1100 LL& ==== [t,x]=ode23(@f, ts, x0) 3级 2阶龙格 -库塔公式 [t,x]=ode45(@f, ts, x0) 5级 4阶龙格 -库塔公式 f是待解方程写成 的函数 m文件: function dx=f(t,x) dx=[f1; f2;… ; fn]; ts = [t0,t1, …,tf] 输出指定时刻 t0,t1, …,tf 的函数值 ts = t0:k:tf 输出 [t0,tf] 内等分点处的函数值 x0为函数初值 (n维 ) 输出 t=ts, x为相应函数值 (n维 ) 缺省精度(相对误差10 -3 ,绝对误差10 -6 ), 计算步长按精度要求自动调整. 实例 1 海上缉私(续) 模型的数值解 22 22 () ()( ) () ()( ) dx b c x dt cx aty dy b at y dt cx aty ?? = ? ?+? ? ? ? ? = ? ?+? ? (0) 0, (0) 0xy= = 0 y x c (x(t),y(t)) a b 设 : 船速 a=20 (海里 /小时 ) 艇速 b=40 (海里 /小时 ) 距离 c=15 (海里 ) 求 : 缉私艇的位置 x(t),y(t) 缉私艇的航线 y(x) x0=[0 0]; a=20;b=40;c=15; [t,x]=ode45(@jisi,ts,x0,[],a,b,c); %exact solution x1=c y1=a*t; %output t,x(t),y(t) [t,x,y1] %draw x(t),y(t) plot(t,x),grid, gtext('x(t)','FontSize',16), gtext('y(t)','FontSize',16),pause %draw y(x): the position of tatch js plot(x(:,1),x(:,2),'r*'),grid xlabel('x','FontSize',16), ylabel('y','FontSize',16) %Creat the function for jisi.m %Let x(1)=x, x(2)=y function dx=jisi(t,x,a,b,c) s=sqrt((c-x(1))^2+(a*t-x(2))^2); dx=[b*(c-x(1))/s;b*(a*t-x(2))/s]; MATLAB 6.5.1.lnk jisi.m, seajisi.m 实例 1 海上缉私(续) 模型的数值解 a=20, b=40, c=15 走私船的位置 x 1 (t)= c=15 y 1 (t)=at=20t t=0.5时缉私艇追上走私船 0 5 10 15 20 0 2 4 6 8 10 x y 缉私艇的航线 y(x) 9.997915.00460.50 8.027314.74510.45 6.177313.98060.40 4.555212.81700.35 3.200511.34960.30 2.11789.67050.25 1.28997.85150.20 0.69065.94450.15 0.29243.98540.10 0.06981.99840.05 000 y(t)x(t)t 10.0 9.0 8.0 7.0 6.0 5.0 4.0 3.0 2.0 1.0 0 y 1 (t) 实例 1 海上缉私(续) 模型的数值解 设 b, c不变, a变大 为 30, 35, … 接近 40, 观察解的变化 : a=35, b=40, c=15 t=? 缉私艇追上走私船 56.055.948614.98661.6 52.552.014615.00231.5 49.048.018315.01171.4 45.544.016514.99961.3 42.040.016414.99861.2 ………… 17.512.083013.75510.5 14.08.275512.53840.4 10.54.828310.52400.3 7.02.13087.59280.2 3.50.50583.95610.1 0000 y 1 (t)y(t)x(t)t 累 积误差较大 提高精度! 实例 1 海上缉私(续) 模型的数值解 a=35, b=40, c=15 opt=odeset('RelTol',1e-6, 'AbsTol',1e-9); [t,x]=ode45(@jisi,ts,x0,opt); t=1.6时缉私艇追上走私船 0 5 10 15 20 0 20 40 60 x y 缉私艇的航线 y(x) 判断 “追上 ”的有效方法 ? 56.055.99993115.0000201.6 52.552.00000514.9999981.5 49.048.00000514.9999931.4 45.544.00000514.9999631.3 42.040.00000514.9996161.2 ………… 17.512.07534413.7539740.5 14.08.26984012.5394540.4 10.54.82930810.5219210.3 7.02.1306787.5928220.2 3.50.5058133.9561040.1 0000 y 1 (t)y(t)x(t)t 4 实例 1 海上缉私(续) 模型的解析解 2222 )()( )( , )()( )( yatxc yatb dt dy yatxc xcb dt dx ?+? ? = ?+? ? = )( xc yat dx dy ? ? = aty dx dy xc =+? )( 2 2 () dy dt cx a dx dx ?= ds b dt = 22 () ()ds dx dy=+ 2 2 2 () 1() dy a dy cx dx b dx ?=+ dx dy p =令 b a kpk dx dp xc =+=? ,1)( 2 (0) 0p = 实例 1 海上缉私(续) 模型的解析解 2 1)( pk dx dp xc +=? (0) 0p = 2 1() k cx pp c ? ? ++= 2 1() k cx pp c ? +?= 1 [( ) ( ) ] 2 kk cx cx p cc ? ?? =? /1kab= < (0) 0y = 11 2 11 [() ()] 21 1 1 kk ccx cx kc y kc kc k +? ?? =?+ + ?? 缉私艇的航线 y(x)的解析解 x=c时 缉私艇追上走私船的 y坐标 缉私艇追上走私船的时间 : 1 22 bc t ba = ? a=20, b=40, c=15 → t 1 =0.5 a=35, b=40, c=15 → t 1 =1.6 222 1 kc abc y kba == ? ? 微分方程数值解法的误差分析 数值解法 : 计算微分方程精确解 y(x n )的近似值 y n 按照步长 h一步步计算 , 每步都有误差 ; 每一步的误差会逐步积累, 称 累积误差 . 讨论计算一步出现的误差 假定 y n = y(x n ) , 估计 y n+1 的误差 : y(x n+1 )- y n+1 局部截断误差 误差分析 估计欧拉公式的局部截断误差 y(x n+1 )在 x n 处作 Taylor展开 : )()( 2 )()()( 3 2 1 hOxy h xyhxyxy nnnn +′′+′+= + 向前欧拉公式 1 (, ) nn nn yyhfxy + = + y n = y(x n ) )()())(,()( 1 nnnnnn xyhxyxyxhfxyy ′+=+= + 2 32 111 () ()() () 2 nnn n h T yx y y x Oh Oh +++ ′′=?= += 局部截断误差主项为 )( 2 2 n xy h ′′ 误差分析估计欧拉公式的局部截断误差 )()( 2 )()()( 3 2 1 hOxy h xyhxyxy nnnn +′′+′+= + 向后欧拉公式 ),( 111 +++ += nnnn yxhfyy 2 32 111 () ()() () 2 nnn n h Tyx y yxOhOh +++ ′′=?=? += 局部截断误差主项为 )( 2 2 n xy h ′′? 梯形 公式 向前、向后欧拉公式的平均 3 43 1 () () () 12 nn h TyxOhOh + ′′′=? + = x n x n+1 x y P n A Q B 误 差 分 析 算法 精度的阶 的定义 一个算法的局部截断误差为 O(h p+1 ) 该算法具有 p阶精度 局部截断误差 精度 向前欧拉公式 O(h 2 ) 1阶 向后欧拉公式 O(h 2 ) 1阶 梯形公式 O(h 3 ) 2阶 改进欧拉公式 O(h 3 ) 2阶 经典龙格-库塔公式 O(h 5 ) 4阶 5 实例 2 弱肉强食 问 题 自然界中同一环境下两个种群之间的生存方式 相互竞争 相互依存 弱肉强食 弱肉 强食 种群甲靠丰富的自然资源生存 食饵(Prey) 种群乙靠捕食种群甲为生 捕食者(Predator) 两个种群的数量如何演变? 实例 2 弱肉强食 模型 食饵 (甲 ) 的密度 x(t), 捕食者 (乙 )的密度 y(t) 0,/ >= rrxx& 甲独立生存的增长率 r 0,/ >?= aayrxx& 乙使甲的增长率减小, 减小量与 y 成正比 0,/ >?= ddyy& 乙独立生存的死亡率 d 0),(/ >??= bbxdyy& 甲使乙的死亡率减小, 减小量与 x成正比 00 () () (0) , (0) xrayxrxaxy ydbxydybxy xxyy =? =? ? ? =? ? =? + ? ? == ? & & Volterra模型 x(t), y(t)无解析解 实例 2 弱肉强食 模型的数值解 ? ? ? ? ? == +?= ?= 00 )0(,)0( yyxx bxydyy axyrxx & & 00 1, 0.5 0.1, 0.02 25, 2 rd ab xy == == == 0 5 10 15 0 20 40 60 80 100 x(t) y(t) 0 20 40 60 80 100 0 5 10 15 20 25 30 x y 猜测 x(t), y(t)是周期函数 ; y(x)是封闭曲线 数值积分计算一个周期的平均值: 25, 10xy≈≈ MATLAB 6.5.1.lnk shier.m, shier1.m ybxd xayr dy dx )( )( ?? ? = 实例 2 弱肉强食 模型的解析解 ? ? ? ??= ?= ybxdy xayrx )( )( & & ceyex ayrxxd = ?? ))((相轨线 dy y ayr dx x bxd ? = +? c由初始条件确定 相轨线是封闭曲线 (c在一定范围内 ) 求 x(t),y(t)一周期的平均值 : yx , 可以 证明 ybxdty )()( ??=& bdyytx /)/()( += & ∫ = T dttx T x 0 )( 1 b d x = x(t), y(t)是周期函数 (周期记作 T) ) )0(ln)(ln ( 1 b dT b yTy T + ? = 实例 2 弱肉强食 模型的解析解 r y a =x(t),y(t)一周期的平均值 : b d x = 02.0,1.0,5.0,1 ==== badr 10,25 == yx r ~食饵增长率 a ~捕食者对食饵的捕获能力 d ~捕食者死亡率 b ~食饵对捕食者的喂养能力 结果解释 ? ? ? ??= ?= ybxdy xayrx )( )( & & 与计算结果同 ↑?↓↑ yar , ↑?↓↑ xbd , 既相互制约 又相互依存 欧拉和龙格 -库塔方法的共同点 :只用 y n 计算 y n+1 1 00 (,,) () nn nn yyhxyh yyx ? + =+? ? = ? 单步法 步长 h→0时数值解 y n 无限接近解析解 y(x n ) 收敛性 单步法有 p阶精度 (局部截断误差 O(h p+1 )) (, ,) (, ,) ( 0)xyh xyh Ly y L??? ≤? > 向前欧拉公式 改进欧拉公式 4阶龙格-库塔公式 数值算法的收敛性和稳定性 (显式)单步法: 整体误差 e n =O(h) e n =O(h 2 ) e n =O(h 4 ) 单步法收敛 整体误差 e n =y(x n )-y n =O(h p )→0 (h→0) 6 数值算法的收敛性和稳定性 稳定性 计算中舍入误差不会随步数的增加无限增大 L,2,1, =≤ + k nkn εε y n 的误差 ε n ),( yxfy =′ λ>0→微分方程稳定 ),( 1 nnnn yxhfyy += + 向前欧拉公式 向后欧拉公式 11nn n yyhyλ ++ =? 经典龙格-库塔公式 2.785/h λ≤ 算法稳定 ))(,())(,(),( ******** yyyxfxxyxfyxfy yx ?+?+=′ 0, >?=′ λλyy (特征根 -λ) nn h ελε )1( 1 ?= + nk n ε ε + ≤ 11hλ? ≤ 2/h λ≤ 1 1 1 nn h ε ε λ + = + h任意 x yce λ? = n yh )1( λ?= 刚性现象与刚性方程 bxaxrktfrxxkx ==>=++ )0(,)0(),0,()( &&&& 振动系统或电路系统的数学模型现象 k=2000.5, r=1000, a=1, b=-1999.5, f(t)=1 瞬态解与稳态解 e -2000t ~快瞬态解 e -t/2 ~慢瞬态解 计算到 t=0.005时已衰减到 4.5×10 -5 计算到 t=20时才衰减到 4.5×10 -5 精度达到 10 -4 需算到 t=20(由慢瞬态解 λ=1/2决定 ) 选取步长 h由快瞬态解 λ=2000决定 h<2.785/2000=0.0014 龙格 -库塔公式 t=20需 14286步 快 、 慢瞬态解的特征根相差悬殊 2000 / 2 () 1 tt xt e e ?? = ?+ 刚性现象( Stiff) 求稳 态解 刚性现象与刚性方程 刚性 方程 振动、电路及化学反应中的线性常系数方程组 n RxtfAxtx ∈+= ),()(& A的特征根 λ k (k=1,2,… ,n) 的实部 Re(λ k )<0 max Re( ) min Re( ) k k k k s λ λ = ~快瞬态解大)Re( k λ ~慢瞬态解 小)Re( k λ ~刚性比 快瞬态解 →步长充分小 慢瞬态解 →积分区间长 s>10 刚性非线性方程组 线性常系数方程组 传统的数值方法无能为力 线性化方法 刚性方程 刚性现象与刚性方程 刚性方程的 MATLAB求解 ode23, ode45 解刚性方程的困难 步长自动变小 计算时间很长 求解刚性方程的命令 : ode23s, ode15s 等 (用法相同) 11 2 66 212 12 2 (10 1) (10 2) (0) 10 / 4, (0) 10 / 4 1/ 2 xx x x xx =+? ? =? + ? + ? ? ==? ? & & 例 特征根 λ 1 =-1,λ 2 =-10 6 刚性比 s=10 6 6 6 6 10 1 66 10 2 10 () ( 1) 4 10 (10 1) () ( 1) 42 tt tt xt e e xt e e ?? ?? ? =+? ? ? ? + ? =? + + ? ? 解析解 MATLAB 6.5.1.lnk Stiff.m,stiff1.m 布置实验 目的 1.用 MATLAB软件掌握求微分方程数值解的方 法,并对结果作初步分析; 2.通过实例学习用微分方程模型解决简化的实际问 题。 内容 课上布置,或参见网络学堂