第36卷 2O14年4月 湖州师范学院学报 Journal of Huzhou University Vo1.36 Apr.。2014 两类基于MATLAB的 非线性微分方程数值解的算法研究 薛亚宏 (甘肃工业职业技术学院电信学院,甘肃天水741025) 摘要:通过对工程动态控制及计算机仿真中有重要应用的两类非线性微分方程数值解的数学算法分析,建立四 阶定步长Runge—Kutta及Lorenz模型数值解的MATLAB算法结构,讨论了变步长情形下的误差控制,绘制了 基于MATLAB的Lorenz系统数值解在二维和三维空间下的图形,提出了在可接受误差限内的数值解检验的基 本思路. 关键词:MATLAB;非线性微分方程;数值解;算法;误差 中图分类号:G71 MSC(2000):65L14 文献标识码:A 文章编号:1009—1734(2014)04—0019—05 0 引言 “数值分析”是计算数学的主要内容,其研究范围几乎涉及数学科学的一切分支,反过来很多数学分支 都需要探讨适用计算机的数值方法.在数值计算理论中,一般非线性微分方程的解析求解相当困难,在实 际应用和理论分析中往往求其数值解.同时,非线性微分方程的数值解问题及算法实现在工程动力系统控 制、人口统计、经济学、计算机仿真、数学建模等领域有十分重要的应用.本文将研究一般非线微分方程问 题数值求解的算法、误差、步长等问题,以及四阶定步长Runge—Kutta及其改进型的算法和Lorenz模型 数值求解等较为系统的方法,给出基于实变量运算结果的图形界面. 1 非线性微分方程的数值算法概述及误差与步长 1.1 一般微分方程数值解概述 一般微分方程的数值解法多数是关于微分方程初值问题的数值解法,这类问题用一阶显式微分方程 主(£)一f(t,z(£)), 组可描述为: 其中:z (£)=[ (£),z z(t),…,z (£)]为状态向量;f (・)一Ef (・),fz(・),…,f (・)]为任意非线性 函数uJ. 在初值问题中,若已知初始状态z。一Ix (O),… (0)] ,用数值求解法求出在t∈EO,tf]内各个变 量状态 (£)的数值,t,又称为终止变量. 1.2 多元非线性微分方程数值算法及误差与步长 1.2.1 初值问题的数值算法 对于多元非线性微分方程初值问题,Euler算法是较其它算法更易理解和控制的一类,在解决复杂微 分方程数值求解中被广泛采用.下面基于MATLAB以Euler算法为例,给出非线性微分方程初值问题的 数值算法. * 收稿日期:2014—02—10 通讯作者:薛亚宏,讲师,硕士,研究方向:数学与应用数学.E—mail:2353866360@qq.corn 20 湖州师范学院学报 第36卷 设已知在t o时刻系统状态向量的值为 (£。),若选择一个较小的计算步长h,则微分方程左侧的导数 近似为: z(t o+h)一z(£0) ( o+h)~t。 。 代入微分方程得时刻方程的近似解为: 主( 0+h)一z(£0)一hf(t 0,.7C(£0)). 由于近似解误差的存在,可将t。+h时刻系统状态向量的值表示为: z(t 0+h)一z(t o)+hf(£,z(£。))+R 0, 或记为.7C 一z(£。+h),则主 一王( 。+ )为系统状态向量在t。+^时刻的近似值,即数值解 引.其中R。为 数值解的舍入误差. 一般地,设在t 时刻系统的状态向量为z ,则在t +h时刻Euler算法的数值解可写为: +1一z +hf(£, ^). 对于上述一般数值的求解表达式,用迭代法可由给定的初值问题逐步求出在t∈Eo,T3内各时刻 t。+ ^(忌一1,2,…, )处的原始数值解. 1.2.2数值解的精度控制及变步长影响因素 变步长对精度与速度会产生直接的影响.提高数值解精度的一种有效方法是减小步长值,但步长值连 续递减会产生以下问题: (1)降低运算速度.对选定的求解时限,减少步长等价于增加在固定时间区段内的计算点的数量,直 接导致了计算速度的急剧下降. (2)扩大累积误差.由于数值解固有误差,既使选择很小的步长,所得的数值解都将伴随一个舍入误差. 同时,减小步长会增加循环次数,从而使舍入误差的叠加的传递次数增多,最终形成较大的累积误差 ]. 舍入误差、累积误差和总误差关系如图1所示. 计算 误差 图1误差示意图 Fig.1 Schematic error 步长JjI 图2变步长示意图 Fig.2 Schematic variable step size 在多元非线性微分方程中,步长与误差是一对矛盾,对因变步长产生的误差进行有效控制也是非线性 微分方程数值求解的一项重要内容. 根据实际问题的算法和精度要求,可采用以下途径: (1)选择适当的步长.采用类似Euler的简单算法时,步长要适中,遵循宁小勿大的原则。 (2)改进近似算法的精度.由于Euler算法只是将原积分问题转为梯形法近似求解,因其精度较低而 不能有效逼近原始问题.可采用复合Simpson法或更精确的样条插值法取代Euler算法,其中以Runge— Kutta法、Adams法最为常见. (3)采用变步长法.在多元微分方程数值解运算中,很多方法可通过变步长求解,若误差较小则增大 步长,若误差较大则自动减小步长,从而精确、有效地求解微分方程的初值问题. 厶 一般变步长算法的原理如图2所示.已知t 时刻的状态变量z ,分别计算步长为h及 下的状态变 厶 量二川.如果两种步长下的误差e—Il主川一z川ll小于给定的误差限,则可采用该步长 ;如果误差较 第4期 薛亚宏:两类基于MATLAB的非线性微分方程数值解的算法研究 21 大,则逐步减小步长,直到误差减小到允许范围内.这种自适应变步长算法能同时解决两个问题,即运算速 度和计算精度. 2 两类一阶微分方程组数值解的算法与函数 求解一阶显式微分方程组的关键是用MATLAB语言编写一个函数,描述需要求解的微分方程组,该 函数在程序头文件人口应表示为: function xd—funname(t,x); function Xd—funname(t,X,flag,Pl,P2,…). 在非线性微分方程求解中,有时需要对算法及控制条件进一步设置,这可以通过求解过程中的options 变量进行修改,其方式初始变量可由odeset()函数获取.若相对误差设置较小时,则还需要给出以下声明: options=odeset(’Reltol’,le一7); options=-odeset;options.RelTol=le一7. 在实际应用中,往往需要定义一些附加参数,可由m ,m ,…,m 表示.下面对数值分析中的两类重 要算法进行分析,并建立一般化的程序结构. 2.1 四阶定步长Runge—Kutta算法及改进 四阶定步长Runge—Kutta算法是数值分析和系统仿真理论中的重要算法.其数学算法需先定义4个 附加向量: k1一hf(t ,z ), 是 一 c + ,z + , 志。一 + ,z + , k 4一hf(t +h,z +忌3). 其中:Simpsom为计算步长,在实际应用中是一个常数.然后由Runge—Kutta算法求解出下一个步长的 状态变量值为: 1 z +l—z +÷(愚1+2k 2+2k 3+k 4). o 对于上述表达式,用迭代法求出t∈Et。,t r]内各时刻点t。+h,t。+2h,…处的数值解. 基于数学上的算法,在MATLAB中,可通过一组循环语句实现求解,其主体如下: function[tout,yout]:rk一4(odefile,tspan,y0) ts=tspan;tO=ts(1);tf=ts(2);yout:[];tout=[];y0+y0(:); if length(ts)=一3,h—ts(3);else,h_-(ts(2)一ts(1))/100;tf=ts(2);end for t一[tO:h:tf] kl—h*feval(odefile,t,y0);k2,k3,k4一*** y0:y0+(kl+2*k2+2*k3+k4)/6;yout一[yout;yO’];tout=[tOut;t]; end 以上MATLAB算法中,变量tspan有两种构成方法,即等距时间向量和基于t。,t,,t 的变步长向量. 在函数调用结束后,时间向量与状态变量构成的矩阵分别由程序中的tout和yout返回. 上述算法的优点是结构简洁、运算速度快,局限性是精度不高.为保证更高的精度和数值的稳定性,将 上述算法在步长递增方面进行改进,即在每个计算步长内对f (・)函数进行6次求值,该算法称为四阶五 级RKF算法. 对当前步长h ,可以定义6个变量: i--1 忌 一h kf(t k+alh,,Xk+ t3.k,),i一1,2,…,6. 22 6 湖州师范学院学报 第36卷 式中:z川一 +∑y 是 为当前计算时刻,中间参数o,i, 可由RKF算法系数表给出,此时状态向量可 =1 表示为: z川=z +∑y 愚 . =1 如 如加 0 m加 6 上述算法中,若定义一个误差向量e 一∑(y 一y ) 嘲,则可由£ 大小变换步长,从而转化为自适 i一1 应变步长算法,使程序整体更易控制. 2.2 Lorenz模型的数值算法 Lorenz模型是描述混沌现象的一例著名方程,Lorenz系统无论从数学还是物理的角度都值得详细地 研究. 一 一 一 .\ 、,\ 其中:I9,』D, 为定值 ;z (0)一z 2(0)一z。(O)一£为初始值.对于£===10叫。,求方程组的数值解. ++ 由于该方程为非线性微分方程,不存在解析解,可按以下步骤完成基于MATLAB的数值算法程序编写: };l ㈤ ( 3 + 首先,用Lorenzep.m函数来描述系统的动态模型,格式为: 加 m O 一 加加 一彻 >>f一夺(t,x)Et ̄*x(1)+x(2)*x(3); ; ;*].O 其次,调用数值解函数ode45()对Lorenzep()函数描述的系统进行数值求解,并将结果用图形显示./.: 一>>tfina1—100;x0一[O;0;e~10];It,x] ̄ode45(f,[O,t_fina1],x0);plot(t,x), —figure;plot3(x(:,1);d(:,2);x(:,3)); \, axis([ml m2 m m4 m5 m6]); 其中:t final为设定的仿真终止时间;x0为初始状态.两个命令分别绘制出系统各个状态的时间关系的二 维曲线图(见图3)、三个状态的相空间曲线图(见图4). 图4相空间三维图 4 Three—dimensional Phase space diagram 上面程序中,对于观察相空间轨迹还可采用comet3()函数绘制动画式轨迹,只需对最后一个语句进行适 当改写即可.要建立一个基于MATLAB微分方程组描述函数,必须调用ode45(),所以编写MATLAB函数描 述微分方程是初值问题数值解的关键,对一阶非线性微分方程尤为重要. 3 结语 微分方程数值解的检验是数值分析理论的重要环节.若仿真算法和控制参数选择不当,则可能得出不可 信的结果,甚至是错误的结果.对数值解的验证可通过两种方式进行:一是修改仿真控制参数,如可以接受的 第4期 薛亚宏:两类基于MATLAB的非线性微分方程数值解的算法研究 23 误差限,将选项设置成一个更小的值,观察所得的结果,看看是否与第一次运行时结果一致,如果不存在不能 接受的差异,则应考虑再进一步减小误差限;二是选择微分方程求解算法检验运算结果的正确性. 科学或工程问题的求解和模拟最终往往都要归结为对数学模型的求解和对实验数据的拟合,而非线 性微分方程作为一种重要的数学终端模型,本身只能用数值求解.本文通过对四阶定步长Ruge—Kutta算 法和Lorenz模型算法的系统分析,建立基于非线性微分方程的变步长自适应算法及函数显式描述下 MATLAB程序结构,对步长、误差、数值解验证等关键要素进行分析,并得出相关结论,为以微分方程为 数学模型的工程问题的解决提供了一种有效的数值求解方法,对偏微分方程数值解的进一步讨论有重要 意义. 参考文献: [1]商妮娜,秦惠增.非线性常微分方程数值解的渐近表示以及应用[J].山东理工大学学报(自然科学版),2010,33(5):30—35 [2]张春梅.一类二阶非线性微分方程边值问题的有效解法[J3.新疆大学学报(自然科学版),2005,22(4):403—409. [3]薛定宇,陈阳泉.基于的系统仿真技术与应用EM].北京:清华大学出版社,2002. [4]邵新平.非线性微分方程的样条函数求解方法I-J].浙江大学学报(自然科学版),2010(3):10—12. [5]蔡建平,王桂芳.非线性微分方程渐近解的阶的数值验证[J].太原理工大学学报,2011,20(5):15—21. [6]张化光,王智良,黄伟.混沌系统的控制理论[M].沈阳:东北大学出版社,2003. The Algorithms About the Two Types of Numerical Solution of Nonlinear Differential Equations Based on MATLAB XUE Yahong (School of Telecommunications,Gansu Industrial Vocational&Technological College,Tianshui 741025,China) Abstract:Based on the mathematical algorithm analysis for the two kinds of nonlinear differential e— quation numerical solutions in engineering dynamic control and the important applications in computer simulation,the essay establishes a fourth—order fixed step length Runge—Kutta and the algorithm structure of Lorenz model numerical solution MATLAB,discusses the error control variable step size case,draws a numerical solution of the Lorenz system under the two—dimensional and three—dimen— sional graphics based on the MATLAB,and finally points out the numerical solution in testing the basic train of thought within acceptable error limits. Key words:MATLAB;the nonlinear differential equation;numerical solution;algorithm;error MSC 2000:65L14 [责任编辑高俊娥]