合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料

上傳人:無*** 文檔編號:83443424 上傳時間:2022-05-01 格式:DOC 頁數(shù):33 大?。?36KB
收藏 版權申訴 舉報 下載
合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料_第1頁
第1頁 / 共33頁
合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料_第2頁
第2頁 / 共33頁
合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料_第3頁
第3頁 / 共33頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料》由會員分享,可在線閱讀,更多相關《合肥工業(yè)大學 計算機專業(yè) 計算方法實驗報告材料(33頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、word 工業(yè)大學 計算機與信息學院 實驗報告 課 程:計算方法 專業(yè)班級: 學 號: 姓 名: 33 / 33 Java界面 其實都不難按照程序流程圖就可以完成了 實驗一插值與擬合 一、 實驗目的 (1) 明確插值多項式和分段插值多項式各自的優(yōu)缺點; (2) 編程實現(xiàn)三次樣條插值算法,分析實驗結(jié)果體會高次插值產(chǎn)生的龍格現(xiàn)象; (3) 理解最小二乘擬合,并編程實現(xiàn)線性擬合,掌握非線性擬合轉(zhuǎn)化為線性擬合的方法 (4) 運用常用的插值和擬合方法

2、解決實際問題。 二、 實驗容 (1)對于f(x)=1/(1+x*x)實現(xiàn)三次樣條插值 (2)實現(xiàn)最小二乘法的直線擬合 數(shù)據(jù)如下: 165 123 150 123 141 187 126 172 125 148 三、 根本原理〔計算公式〕 (1)三次樣條插值在每個節(jié)點上具有2階導數(shù)。 (2) 最小二乘法擬合直線為y=a+bx,而a,b有如下等式〔N為給出的數(shù)據(jù)點的總個數(shù)〕 ; 四、算法設計與實現(xiàn)〔流程圖,關鍵點〕 最小二乘法直線擬合:輸入數(shù)據(jù)后,按照公式計算a,b。用得到的擬合直線計算預測點的近似函數(shù)值。 五、輸入與輸出

3、(1)三次樣條插值 輸入:區(qū)間長度,n+1個數(shù)據(jù)點,預測點 輸出:預測點的近似函數(shù)值,準確值,與誤差 (2)最小二乘法直線擬合 輸入:n個數(shù)據(jù)點,預測點 輸出:預測點的近似函數(shù)值 六、結(jié)果討論和分析 代碼 三次樣條插值 #include #include #define N 10 using namespace std; double u0(double x){ return (x-1)*(x-1)*(2*x+1); } double u1(double x){ return x*x*(3-2*x); }

4、 double v0(double x){ return x*(x-1)*(x-1); } double v1(double x){ return x*x*(x-1); } double s3(double x,double y,double y1,double m,double m1,double h){ return u0(x)*y+u1(x)*y1+h*v0(x)*m+h*v1(x)*m1; } double f(double x){ return 1/(1+x*x); } int main(){ ifstream fin;

5、 fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"<

6、N;i++){ fin>>x[i]>>y[i]; } fin>>f0>>fn; h[0]=x[1]-x[0]; for(i=1;i

7、){ B[i]=2; C[i]=a[i]; } for(i=2;i0;i--){ m[i]=m[i]-C[i]*m[i+1]; }

8、cout<<"please:(輸入插值節(jié)點在"<>temp){ double tt=temp; if(tempx[N]){ cout<<"插值節(jié)點為"<

9、i],h[i-1]); cout<<"插值節(jié)點為"< #include #define n 5 using namespace std; double sum(double x[],int k){ int i; double sum=

