微分方程-第一章习题5实验报告 下载本文

内容发布更新时间 : 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;//节点个数

//循环计算出各个节点的坐标 for(i=0;i

//带公式计算各个节点的y的值 for(i=0;i