内容发布更新时间 : 2025/11/4 22:17:14星期一 下面是文章的全部内容请认真阅读。
第一章习题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;//节点个数     //循环计算出各个节点的坐标  for(i=0;i  //带公式计算各个节点的y的值  for(i=0;i