10、0; for(i=0;i

11、uble sum=0; for(i=0;i

12、 } double x[n],y[n],a,b; double x0,y0; int i; for(i=0;i>x[i]>>y[i]; } b=(n*sumxy(x,y,n)-sum(x,n)*sum(y,n))/(n*sum2(x,n)-sum(x,n)*sum(x,n)); a=(sum(y,n)-b*sum(x,n))/n; cout<<"最小二乘法直線擬合得到a: "<

13、合直線為y="<>x0){ y0=a+b*x0; cout<<"當x="<

14、點加速; (3) 理解并掌握自適應算法和收斂加速算法的根本思想; (4) 分析實驗結(jié)果體會各種方法的準確度,建立計算機求解定積分問題的感性認識 二、 實驗容 (1) 用龍貝格算法計算 (2) 用中點加速方法計算的一階導數(shù) 三、 根本原理〔計算公式〕 (1)龍貝格算法 梯形遞推公式 加權平均公式: (2) 中點加速 中點公式: G(h)=(f(a+h)-f(a-h))/2/h 加權平均:G1(h)=4*G(h/2)/3-G(h)/3 G2(h)=16*G1(h/2)/15-G1(h)/15 G3(h)=64*G2(h/2)/63-G2(h)/63 四

15、、 算法設計與實現(xiàn)〔流程圖,關鍵點〕 中點加速梯形遞推算法流程圖 龍貝格算法流程圖 :輸入數(shù)據(jù)后根據(jù)公式計算導數(shù)值 五、輸入與輸出 (1) 用龍貝格算法計算 輸入:積分區(qū)間,誤差限 輸出:序列Tn,Sn,,Rn與積分結(jié)果 (2) 用中點加速方法計算的一階導數(shù) 輸入:求導節(jié)點,步長 輸出:求得的導數(shù)值,準確值 六、結(jié)果討論和分析 代碼 龍貝格算法 #include #include #include using namespace std; double f(double x){

16、 if(x==0)return 1; return sin(x)/x; } int main(){ ifstream fin; fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"<

17、,r2; double x,h,s; fin>>a>>b>>e; cout<<"積分區(qū)間為["<

18、o{ s=s+f(x); x=x+h; }while(x

19、c2<

20、"數(shù)值積分結(jié)果為"< #include #include using namespace std; double f(double x){ return exp(x); } double f1(doub

21、le x){ return exp(x); } double g(double x,double h){ return (f(x+h)-f(x-h))/2/h; } double g1(double x,double h){ return 4*g(x,h/2)/3-g(x,h)/3; } double g2(double x,double h){ return 16*g1(x,h/2)/15-g1(x,h)/15; } double g3(double x,d

22、ouble h){ return 64*g2(x,h/2)/63-g2(x,h)/63; } int main(){ ifstream fin; fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"<>a>

23、>h) cout<<"當x="<

24、結(jié)果體會初值對迭代的影響 二、 實驗容 用牛頓下山法解方程〔初值為0.6〕 三、 根本原理〔計算公式〕 求非線性方程組的解是科學計算常遇到的問題,有很多實際背景.各種算法層出不窮,其中迭代是主流算法。只有建立有效的迭代格式,迭代數(shù)列才可以收斂于所求的根。因此設計算法之前,對于一般迭代進展收斂性的判斷是至關重要的。牛頓法也叫切線法,是迭代算法中典型方法,只要初值選取適當,在單根附近,牛頓法收斂速度很快,初值對于牛頓迭代 至關重要。當初值選取不當可以采用牛頓下山算法進展糾正。 一般迭代: 牛頓公式: 牛頓下山公式: 下山因子 下山條件 四、算法設計與實現(xiàn)〔流程圖,

25、關鍵點〕 牛頓下山算法流程圖 五、輸入與輸出 輸入:初值,誤差限,迭代最大次數(shù),下山最大次數(shù) 輸出:近似根各步下山因子 六、結(jié)果討論和分析 代碼 牛頓下山法 #include #include #include using namespace std; double f(double x){//函數(shù) return x*x*x-x-1; } double f1(double x){//一階導數(shù) return 3*x*x-1; }

26、 int main(){ ifstream fin; fin.open("E:\\t.txt" ); if(!fin){ cout << "Error opening input stream" << endl; system("pause"); return 0; } double x0,x1,e,j,temp; int N,M,k,i; fin>>x0>>e>>M>>N; cout<<"迭代初值為"<

27、e<<",最大下山次數(shù)為"<=M)break;

28、 }while(fabs(f(x1))>=fabs(f(x0))); if(i>=M){ cout<<"重新選擇x0"<

29、 x0=x1; } if(k>=N)cout<<"迭代失敗"<

