數值分析上機實驗報告_第1頁
數值分析上機實驗報告_第2頁
數值分析上機實驗報告_第3頁
數值分析上機實驗報告_第4頁
數值分析上機實驗報告_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

PAGE0課程實驗報告課程名稱:計算方法專業(yè)班級:計算機信息安全同組人員:同組人員:指導教師:報告日期:2012年6月27日計算機科學與技術學院

目錄TOC\o"1-3"\h\u5893一、實驗題目 230987二、實驗要求 221545三、采用主要公式 232561四、程序設計流程 418723五、源程序及注釋 718849六、運行結果截圖 1111994七、上機心得體會 12

一、實驗題目已知某函數f(x)的數據表如下,求:參考精確解:1.749216991124380……實驗要求動態(tài)輸入節(jié)點個數、各節(jié)點數據、積分上下限及精度要求;利用Newton插值法計算求積節(jié)點的被積函數值;利用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]);/*循環(huán)調用該子函數*/ 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子函數中,我采用了遞歸調用的方法來實現差商表的計算。 在編程過程中出現了很多錯誤,我都是通過合理調整傳參來解決的。所以在我寫的代碼中,傳參的個數很多,而且不看注釋的話,很難理解。這是我算法的一大弊病。這個在日后的學習中,我會尋找更優(yōu)的方法來解決。 現在我們還存在的一個問題就是誤差有些大?,F在還沒有找到根源。我分析了一下,感覺可能的原因有2種。 第一,截斷誤差。在計算過程中,我把公式分開了計算,每次計算由

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論