1、常微分方程数值解数学与计算科学学院实 验 报 告实验项目名称 常微分方程数值解 所属课程名称 微分方程数值解法 实 验 类 型 验证 实 验 日 期 班 级 学 号 姓 名 成 绩 一、实验概述:【实验目的】掌握求解常微分方程的欧拉法,Runge-Kutta方法(二阶的预估校正法,经典的四阶R-K法)【实验原理】1,欧拉法的格式如下: 其中n从0开始取值,为微分方程中的dy/dx的值,而是我们根据题目设定的初值。2,预估校正法格式如下: 其中第一个式子为预报格式,第二个式子为校正格式,第三个式子也是给定的初值。3,经典四阶Runge-Kutta格式,亦即R-K法格式如下:【实验环境】Micro
2、soft Visual C+6.0二、实验内容:【实验方案】用欧拉法,预估校正法, 经典的四阶龙格库塔方法求解初值问题 dy/dx=,初值y(0)=1; 将计算结果与精确解为比较在区间0,1上分别取步长h=0.1; 0.05时进行计算。对三个算法的收敛性进行分析比较,【实验过程】(实验步骤、记录、数据、分析)1,部分算法代码:(1)欧拉算法代码void ruler(double xn+1,double yn+1,double h)/欧拉法 int j; for(j=0;jn;j+) yj+1=yj+h*f(xj,yj); (2)预步校正法代码void yugu_jz(double xn+1,d
3、ouble yn+1,double h)/预估校正法 double yyn+12; int j; yy01=y0; for(j=0;jn;j+) yyj+10=yyj1+h*f(xj,yyj1); yyj+11=yyj1+h/2*(f(xj,yyj1)+f(xj,yyj+10);/预估校正法的解 yj+1=yyj+11; (3)Runge_Kutta法代码void Runge_Kutta(double xn+1,double yn+1,double h)/Runge_Kutta法 double k1,k2,k3,k4; int i; for(i=0;in;i+) k1=f(xi,yi); k2
4、=f(xi+h/2,yi+h/2*k1); k3=f(xi+h/2,yi+h/2*k2); k4=f(xi+h,yi+h*k3); yi+1=yi+h/6*(k1+2*k2+2*k3+k4); (4)目标函数及解析解double f(double a,double b)/目标函数 double fun; fun=a*exp(-a)-b; return fun;void precise(double xn+1,double yn+1)/精确解 int j; for(j=0;jn;j+) yj+1=(pow(xj+1,2)+2)*exp(-xj+1)/2; 2,结果分析:根据下面的实验结果,可以得
5、出:当步长取0.1时,三种算法收敛性的关系为:欧拉法预步校正法Runge_Kutta法,相应的预步校正法精确度为普遍在,略高于欧拉法,Runge_Kutta法的精确度达到,远远优于欧拉法和预步校正法。当步长取0.05时,三种算法收敛性的关系不变,但三种方法的精确度均有提高,相对于步长0.1时,Runge_Kutta法收敛速度高于另外两种,可得其误差项阶数高于欧拉法和预步校正法,即结果均与理论相符。【实验结论】(结果)当步长为0.1时,结果及误差如下:当步长为0.05时,结果及误差如下:【实验小结】(收获体会) 通过本次实验,我熟悉了欧拉法,预步校正法以及Runge_Kutta法的算法思想,还有
6、它们之间的收敛性差异,精确度差异,同时对也提高了自己的上机编程能力,感受到了理论与实践相结合的乐趣。三、指导教师评语及成绩:评 语评语等级优良中及格不及格1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强2.实验方案设计合理3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)4实验结论正确. 成 绩: 指导教师签名: 批阅日期:附录1:源 程 序#include#include#define n 10void precise(double xn+1,double yn+1);/精确解void ruler(double xn+1,double yn+1,double h);/欧拉法vo
7、id yugu_jz(double xn+1,double yn+1,double h);/预估校正法void Runge_Kutta(double xn+1,double yn+1,double h);/Runge_Kutta法double f(double a,double b);/定义函数void main() printf(*该程序解决微分方程y=x*e(-x)-y的数值解问题*n); printf(*区间为0,1,步长h=0.1nn); double xn+1,y4n+1; double h; int i,k; h=0.1;/步长赋值 /初值赋值 x0=0.0; for(i=0;i4
8、;i+) yi0=1; for(i=1;in+1;i+) xi=x0+h*i; precise(x,y0); ruler(x,y1,h); yugu_jz(x,y2,h); Runge_Kutta(x,y3,h); printf( x 精确解 欧拉法的解 预估校正法 Runge_Kuttan); for(k=0;kn+1;k+)/打印结果 printf( %-3.2lf %-12.8lf %-12.8lf %-12.8lf %-12.8lfn,xk,y0k,y1k,y2k,y3k); printf( x 精确解 欧拉法误差 预校法误差 R_K法误差n); for(k=0;kn+1;k+)/打印
9、误差 printf( %-3.2lf %-12.8lf %e %e %en,xk,y0k,fabs(y1k-y0k),fabs(y2k-y0k),fabs(y3k-y0k); void precise(double xn+1,double yn+1)/精确解 int j; for(j=0;jn;j+) yj+1=(pow(xj+1,2)+2)*exp(-xj+1)/2; void ruler(double xn+1,double yn+1,double h)/欧拉法 int j; for(j=0;jn;j+) yj+1=yj+h*f(xj,yj); void yugu_jz(double xn
10、+1,double yn+1,double h)/预估校正法 double yyn+12; int j; yy01=y0; for(j=0;jn;j+) yyj+10=yyj1+h*f(xj,yyj1); yyj+11=yyj1+h/2*(f(xj,yyj1)+f(xj,yyj+10);/预估校正法的解 yj+1=yyj+11; void Runge_Kutta(double xn+1,double yn+1,double h)/Runge_Kutta法 double k1,k2,k3,k4; int i; for(i=0;in;i+) k1=f(xi,yi); k2=f(xi+h/2,yi+
11、h/2*k1); k3=f(xi+h/2,yi+h/2*k2); k4=f(xi+h,yi+h*k3); yi+1=yi+h/6*(k1+2*k2+2*k3+k4); double f(double a,double b)/目标函数 double fun; fun=a*exp(-a)-b; return fun;附录2:实验报告填写说明 1实验项目名称:要求与实验教学大纲一致。2实验目的:目的要明确,要抓住重点,符合实验教学大纲要求。3实验原理:简要说明本实验项目所涉及的理论知识。4实验环境:实验用的软、硬件环境。5实验方案(思路、步骤和方法等):这是实验报告极其重要的内容。概括整个实验过程。对于验证性实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。对于设计性和综合性实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。对于创新性实验,还应注明其创新点、特色。6实验过程(实验中涉及的记录、数据、分析):写明具体实验方案的具体实施步骤,包括实验过程中的记录、数据和相应的分析。7实验结论(结果):根据实验过程中得到的结果,做出结论。8实验小结:本次实验心得体会、思考和建议。9指导教师评语及成绩:指导教师依据学生的实际报告内容,给出本次实验报告的评价。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1