资源描述:
《实验三 常微分方程的差分方法实验》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验三常微分方程的差分方法实验一.实验目的(1)深入理解常微分方程的差分方法的原理,学会用差分方法解决某些实际的常微分方程问题,比较这些方法解题的不同之处。(2)熟悉Matlab编程环境,利用Matlab实现具体的常微分方程。二.实验要求用Matlab软件实现欧拉方法、改进的欧拉方法、龙格-库塔方法和亚当姆斯方法,并用实例在计算机上计算。三.实验内容1.实验题目(1)取h=0.1,用欧拉方法、改进的欧拉方法、四阶龙格-库塔方法求解初值问题:并与精确解比较计算结果.(2)分别用二阶亚当姆斯预估校正系统、改进
2、的四阶亚当姆斯预估校正系统求解初值问题,取,计算。2.设计思想(1)1.Euler方法:在区间[xn,xn+1]的左端点列出函数倒数关于函数及自变量的函数,并用两端点函数值差值除以步长替代其中的导数项,则有公式yn+1=yn+hf(xn,yn),n=0,1,2…,即为Euler方法。2.改进的Euler方法:先用Euler格式求得一个初步的近似值,称作预报值,预报值的精度不高,用它替代梯形格式的yn+1再直接计算,得到校正值,这样建立的预报校正系统即为改进的Euler方法。3.四阶Runge-Kutta方
3、法:在[xn,xn+1]区间上多预报几个点的斜率,然后将他们加权平均作为平均斜率,则构造出更高精度的公式,这就是Runge-Kutta的设计思想。(2)1.二阶Adams预报校正系统:在Runge-Kutta的计算基础之上,利用计算好的斜率来减少计算量,求得平均斜率,设计差分格式,选取参数,使之具有2阶精度,即可设计出二阶显式、隐式Adams格式,仿照Euler格式的构造方法,将显式和隐式的两种Adams格式匹配在一起,构成二阶Adams预报校正系统。2.改进的四阶Adams预报校正系统:由上面的原理导出
4、四阶显式和隐式Adams格式,将两者匹配在一起,即可生成四阶Adams预报校正系统。再根据二阶Adams格式的处理方法估计系统中预报值和校正值的误差,利用误差估计式修改四阶Adams预报矫正系统即可导出改进的四阶Adams预报校正系统。3.对应程序(1)f2.m:functionz=f2(x,y)z=1/(1+x^2)-2*(y^2);solvef2.m:functiony=solvef2(x)y=x./(1+x.^2);1.Euler方法:functionE=Euler(f,a,b,N,ya)h=(b-
5、a)/N;y=zeros(1,N+1);x=zeros(1,N+1);y(1)=ya;x=a:h:b;fori=1:Nx(i+1)=x(i)+h;y(i+1)=y(i)+h*feval(f,x(i),y(i));endE=[x',y'];2.改进的Euler方法:functionE=MendEuler(f,a,b,N,ya)h=(b-a)/N;y=zeros(1,N+1);x=zeros(1,N+1);y(1)=ya;x=a:h:b;fori=1:Ny1=y(i)+h*feval(f,x(i),y(i))
6、;y2=y(i)+h*feval(f,x(i+1),y1);y(i+1)=(y1+y2)/2;endE=[x',y'];1.四阶Runge-Kutta方法:functionR=Rungkuta4(f,a,b,N,ya)h=(b-a)/N;x=zeros(1,N+1);y=zeros(1,N+1);x=a:h:b;y(1)=ya;fori=1:Nk1=feval(f,x(i),y(i));k2=feval(f,x(i)+h/2,y(i)+(h/2)*k1);k3=feval(f,x(i)+h/2,y(i)+
7、(h/2)*k2);k4=feval(f,x(i)+h,y(i)+h*k3);y(i+1)=y(i)+(h/6)*(k1+2*k2+2*k3+k4);endR=[x',y'];(2)二阶Adams预报校正系统:functionA=Adams2PC(f,a,b,N,ya)h=(b-a)/N;x=zeros(1,N+1);y=zeros(1,N+1);x=a:h:b;y(1)=ya;fori=1:Nifi==1y1=y(i)+h*feval(f,x(i),y(i));y2=y(i)+h*feval(f,x(i
8、+1),y1);y(i+1)=(y1+y2)/2;dy1=feval(f,x(i),y(i));dy2=feval(f,x(i+1),y(i+1));elsey(i+1)=y(i)+h*(3*dy2-dy1)/2;P=feval(f,x(i+1),y(i+1));y(i+1)=y(i)+h*(P+dy2)/2;dy1=dy2;dy2=feval(f,x(i+1),y(i+1));endendA=[x',y'];改进的4阶Ada