線性方程組地直接解法實驗報告材料
word本科實驗報告課程名稱:數(shù)值計算方法B實驗項目:線性方程組的直接解法最小二乘擬合多項式實驗地點:ZSA401專業(yè)班級:學(xué)號:201000學(xué)生:指導(dǎo)教師:志 2012年4月13日線性方程組的直接解法一、實驗?zāi)康暮鸵髮嶒災(zāi)康模汉侠砝肎auss消元法、LU分解法或追趕法求解方程組。實驗要求:利用高斯消元法,LU分解法或追趕法進(jìn)展編程,求解題中所給的方程組。二、實驗容和原理實驗容:合理利用Gauss消元法、LU分解法或追趕法求解如下方程組:n=5,10,100,實驗原理:這個實驗我選用的是高斯消元法。高斯消元法:先按照Lik=aik(k-1)/akk(k-1) ,aij(k)=aij(k-1)-likakj(k-1)其中k=1,2,n-1;i=k+1,k+2,n;j=k+1,k+2,n+1 將方程組變?yōu)樯先蔷仃?,再?jīng)過回代,即可求解出方程組的解。三.計算公式 通過消元、再回代的求解方法稱為高斯消元法。特點是始終消去主對角線 下方的元素。四、操作方法與實驗步驟#include "Stdio.h"#define N 3main() double aNN+1,bN; int i,j,k,x=0; for(i=0;i<N;i+) for(j=0;j<=N;j+) scanf("%lf",&aij); for(k=0;k<N;k+) for(i=x;i<N-1;i+) for(j=N;j>=0;j-) ai+1j=ai+1j-axj*ai+1x/axx; x+; for(i=0;i<N;i+) for(j=0;j<=N;j+) printf("%lf ",aij); printf("n"); b2=a23/a22; b1=(a13-a12*b2)/a11; b0=(a03-a02*b2-a01*b1)/a00; for(i=0;i<N;i+) printf("x(%d)=%lfn",i+1,bi); getch(); 五、實驗數(shù)據(jù)記錄和處理實驗結(jié)果:六、實驗結(jié)果與分析大體來說,實現(xiàn)了課程設(shè)計的算法要求與功能,有很多還不能很好的處理的問題,需要我們在改良中不斷完善。做本次實驗中有些地方有困難,就是獲得數(shù)組中各元素的值,要用到for循環(huán)來輸入各個元素的值。還有就是將方程組化為上三角矩陣,也要用到好幾個for循環(huán),比擬容易出錯。七、討論、心得做實驗要求我們把根底學(xué)扎實,上機實驗讓我又重新鞏固了C語言知識。我的實驗是線性方程組的直接解法,剛開始調(diào)試代碼的時候有時候就是很小的錯誤導(dǎo)致整個程序不能運行,需要我們一步一步慢慢來,經(jīng)過無數(shù)次的檢查程序錯誤的原因,以與在教師的幫助下,完成了這次實驗。最小二乘擬合多項式一、實驗容給定數(shù)據(jù)點xi ,yi,用最小二乘法擬合數(shù)據(jù)的多項式,并求平方誤差。xi0yi1二、 計算公式y(tǒng)=a0+a1x三、 結(jié)構(gòu)程序設(shè)計/最小二乘法擬合/本程序包含兩個函數(shù),主函數(shù)與Gauss消元函數(shù)#include<stdio.h>#include<math.h>#define N 10#define M 20double ANN+1;void Gauss_eliminate(int n,double* answer) int k,i,j,sum;/*消元重構(gòu)矩陣使之成為上三角矩陣*/ for(k=1;k<n;k+) /k為高斯消元法上標(biāo),指示消元代數(shù) for(i=k+1;i<=n;i+) Aik=Aik/Akk; for(i=k+1;i<=n;i+) for(j=k+1;j<=n+1;j+) Aij=Aij-Akj*Aik; for(i=2;i<=n;i+) for(j=1;j<i;j+) Aij=0;/*回代求解*/ answern=Ann+1/Ann; /xn可直接解出 for(i=n-1;i>=1;i-) sum=0; for(j=i+1;j<=n;j+) sum+=Aij*answerj; answeri=(Ain+1-sum)/Aii; void main() int k; printf("請輸入擬合次數(shù):n"); scanf("%d",&k); int n=k+1; int m,i,j; double sumM; double xM,yM; printf("請輸入散點的個數(shù):"); scanf("%d",&m); printf("請創(chuàng)建數(shù)組x:n"); for(i=0;i<m;i+) scanf("%lf",&xi); printf("請創(chuàng)建數(shù)組y:n"); for(i=0;i<m;i+) scanf("%lf",&yi); /求系數(shù)矩陣 for(i=0;i<M;i+) sumi=0; /初始化 for(i=0;i<2*k+1;i+) for(j=0;j<m;j+) sumi+=pow(xj,i); for(i=0;i<n;i+) for(j=0;j<m;j+) sum2*k+1+i+=pow(xj,i)*yj; /創(chuàng)建系數(shù)矩陣 int count; for(i=1;i<=n;i+) /先建上三角矩陣 Aii=sum2*(i-1); for(j=i+1,count=1;j<=n;j+) Aij=sum2*(i-1)+count; count+; for(i=2;i<=n;i+) /通過對稱建立下三角 for(j=1;j<i;j+) Aij=Aji; for(i=1;i<=n;i+) /增廣矩陣的一列 Ain+1=sum2*k+i; /輸出測試 printf("增廣矩陣為:n"); for(i=1;i<=n;i+) for(j=1;j<=n+1;j+) printf("%lft",Aij); printf("n"); double answerN; Gauss_eliminate(n,answer); /*輸出解*/ for(i=1;i<=n;i+) printf("a%d=%lft",i-1,answeri); getchar(); getchar();四、 實驗結(jié)果與討論、心得討論、心得:剛開始調(diào)試代碼的時候有時候就是很小的錯誤導(dǎo)致整個程序不能運行,需要我們一步一步慢慢來,經(jīng)過無數(shù)次的檢查程序錯誤的原因,以與在教師的幫助下,完成了這次實驗。這段時間的實驗課提高了我的分析問題,解決問題的能力,特別提高了對一個程序的整體操作能力,對程序的細(xì)微之處有了明顯的提高認(rèn)識的地方,追求最實用的程序,彌補學(xué)習(xí)上的不足,同時認(rèn)識到還應(yīng)深入理解課本上的知識,學(xué)過的東西要知道理論與實踐相結(jié)合,增加動手能力。8 / 8