数值计算实验四
广东工业大学 数值分析实验报告 实验名称 Euler预估校正算法求常微分方程初值问题 实验时间 2015 年 12 月 18 日 姓名 王琮 班级 13 机电 3 班 学号 3113000135 成绩 一、实验目的,内容 二、相关背景知识介绍 三、代码 四、数值结果 五、计算结果的分析 六、计算中出现的问题,解决方法及体会 一.实验目的及内容 1、实验目的:用计算机作为辅助计算工具,并根据高等数学的有关知识讲预估校正 Euler公式编写成 MTLAB 程序算法,充分利用计算机的速度优势,大大减低了工程技术人员的劳动强度,同时也是计算结果更加可靠、准确。
2、实验内容:编写预估校正隐式 Euler 方法求常微分方程初值问题的程序 二、相关背景知识介绍 微分方程最简单的方程为一阶常微分方程的初值问题,即 其中 a,b 为常数。因为其简单但优势求解其他方程的基础,所以发展了许多经典的解法,下面介绍的数值解法都是针对上式进行求解,所有算法中的 f 代表就代表上式中的(,)x y f,而 y f 表示(,)f x yy,x f 表示(,)f x yx 欧拉法师简单有效的常微分方程数值解法,欧拉法有多重形式的算法,常用的有简单欧拉法、隐形欧拉法和改进的欧拉法。
以下对简单欧拉公式进行介绍:
简单欧拉公式是一种单步递推算法。公式如下:
1 ,()n n n n y y hf x y 简单欧拉公式的算法过程介绍如下:
给出自变量 x 的定义域[a,b],初始值 y0 及步长 h。
对 k=0,1,2...,(b-a)/h,计算 1 ,()k k k k y y hf x y 算法结束。
调用格式:
y=DEEuler(f,h,a,b,y0,varvec)其中,f:一阶常微分方程的一般表达式的右端函数;h:积分步长;a:自变量取值下限;b 自变量取值上线;y0:函数初始值;varvec:常微分方程的变量组。
三.代码 function [x,y]=Implicit_Euler(odefun,xspan,y0,h,varargin)% 预估校正隐式Euler公式求解常微分方程 % 输入参数:
%---odefun:微分方程的函数描述 %---xspan:求解区间[x0,xn] %---y0:初始条件 %---h:迭代步长 %---p1,p2,…:odefun函数的附加参数 % 输出参数:
%---x:返回的节点,即x=xspan(1):h:xspan(2)%---y:微分方程的数值解 x=xspan(1):h:xspan(2);y(1)=y0;for k=1:length(x)-1 z0=y(k)+h*feval(odefun,x(k),y(k),varargin{:});z1=inf;while abs(z1-z0)>1e-4 z1=y(k)+h*feval(odefun,x(k+1),z0,varargin{:});z0=z1;end y(k+1)=z1;end x=x;y=y;四.数值结果 运行程序main4_2.m如下所示 f=@(y,x)-2*x*y;[x,y]=Implicit_Euler(f,[0 1.8],1,0.1);x1=0:0.1:1.8;y1=exp(-(x1).^2);plot(x1,y1,"rO-")hold on plot(x,y,"k.-","markersize",16)legend(预估校正隐式 Euler 求解结果")xlabel("x");ylabel("y");error=y1-y;% 求出误差 x1=0:0.1:1.8 N=length(x);fprintf("x1(i),y(i),y_exact(i),error(i)n");for i=1:N %打出计算结果和误差 fprintf("%2.1f %8.4f %8.4f %8.4fn",x1(i),y(i),y1(i),error(i));
计算结果:
x1(i), y(i), y_exact(i), error(i)0.0 1.0000 1.0000 0.0000 0.1 0.9800 0.9900 0.0100 0.2 0.9416 0.9608 0.0192 0.3 0.8873 0.9139 0.0266 0.4 0.8206 0.8521 0.0315 0.5 0.7451 0.7788 0.0337 0.6 0.6646 0.6977 0.0330 0.7 0.5828 0.6126 0.0299 0.8 0.5026 0.5273 0.0247 0.9 0.4266 0.4449 0.0183 1.0 0.3566 0.3679 0.0113 1.1 0.2939 0.2982 0.0043 1.2 0.2388 0.2369-0.0019 1.3 0.1917 0.1845-0.0071 1.4 0.1519 0.1409-0.0111 1.5 0.1191 0.1054-0.0137 1.6 0.0924 0.0773-0.0151 1.7 0.0711 0.0556-0.0155 1.8 0.0542 0.0392-0.0150 五.计算结果分析 用预估校正法得到的数据距离精确值很近,其骤减幅度较小,因此对精度上的考虑而言,预估校正法比较适用。
六.计算时出现的问题,解决方法及体会 预估校正法的精度是比较高的,在常微分方程的课程中讨论的都是对一些典型方程求解析解的方法.然而在生产实际和科学研究中所遇到的问题往往很复杂, 在很多情况下都不可能给出解的解析表达式。同时老师对我们的指导也是起了很大的作用,参考材料的推荐和对编程的讲解让我们收益菲浅,我们在这里衷心感谢老师的帮助。值得强调的是一个报告的完成实在是另人兴奋,过程虽然有点漫长而且艰辛,但却给我们带来了很多快乐,最后感叹一下 matlab 确实一个很好的数学软件!
