微分方程课程设计
- 格式:doc
- 大小:205.65 KB
- 文档页数:15
湖南工程学院课程设计任务书课程名称微分方程数值解法课题常微分方程初值问题专业班级信息与计算科学班学生姓名学号指导老师审批任务书下达日期2011 年12 月20 日任务完成日期2011 年12 月30 日一、设计内容与设计要求1.设计内容:对课程《微分方程数值解法》中的常见算法进行综合设计或应用。
具体地,对型方程的差分解法进行研究,包括选取合理的差分网格、建立差分格式、求解代数方程组、考察差分格式的收敛性等问题。
2.设计要求:●课程设计报告正文内容a.问题的描述及算法设计;b.算法的流程图;c.算法的理论依据及其推导;d.相关的数值结果;e.数值计算结果的分析;f.附件。
●书写格式a.要求用A4纸打印成册b.正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
c.正文的内容:正文总字数要求在3000字左右(不含程序原代码)。
d.封面格式如下页。
●考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:a.平时出勤(占10%)b.系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)c.程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)d.设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
e.独立完成情况(占10%)。
课程验收要求a.判定算法设计的合理性,运行相关程序,获得正确的数值结果。
b.回答有关问题。
c.提交课程设计报告。
d.提交软盘(源程序、设计报告文档)。
e.依内容的创新程度,完善程序情况及对程序讲解情况打分。
二、进度安排1、班级:信息与计算科学专业2008级本科班2、主讲教师:杨继明3、辅导教师:杨继明4、时间安排:2011年12月20日—2011年12月30日每天8:30—11:30, 3:00—5:30目录一、问题的描述 (5)二、算法设计及流程图 (5)1.1算法设计 (5)1.2流程图 (6)三、算法的理论依据及其推导 (7)3.1 欧拉法理论推导 (4)3.2 龙格库塔法理论推导 (5)四、数值结果分析及分析 (9)五、总结 (12)六、附件 (13)常微分方程的初值问题一、问题的描述很多科学技术和工程问题常用微分方程的形式建立数学模型,因此微分方程的求解是很有意义的。
建立微分方程只是解决问题的第一步,通常需要求出方程的解来说明实际现象,并加以检验。
如果能得到解析形式的解固然是便于分析和应用的,但是我们知道,虽然求解常微分方程有各种各样的解析方法,但解析方法只能用来求解一些典型的方程,而对于绝大多数的微分方程问题,很难或者根本不可能得到它的解析解,实际问题终归结出来的微分方程主要靠数值解法。
因此,研究微分方程求解的数值方法是非常有意义的。
本文介绍了欧拉法、和四阶龙格_库塔方法二种单步法,通过matlab 的平台运行。
二、算法设计及流程图2.1算法设计常微分方程初值问题的数学模型是:求y ()y x =,使之满足0'()(,)()y x f x y x b y a y =≤≤⎧⎨=⎩,(a ),, (1)其中0y ,a ,b 是已知的常数,(,)f x y 是已知函数,且满足条件:(,)(,')'f x y f x y L y y -≤-,式中的L 是不依赖于y ,'y 的常数,称为利普希茨(Lipschitz )常数。
由常微分方程理论知识可知,上述问题存在唯一解()y x 。
现在的目标就是计算区间[],a b 上等节点i x a i h =+处该未知函数的函数值()i y x ,其中()/h b a N =-,0,1,2,...,i N =。
为此,可以用求解常微分方程问题的单步法,即欧拉方法和龙格_库塔方法求解。
2.2 流程图2.2.1欧拉法流程图:程序代码见附录。
x0+h=>x1y0+h*f(x0,y0)=>y1n=1输出x1,y1n=1+nx1=> x0y1=> y0 结束n=N ?读入x0,y0,b,h开始计算N=fix((b-x0)/h)2.2.2 四阶龙格_库塔法流程图:程序代码见附录。
三、算法的理论依据及其推导3.1欧拉算法的理论推导将微分方程离散化,用向前商1()()n n y x y x h+-代替微分()n y x ,代入(1)中的微分方程,可得1()()(,())1,2,3,...n n n n y x y x f x y x n h+-==,()化简可得计算N=fix((b-x0)/h)n=1x0+h=>x1f(x0,y0)=>K1f(x0+h/2,y0+h/2*K1)=>K2 f(x0+h/2,y0+h/2*K2)=>K3 f(x0+h,y0+h*K3)=>K4y0+h/6*(K1+2*K2+2*K3+K4)=>y1输出x1,y1n=n+1x1=>x0 y1=>y0n=N ?结束开始读入x0,y0,b,h1()()(,())1,2,3,...n n n n y x y x f x y x h n +=+=,()如果用n y 近似()n y x 代入上式便可得到1()n y x +的近似值1n y +,计算式为:1(,)1,2,3,...n n n n y y f x y h n +=+=,()(2) 这样问题(1)的近似解课通过求解下面的差分初值问题:10(,)1,2,3,...()n n n n y y f x y h n y a y +=+=⎧⎨=⎩,()(3) 得到,按(3)式由初值0y 可逐次求出12y ,,...y 。
欧拉方法就是用差分方程初值问题(3)的解来近似微分方程初值问题(1)的解。
即由公式(3)算出()n y x 的近似值。
这组公式求问题(1)的数值解就是著名的欧拉(Euler)公式。
欧拉法是数值求解微分方程最简单的方法,它特别适合快速编程,尽管精度不是很高。
Euler 方法的局部截断误差为11()()(,())n n n n n T y x y x hf x y x ++=--()()'()n n n y x h y x h yx =+-- 232''()/2()()nh y x h h οο=+≈即局部截断误差是2h 阶的。
而数值算法的精度定义为:若一种算法的局部截断误差为1()p h ο+,则称该算法具有p阶精度。
显然p越大,方法的精度越高。
上式说明,欧拉方法是一阶方法,因此它的精度不高。
Euler 方法的整体截断误差为()n n n e y x y =-((1)1)/((1)1)nn e hL hL T ≤+-+-()(1)/()()L b a ehL T h ο-≤-=即整体截断误差是h 阶的。
3.2 龙格_库塔方法理论推导由Lagrange 微分中值定理,11()()'()()()(,())n n n n n y x y x y x x y x hf y ξξξ++=+-=+记*(,())k hf y ξξ=,则得到*1()()n n y x y x k +=+这样,给出*k 的一种算法,就得到求解微分方程初值问题的一种计算公式。
四阶龙格_库塔法是用1k ,2k ,3k 和4k 的加权平均值来近似*k 。
最经典的四阶龙格_库塔公式为:121324311234(,)(,)22(,)22(,)y (22)2n n n n n nn n n n K f x y h hK f x y K h h K f x y K K f x h y hK hy K K K K +=⎧⎪⎪=++⎪⎪⎪=++⎨⎪=++⎪⎪⎪=++++⎪⎩四阶龙格_库塔法的误差估计局部截断误差为5()O h 。
值得指出的是,龙格_库塔方法的推导基于泰勒展开方法,因而它要求的解具有较好的光滑性质。
反之,如果解得光滑性差,那么,使用四阶龙格_库塔法方法求得的数值解,其精度可能反而不如梯形方法。
实际计算中,应当针对问题的具体特点选择合适的算法。
对欧拉法、梯形法和龙格_库塔法进行比较:在相同步长的情况下,欧拉法每步只计算一个函数值,四阶龙格_库塔法每步需计算四个函数值,就是说,四阶龙格_库塔法的计算量差不多是欧拉法的四倍,为了比较它们的计算精度,可以将欧拉法的步长取为h ,将四阶龙格_库塔法的步长取为4h 。
这样,如果用二种方法求解同一初值问题,则它们的计算量相当。
在计算量相当的条件下,比较它们的计算结果,就能够看出它们的精度差异。
四、数值结果及分析考虑下列常微分方程的初值问题:4.1欧拉方法.1)0(,5'=-=y y y采用欧拉法进行求解 分别取步长为h=0.1 数值格式为:采用Matlab 程序设计语言编程实现该问题的数值求解。
在Matlab 运行得出的结果是: R =0 1.0000 0.1000 0.8979 0.2000 0.8273 0.3000 0.7726 0.4000 0.7406 0.5000 0.7129 0.6000 0.6956 0.7000 0.6932 0.8000 0.6896 0.9000 0.7038 1.0000 0.73424.2四阶龙格库塔方法⎩⎨⎧=≤≤-=1)0(10'y x y x y 采用四阶龙格库塔方法进行求解。
数值格式为:10=y),(1i i y t f k =)2,2(12k h y h t f k i i ++= )2,2(23k h y h t f k i i ++=),(34hk y h t f k i i ++=)22(643211k k k k h y y i i ++++=+其中h 为区间步长。
采用Matlab 程序设计语言编程实现该问题的数值求解。
在Matlab 命令窗口中输入命令: R= rk4(@f,0,1,1,10) 运行程序得到实验结果为: R =0 1.0000 0.1000 0.9097 0.2000 0.8375 0.3000 0.7816 0.4000 0.7406 0.5000 0.7131 0.6000 0.6976 0.7000 0.6932 0.8000 0.6987 0.9000 0.7131 1.0000 0.7358五、总结通过两周的课程设计,进一步了解了常微分方程的初值问题的解法,通过用欧拉法、四阶龙格_库塔法解决,只要输入相关给出的初始值和步长就可以相应的近似解的方法。
完成这次课程设计,我选用的运行软件是matlab,这次课程设计是对matlab功能的进一步熟悉和了解,尤其在函数的运用方面提高了很多。