数值分析-常微分数值解的求法C语言..docVIP

数值分析-常微分数值解的求法C语言..doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数值分析-常微分数值解的求法C语言.

本科生课程设计报告 实习课程 数值分析 学院名称 管理科学学院 专业名称 信息与计算科学 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇 一 六 年 六 月 二〇 一 六 年 六 摘要 常微分方程数值解法是计算数学的一个分支.是解常微分方程各类定解问题的数值方法.现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示,常常需要求其数值解.所谓数值解,是指在求解区间内一系列离散点处给出真解的近似值.这就促成了数值方法的产生与发展.? 关键词:数值解法;常微分 实验内容和要求 常微分方程初值问题 有精确解。 要求:分别取步长h = 0.1,0.01,0.001,采用改进的Euler方法、4阶经典龙格-库塔R-K方法和4阶Adams预测-校正方法计算初值问题。以表格形式列出10个等距节点上的计算值和精确值,并比较他们的计算精确度。其中多步法需要的初值由经典R-K法提供。运算时,取足以表示计算精度的有效位。 算法说明 2.1函数及变量说明 表1 函数及变量定义 函数/变量名 类 型 说 明 f double 要求的微分方程 p_f double 微分方程原函数 Euler,Euler_Pro K_R,Adams double 欧拉,改进欧拉,经典K_R,4阶Adams预测-校正方法 Main Void 主函数 欧拉方法: (i=0,1,2,3,......n-1) (其中a为初值) 改进欧拉方法: (i=0,1,2......n-1) (其中a为初值) 经典K-R方法: 4、4阶adams预测-校正方法 预测: 校正: Adsms内插外插公式联合使用称为Adams预测-校正系统,利用外插公式计算预测,用内插公式进行校正。计算时需要注意以下两点: 外插公式为显式,内插公式为隐式。故用内插外插公式时需要进行迭代。 这种预测-校正法是四步法,计算Yn+1时,不但用到前一步信息,而且要用到更前三步信息,,因此它不是自动开始的,实际计算时必须借助某种单步法,用Runge-Kutta格式为它提供初始值,依据局部截断误差公式得: 进一步将Adams预测-校正系统加工成下列方案: 运用上述方案计算时,要先一步的信息和更前一步的信息 因此在计算机之前必须给出初值和,可用其他单步法来计算,则一般令他为零。 源程序 #includestdio.h #includestdlib.h #includewindows.h #includemath.h //微分方程 double f(double x,double y) { return (-y+cos(2*x)-2*sin(2*x)+2*x*exp(-x)); //return x*pow(y,-2)*2.0/3.0; } //原函数 double p_f(double x) { return x*x*exp(-x)+cos(2*x); //return pow(1.0+pow(x,2),1.0/3.0); } //求精确解 double* Exact(double a,double b,double h) { int i; double c = (b-a)/h; double *y = new double [c+1]; for(i=0;i=c;i++) y[i]= p_f(a+i*h); return y; } //欧拉方法 double* Euler(double a,double b,double h,double y0) { int i; double c = (b-a)/h; double *y = new double [c+1]; y[0]=y0; for(i=1;i=c;i++) { y[i]= y[i-1]+ h* f(a+(i-1)*h,y[i-1]); //printf(%f\n,f(a+(i-1)*h,y[i-1])); } return y; } //改进欧拉方法 double* Euler_Pro(double a,double b,double h,double y0) { int i; double c = (b-a)/h ,yb; double *y = new double [c+1]; y[0]=y0; for(i=1;i=c;i++) { yb=y[i-1] +h* f(a+(i-1)*h,y[i-1]); y[i] = y[i-1] + 0.5*h*( f

文档评论(0)

jiulama + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档