数值分析上机实验报告_第1页
数值分析上机实验报告_第2页
数值分析上机实验报告_第3页
数值分析上机实验报告_第4页
数值分析上机实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE0课程实验报告课程名称:计算方法专业班级:计算机信息安全同组人员:同组人员:指导教师:报告日期:2012年6月27日计算机科学与技术学院

目录TOC\o"1-3"\h\u5893一、实验题目 230987二、实验要求 221545三、采用主要公式 232561四、程序设计流程 418723五、源程序及注释 718849六、运行结果截图 1111994七、上机心得体会 12

一、实验题目已知某函数f(x)的数据表如下,求:参考精确解:1.749216991124380……实验要求动态输入节点个数、各节点数据、积分上下限及精度要求;利用Newton插值法计算求积节点的被积函数值;利用Romberg算法计算满足精度要求的数值积分近似值(至少计算);以二维表形式输出等分数n、步长h、Tn、Sn、Cn、Rn以及最终的计算结果。采用主要公式差商公式 Newton插值公式 Romberg公式控制精度程序设计流程源程序及注释#include<stdio.h>doubleNewton(doublex,intj,intk,intn,intm,doubles[100],doublet[100],doubled[100]);doublefunction(doublex,intn,doublef[100],doubleg[100]);doubleRomberg(intn,intnum,doubleE,doubleh[100],doublel[100],doubled[100]);intmain(){doublex,e,a[100],b[100],c[100],d[100],g; inti,v,m=0,k=0;intnum;do{printf("\n");printf("计算方法试验\n");printf("YY\n");/*用户选择*/printf("1:用已经存储的数据检测\n");printf("2:用户自己输入数据检测\n");printf("3:退出...\n\n");printf("Thenumberyouchooseis:");scanf("%d",&v);switch(v){case1:num=11,e=0.0000000005;a[0]=3.0;a[1]=3.2;a[2]=3.4;a[3]=3.6;a[4]=3.8;a[5]=4.0;a[6]=4.2;a[7]=4.4;a[8]=4.6;a[9]=4.8;a[10]=5.0;b[0]=1.0788;b[1]=0.9766;b[2]=0.9112;b[3]=0.8708;b[4]=0.8479;b[5]=0.8369;b[6]=0.8338;b[7]=0.8354;b[8]=0.8391;b[9]=0.8429;b[10]=0.8451;for(i=0;i<num;i++)c[i]=b[i];printf("Pleaseinputthexyouwanttocalculate:"); scanf("%lf",&x); g=Newton(x,m,k,num,num,&a[0],&b[0],&d[0]);/*已经输入的数据进行计算*/ printf("thedataoff(x)is:%lf\n",g); Romberg(m,num,e,&a[0],&c[0],&d[0]);break;case2:printf("pleaseinputthecountofx:");scanf("%d",&num);if(num>=100)printf("ERROR!TOOLARGE.");printf("\ninputxfirst:\n");for(i=0;i<num;i++){scanf("%lf",&a[i]);getchar();}printf("\ninputf(x):\n");for(i=0;i<num;i++){scanf("%lf",&b[i]);getchar();}printf("inputok!");for(i=0;i<num;i++)c[i]=b[i];printf("Pleaseinputthexyouwanttocalculate:"); scanf("%lf",&x);g=Newton(x,m,k,num,num,&a[0],&b[0],&d[0]);/*用户自己输入数据进行计算*/printf("thedataoff(x)is:%lf\n",g); printf("pleaseinputtheaccuracyofRomberge:"); scanf("%11f",&e); Romberg(m,num,e,&a[0],&c[0],&d[0]);break;case3:break;/*退出*/}}while(v!=0); return0; }/*Newton插值子函数*/doubleNewton(doublex,intj,intk,intn,intm,doubles[100],doublet[100],doubled[100]){/*x为输入的数据,j、k为计数,n为数值个数,m,存放地址及相应地址数据的数组*/ intp; intq=m; n=n-1;/*n视为k阶导数的差商个数*/ k=k+1; d[j]=t[0]; j++; for(p=1;p<=n;p++) t[p-1]=((t[p]-t[p-1])/(s[p+k]-s[p]));/*计算差商*/ if(n>=1) Newton(x,j,k,n,q,&s[0],&t[0],&d[0]);/*循环调用该子函数*/ else { function(x,q,&d[0],&s[0]);/*计算f(x)*/}returnfunction(x,q,&d[0],&s[0]);/*返回f(x)*/}/*计算f(x)的子函数*/doublefunction(doublex,intn,doublef[100],doubleg[100]){/*传入参数x,个数n,存放地址的数组及存放相应地址的数据的数组*/ inti; doublefx; doublee[100]; e[0]=1.0; fx=e[0]*f[0]; for(i=1;i<=n;i++){ e[i]=e[i-1]*(x-g[i-1]);/*利用公式计算f(x)的值*/ fx=fx+f[i]*e[i]; } returnfx;/*返回f(x)的值*/}/*龙贝格算法实现子函数*/doubleRomberg(intn,intnum,doubleE,doubleh[100],doublel[100],doubled[100]){/*传入参数个数n,精确度E,存放地址的数组及存放相应地址的数据的数组*/doubleH[100],T[100],S[100],C[100],R[100],G[100],F,X,Z;inti,m,k=1,j;/*k为标志位,控制计算流程*/H[0]=h[num-1]-h[0];T[0]=(H[0]*(l[0]+l[num-1]))/2;/*梯形公式计算T[0]*/for(m=1;;){X=h[0]+H[m-1]/2;/*等分点横坐标值*/F=0;do{j=0;for(i=0;i<num;i++)G[i]=l[i];Z=Newton(X,n,j,num,num,&h[0],&G[0],&d[0]);F=F+Z;X=X+H[m-1];}while(X<h[num-1]);T[m]=(T[m-1]+H[m-1]*F)/2;S[m]=T[m]+(T[m]-T[m-1])/3;if(k!=1)/*根据K值判断是否计算C*/{C[m]=S[m]+(S[m]-S[m-1])/15;if(k!=2)/*根据K值判断是否计算R*/{R[m]=C[m]+(C[m]-C[m-1])/63;if(k!=3){if((R[m]-R[m-1])<E||(R[m-1]-R[m])<E)/*根据K值判断是否计算相邻的R值的插是否满足精度要求*/break;/*满足精度要求后输出*/else{k++;H[m]=H[m-1]/2;m++;}}else{k++;H[m]=H[m-1]/2;m++;}}else{k++;H[m]=H[m-1]/2;m++;}}else{k++;H[m]=H[m-1]/2;m++;}}/*/*输出分数n、步长h、Tn、Sn、Cn、Rn以及最终的计算结果*/printf("________________________________________________________________________________\n");printf("nhTnSnCnRn\n");printf("\n");for(i=0;i<k;i++){printf("%d\t%lf\t%lf\t",i,H[i],T[i]);if(i>0){printf("%lf\t",S[i]);if(i>1){printf("%lf\t",C[i]);if(i>2)printf("%lf",R[i]);elseprintf("\n");}elseprintf("\n");}elseprintf("\n");}printf("\n");printf("n=%dR=%lf\n",m-1,R[m-1]);printf("\n");returnR[m];}六、运行结果截图上机心得体会给我一把斧头,我将要用6个小时去把它磨得锋利,然后用1个小时去砍柴。 这句话,如今放在我的身上刚好适用。 在写这个实验之前,我用了很多时间了解差商的计算,牛顿插值法的实现,荣贝格算法的实现。 平时计算很是复杂,但是从来没有想过通过计算机这种手段来便捷地计算。 这项实验是我和杨梅芳一同完成的。在编写程序过程中,我们俩分工合作,我主要研究牛顿插值的实现,她主要研究荣贝格算法。同时我们在各自的小领域中遇到困难都会讨论解决。 在编写程序之前,我先大致画出了算法流程图,并写了基本的算法思想。就牛顿插值而言,我的思想是采用一维数组来存放系列值,然后按照书上的公式分别写出NEWTON和FUNCTION两个子函数,前者是计算差商,后者则是计算插值f(x)。在NEWTON子函数中,我采用了递归调用的方法来实现差商表的计算。 在编程过程中出现了很多错误,我都是通过合理调整传参来解决的。所以在我写的代码中,传参的个数很多,而且不看注释的话,很难理解。这是我算法的一大弊病。这个在日后的学习中,我会寻找更优的方法来解决。 现在我们还存在的一个问题就是误差有些大。现在还没有找到根源。我分析了一下,感觉可能的原因有2种。 第一,截断误差。在计算过程中,我把公式分开了计算,每次计算由

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论