30、爾迭代法求 (2) 列主元高斯消去法求 (3) LU分解法求解方程組 三、 根本原理〔計算公式〕 線性方程組大致分迭代法和直接法。只有收斂條件滿足時,才可以進展迭代。雅可比與高斯-塞德爾是最根本的兩類迭代方法,最大區(qū)別是迭代過程中是否引用新值進展剩下的計算。消元是最簡單的直接法,并且也十分有效的,列主元高斯消去法對求解一般的線性方程組都適用,同時可以用來求矩陣對應的行列式。約當消去實質(zhì)是經(jīng)過初等行變換將系數(shù)矩陣化為單位陣,主要用來求矩陣的逆。在使用直接法,要注意從空間、時間兩方面對算法進展優(yōu)化。 高斯-塞德爾迭代: 列主元高斯消去法:列主元 消元 回代

31、 四、算法設計與實現(xiàn)〔流程圖,關鍵點〕 列主元的高斯消去流程圖 G-S迭代算法流程圖 LU分解法:依次求得L、U、y和x 五、輸入與輸出 (1) 用高斯-塞德爾迭代法 輸入:系數(shù)矩陣A,最大迭代次數(shù)N,初始向量,誤差限e 輸出:解向量 (2) 列主元高斯消去法 輸入:系數(shù)矩陣A 輸出:解向量 (3) LU分解法 輸入:系數(shù)矩陣A 輸出:解向量 六、結(jié)果討論和分析 代碼 高斯塞德爾迭代 #include #include #

32、include #define n 3 using namespace std; void show(double a[n+1][n+1],double b[n+1]){ int i,j; cout<<"原方程為:"<

33、<"*x"<< j<<"="<

34、,N; fin>>e>>N; for(i=1;i<=n;i++){ fin>>x[i]; y[i]=x[i]; } cout<<"初始向量為:"; for(i=1;i>a[i

35、][j]; fin>>b[i]; } show(a,b); k=0; while(true){ for(i=1;i<=n;i++){ temp=0; for(j=1;j<=n;j++) if(j!=i)temp=temp+a[i][j]*y[j]; y[i]=(b[i]-temp)/a[i][i]; } max=fabs(y[1]-x[1]); for(i=2;i<=n;i+

36、+) if(max

37、 k++; for(i=1;i<=n;i++)x[i]=y[i]; } } fin.close(); system("pause"); return 0; } 高斯消去 #include #include #include #define n 3 using namespace std; void show(double a[n+1][n+1],double b[n+1]){ int i,j; cout<<"原方程為:"<

38、dl; for (i = 1; i <= n; i++) { for (j = 1; j < n; j++) if (a[i][j + 1] < 0) cout<

39、"error opening input stream"<>a[i][j]; fin>>b[i]; }

40、show(a,b); k=1; do{ d=a[k][k]; l=k; i=k+1; do{ if(i>n)break; if(fabs(a[i][k])>fabs(d)){ d=a[i][k];

41、 l=i; } if(i==n)break; i++; }while(true); if(d==0){ cout<<"奇異"<

42、 system("pause"); fin.close(); return 0; } if(l!=k){ for(j=k;j<=n;j++){ t=a[l

43、][j]; a[l][j]=a[k][j]; a[k][j]=t; } t=b[k]; b[k]=b[l];

44、 b[l]=t; } for(j=k+1;j<=n;j++){ a[k][j]=a[k][j]/a[k][k]; } b[k]=b[k]/a[k][k]; for(i=k+1;i<=n;i++){

45、 for(j=k+1;j<=n;j++){ a[i][j]=a[i][j]-a[i][k]*a[k][j]; } } for(i=k+1;i<=n;i++)b[i]=b[i]-a[i

46、][k]*b[k]; if(k==n)break; k++; }while(true); for(i=n-1;i>=1;i--){ t=0; for(j=i+1;j<=n;j++){ t=t+a[i][j]*b[j];

47、 } b[i]=b[i]-t; } cout<<"列主元的高斯消去法求得原方程的解為:" ; for(i=1;i<=n;i++)cout<<"x"<

48、eam> #include #define n 3 using namespace std; void show(double a[n+1][n+1],double b[n+1]){ int i,j; cout<<"原方程為:"<

49、

