资源描述:
《第8章常微分方程数值解法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第8章常微分方程数值解法8.1引言在常微分方程中利用典型方程的解法,对这些方程就可以求得其解的解析表达式。例如,对一阶线性微分方程(8.1)有通解为有了解析解,就可以根据初始条件或边界条件把其中的任意常数具体确定下来。在许多工程实践和科学研究中,除了少数特殊类型的微分方程能用解析法求得其精确解外,大多数情况要得出解的解析表达式是极其困难的,甚至是不可能的,因此,只能用近似方法求得其近似解。例如我们很容易求出初值问题的解为但要计算它的值,还需要用数值积分的方法。如果要对许多个值计算解的近似值,那么工作量非常大。况且实际计算不一定要求解析表达式,而是只需求在某些点上
2、满足精度的解的近似值或解的近似表达式就可以了。由于高阶常微分方程可以转化为一阶常微分方程组,因此,为了不失一般性,本章主要介绍一类一阶常微分方程初值问题在区间上的数值计算方法。在初值问题的数值解中,常见的有单步法和多步法。所谓单步法,就是在算法中根据初始条件,由解就能求出;所谓多步法,就是在求时不仅要知道,而且还要知道在前面的值。本章首先介绍单步法的欧拉法及龙格-库塔法,然后介绍多步法的阿当姆斯法,它们是解初值问题的几个最基本的常用的有效方法。8.2欧拉(Euler)法8.2.1欧拉法的基本思想虽然欧拉法在实际应用时较少采用,但由于它的结构简单,在理论上具有非常
3、重要的意义。欧拉法的基本思想就是用差分方程初值问题(8.3)的解来近似微分方程初值问题(8.2)的解,其中,式(8.3)也称为欧拉公式。欧拉法的几何意义是用一条自点出发的折线去逼近积分曲线,如图8.1所示。因此,这种方法又称为折线法。显然,欧拉法简单地取折线的端点作为数值解,精度非常差。8.2.2实现欧拉法的基本步骤(1)输入的区间,区间的等分数以及在处的初始值;(2)对,计算:(3)输出;(4)结束。例8.1用欧拉法求解初值问题的数值解(保留4位小数)。#includefloatfunc(floatx,floaty){return(y-x);
4、}floateuler(floatx0,floatxn,floaty0,intN){floatx,y,h;inti;x=x0;y=y0;h=(xn-x0)/(float)N;/*计算步长*/for(i=1;i<=N;i++)/*欧拉公式*/{y=y+h*func(x,y);x=x0+i*h;}return(y);}main(){floatx0,xn,y0,e;intN;clrscr();printf("inputn:");/*输入区间等分数*/scanf("%d",&N);printf("inputx0,xn:");/*输入x的区间*/scanf("
5、%f%f",&x0,&xn);printf("inputy0:");/*输入x0处的y的值*/scanf("%f",&y0);e=euler(x0,xn,y0,N);printf("y(%f)=%6.4f",y0,e);}程序运行结果:inputn:5inputx0,xn:0.01.0inputy0:2.0y(2.000000)=4.4883inputn:10inputx0,xn:0.01.0inputy0:2.0y(2.000000)=4.5937inputn:20inputx0,xn:0.01.0inputy0:2.0y(2.000000)=4.6533
6、此问题的精确解为,相应计算值为4.7183。从计算结果可以看出,虽然等分数越大,数值解越精确,但精度并不理想。8.3改进的欧拉法8.3.1改进的欧拉法的基本思想改进的欧拉法以隐函数的方式给出,计算时常使用迭代法,一般可先由欧拉公式(8.3)计算出的初始值,再按下面的格式进行的迭代计算(8.4)改进的欧拉法由于添加了迭代过程,计算量较欧拉法增加了一倍,付出这种代价的目的是为了提高精度。8.3.2实现改进的欧拉法的基本步骤(1)输入的区间,区间的等分数以及在处的初始值;(2),,;(3);(4)计算:(5)若,,转(4);否则,转(6);(6)输出;(7)结束。例8
7、.2用改进的欧拉法求解初值问题的数值解(保留4位小数)。#includefloatfunc(floatx,floaty){return(y-x);}floateuler(floatx0,floatxn,floaty0,intN){floatx,y,yp,yc,h;inti;x=x0;y=y0;h=(xn-x0)/(float)N;/*计算步长*/for(i=1;i<=N;i++)/*改进的欧拉公式*/{yp=y+h*func(x,y);x=x0+i*h;yc=y+h*func(x,yp);y=(yp+yc)/2.0;}return(y);}ma
8、in(){floatx0