改进Adams报告.docxVIP

  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文档。上传文档
查看更多
改进Adams报告

实验报告 ——改进四点Adams公式 1110500158 刘雪婷 一 实验问题 不论是Taylor级数展开法还是Runge-Kutta,都是依赖前一步得到的数值进行计算。虽然RK法可以得到较高的精度,但其对某一个数值的依赖程度大也会影响计算的精确度。 为了解决这个问题,我们使用线性多步法,即使用前面已得到的N个数值来计算。 二 实验方法 dudt=F(t,u)ut0=u0 * 对于*式两边积分后得到 utn+1-utn=tntn+1F(t,u(t))dt 右端使用Lagrang差值多项式代替,用前面q+1个值差值,即 tntn+1FF(t,u(t))dt=tntn+1i=0qF(tn-q,un-q)×li(t) lllllit=(t-t0)(ti-t1)…(ti-ti-1)(ti-ti+1)…(ti-tn)(ti-t0)(ti-t1)…(ti-ti-1)(ti-ti+1)…(ti-tn) 三 初始值 Fx,y=-y+x+1 y0=1F 0≤x≤1 h=0.1 四 结论 改进四点Adams公式理论上精度是4阶的,在本题中可以精确到小数点后第五位,是一个比较精确地公式。 五 结论分析 如果我们令h=0.2,得到以下结果: 如果我们令h=0.01,得到以下结果: 当h=0.2,精确度为小数点后4位。h=0.01,精度为小数点后9位。 按照理论推断,其精度至少为4阶。步长小时,精度虽大,但是迭代次数多。 所以在选择步长时,我们要根据对问题目的的判断来平衡精度和时间复杂度之间的关系。 六 程序 //adams 59页 例2.4.1// #includestdio.h #includestdlib.h #includemath.h double f(double x,double y) { return -y+x+1; } double RK(double t, double u,double h)//定义4阶龙格库塔// { if(t=1) return 0; double k1, k2, k3, k4; k1=f(t,u); k2=f(t+h/2,u+h/2*k1); k3=f(t+h/2,u+h/2*k2); k4=f(t+h,u+h*k3); u=u+h/6*(k1+2*k2+2*k3+k4); return u; } void main() { double t=0.0, u=1.0,h;//这里的t,u是定义好了的,下面才能用// double *b, c; int max; while(1){ while(1){ printf(Please input the length of step (Put \0.0\ to exit): ); scanf(%lf,h); if(h1.0) { printf(Error! Please input a number less than 1.0.\n); continue;} else if(h==0.0) exit(0); else if(h0.2){//至少5个点// printf(Error! Cant finish the calculate by Adams formula.\n); printf(Please input a number less than 0.2.\n); continue; } else break; } int i; max=(int)(1/h);//确定最大迭代次数// b=(double*)malloc((max+2)*sizeof(double)); b[0]=1.0; //t=0.0; u=1.0;// for(i=1; i=3; i++)//先循环,后加1// {//用RK计算前3个数,把结果拿过来// b[i]=RK(t,b[i-1],h); u=b[i]; t+=h; } i--;//循环到这里结束出来i=4,要开始算i=4的数,所以要减掉一个// while(i=max) {//改进4点ADAMS// c=b[i]+h/24*(55*f(i*h,b[i])-59*f((i-1)*h,b[i-1])//中间计算的一步值,不需要输出的话就不用加i// +37*f((i-2)*h,b[i-2])-9*f((i-3)*h,b[i-3])); i++; b[i]=b[i-1]+h/24*(9*f(i*h,c)+19*f((i

文档评论(0)

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

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

1亿VIP精品文档

相关文档