50、][n+1],x[n+1],y[n+1]; double t; int i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++)fin>>a[i][j]; fin>>b[i]; } show(a,b); for(i=1;i<=n;i++){ for(j=1;j

51、 t=0; for(k=1;k

52、=i;j<=n;j++){ t=0; for(k=1;k

53、 } for(i=1;i<=n;i++){ t=0; for(j=1;j=1;i--){ t=0; for(j=i+1;j<=n;j++)t=t+u[i][j]*x[j];

54、 x[i]=(y[i]-t)/u[i][i]; } cout<<"LU分解法求得原方程的解為:" ; for(i=1;i<=n;i++)cout<<"x"<

55、ung-Kutta方法; (3) 通過實驗結(jié)果分析各個算法的優(yōu)缺點; (4) 明確步長對算法的影響并理解變步長的Rung-Kutta方法 二、 實驗容 0 < x<1 取h=0.1時用亞當姆斯方法,Rung-Kutta方法求其數(shù)值解并與準確解進展比擬。 三、 根本原理〔計算公式〕 在許多科學技術問題中,建立的模型常常以常微分方程的形式表示。然而,除了少數(shù)特殊類型的常微分方程能用解析方法求其準確解外,要給出一般方程解析解的表達式是困難的。所以只能用近似方法求其數(shù)值解,在實際工作中常用計算機求常微分方程的數(shù)值解。所謂常微分方程的數(shù)值解即對于常微分方程初值問題計算出在一系列節(jié)點

56、 a = x0< x1<…< xn= b 處的未知函數(shù) y(x)近似值y0,y1,…yn,即找到一系列離散點〔x0,y0〕〔x1,y1〕〔x2,y2〕…〔xn,yn〕近似滿足常微分方程。數(shù)值解法的根本思想用差商代替導數(shù),實現(xiàn)連續(xù)問題離散化,選取不同的差商代替導數(shù)可以得到不同公式。 改良歐拉公式是常用方法之一,包括預測和校正兩步。先用歐拉公式進展預報,再將預報值代入梯形公式進展校正,從而達到二階精度。通過龍格-庫塔法我們可以獲得更高精度。經(jīng)典龍格-庫塔法即在區(qū)間[xn,xn+1]取四點,并對這四點的斜率進展加權平均作為平均斜率,通過泰勒公式尋找使局部截斷誤差為O(h5)〔即4階精度〕的參數(shù)滿足

57、條件。 四階〔經(jīng)典〕龍格-庫塔公式 四、 算法設計與實現(xiàn)〔流程圖,關鍵點〕 亞當姆斯方法 經(jīng)典龍格庫塔算法 五、 輸入與輸出 輸入:求解區(qū)間,初值,數(shù)值解個數(shù) 輸出:數(shù)值解 六、 結(jié)果討論和分析 代碼 龍格-庫塔方法 #include #include #include using namespace std; double f(double x,double y){ return y-2*x/y;//函數(shù) } double f

58、0(double x){ return pow(1+2*x,0.5); } int main(){ ifstream fin; fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"<

59、int N,n; fin>>x0>>y0>>h>>N; cout<<"龍格-庫塔方法求解常微分方程,初始條件為步長h="<< h << ",初值為x0=" < #include #include using namesp

61、ace std; double f(double x,double y){ return y-2*x/y;//函數(shù) } double f0(double x){ return pow(1+2*x,0.5); } void fc(double y[],double x[],int n,double h){ double k1,k2,k3,k4; int i; for(i=0;i

62、x[i],y[i]); k2=f(x[i]+h/2,y[i]+h*k1/2); k3=f(x[i]+h/2,y[i]+h*k2/2); k4=f(x[i]+h,y[i]+h*k3); y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6; } } int main(){ ifstream

63、 fin; fin.open("E:\\t.txt"); if(!fin){ cout<<"error opening input stream"<>x[0]>>y[0]>>h>>N; cout<<"亞當姆斯方法求解常微分方程,初始條件為步長h="<<

64、 h << ",初值為x0=" <

65、 yp=y[3]+h*(55*y1[3]-59*y1[2]+37*y1[1]-9*y1[0])/24; yp1=f(x[4],yp); y[4]=y[3]+h*(9*yp1+19*y1[3]-5*y1[2]+y1[1])/24; y1[4]=f(x[4],y[4]); cout<<"當x= "<

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

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!