内容发布更新时间 : 2024/12/23 1:36:53星期一 下面是文章的全部内容请认真阅读。
第一章习题5实验报告
一、实验目的
通过用Euler法、中点格式、预报-校正格式、Adams预报—修正格式等算法求解一阶常微分方程初值问题
x0?x?X??y??f(x,y), ???y(x0)?y0的数值解,经典四级四阶R-K法是高精度单步法,四阶Adams预估-校正法是线性多步法,这两个算法较实验一算法精度要高。通过本次实验,掌握R-K法的编程要领,掌握多步法初值的准备方法,深刻领会微分方程数值解的实质,体会单步法和线性多步法各自的优缺点,熟练掌握各算法的计算机实现过程,并能从理论及实验结果分析各种算法的优缺点。 二、实验内容
用Euler法、中点格式、预报-校正格式、经典四级四阶R-K格式、Adams预报—修正格式算法求解一阶常微分方程初值问题
yx2?dx,??2?dy2x2y??y(1)?1?x?(1,2]
的数值解,其精确解为y?三、算法
1 Euler法
x3x。 ?22??yj?1?yj?hf(xj,yj) ???y0?y(x0),j?1,2,,N?X?x0?其中N???,h为步长。 h??2 中点格式
hh?y?y?hf(x?,y?f(xj,yj))jjj?j?122 ??y?y(x),j?1,2,,N0?03 预报-校正格式
?y(0)?yj?hf(xj,yj)j?1??h?y?y?(f(xj,yj)?f(xj?1,y(0)?j?1jj?1))
2??y?y(x),j?1,2,,N0??04 四级四阶格式:
h?y?y?(K1?2K2?2K3?K4)j?j?16??K1?f(xj,yj)?hh??K2?f(xj?,yj?K1),j?0,1,2,22??hh?K3?f(xj?,yj?K2)22??K4?f(xj?h,yj?hK3)???y(x0)?y0,N?1
5 Adams预报—修正格式 h??0??55fn?59fn?1?37fn?2?9fn?3??预报格式y?y?n?n?124?h?yn?1?yn??9f?xn?1,yn?1??19fn?5fn?1?fn?2??修正格式24?
其中h为步长。
四 程序
一、Euler法程序如下: #include
#define LEN 100
int Euler(int a,int b,double h) {
double y[LEN]={0}; double x[LEN]={0};
int i=0;
double num=0;
num=((b-a)/h)+1;//节点个数
//循环计算出各个节点的坐标 for(i=1;i } //带公式计算各个节点的y的值 for(i=0;i //输出x和y printf(\ ************************* ******************************* \\n\ printf(\ x[n] for(i=0;i printf(\ ************************* ******************************** \\n\\n\ return 0; } } 二、中点格式程序如下: int Mid(int a,int b,double h) { double y[LEN]={0}; double x[LEN]={0}; int i=0; double num=0; num=((b-a)/h)+1;//节点个数 //循环计算出各个节点的坐标 for(i=0;i //带公式计算各个节点的y的值 for(i=0;i Euler法求解方程 y[n]\\n\\n\ %.4f\\n\Euler法求解方程 y[i+1]=y[i]+h*f((x[i]+h/2),(y[i]+(h/2)*(f(x[i],y[i])))); } //输出x和y printf(\ ************************* 中点格式求解方程 ******************************* \\n\ printf(\ x[n] y[n]\\n\\n\ for(i=0;i printf(\ ************************* 中点格式求解方程 ******************************* \\n\\n\ return 0; } 三、预报——校正格式程序如下: int PreCorr(int a,int b,double h) { double y1[LEN]={0}; double y[LEN]={0}; double x[LEN]={0}; int i=0; double num=0; num=((b-a)/h)+1;//节点个数 //循环计算出各个节点的坐标 for(i=0;i //带公式计算各个节点的y的值 for(i=0;i y1[i+1]=y[i]+h*f(x[i],y[i]); y[i+1]=y[i]+(h/2)*(f(x[i],y[i])+f(x[i+1],y1[i+1])); } //输出x和y printf(\ *********************** 预报—校正格式求解方程 *************************** \\n\ printf(\ x[n] y[n]\\n\\n\ for(i=0;i printf(\ *********************** 预报—校正格式求解方程 *************************** \\n\\n\ return 0; } 四、经典四级四阶R-K程序如下: int RungeKutta(int a,int b,double h) { double y1[LEN]={0}; double y[LEN]={0}; double x[LEN]={0}; int i=0; double num=0; num=((b-a)/h)+1;//节点个数