數值分析實驗報
告學院:計算機學院
班級:信計0801班
姓名:陳夢
學號:0808060107
一、 上機題目
1、用高斯列主元消去法求解線形方程組:
2、用追趕法解三對角方程組ax=b,其中
,.二、 數學模型建立
1、 高斯列主元消去法
用高斯消去法求解線性方程組時,應避免小的主元.在實際計算中,進行第k步消去前,應該在第k列元素(i=k,…,n)中找出絕大值最大者,例如
再把第p個方程與第k個方程組進行交換,使成為主元.我們稱這個過程為選主元.由於只在第k列元素中選主元,通常也稱為按列選主元(或稱部分選主元).
如果在第k步消去前,在第k個方程到第n個方程所有的到的係數(i=k,…,n;j=k,…,n)中,找出絕對值最大者,例如
再交換第k,p兩個方程和第k,q兩個未知量的次序,使成為主元. 稱這個過程為完全選主元.
不論是哪種方式選出主元,而後再按上面介紹的計算步驟進行消去的計算,一般都稱為選主元的高斯消去法.在實際計算中,常用按列選主元的高斯消去法.
2、 追趕法
在一些實際問題中,例如解常微分方程邊值問題,解熱傳導方程以及船體數學放樣中建立三次樣條函式等,都會要求解係數矩陣為對角佔優的三對角線方程組
,簡記為.
求解等價於解兩個三角形方程組:
;.從而得到解三對角線方程組的追趕法公式:
(1) 計算的遞推公式
(2) 解
(3) 解
我們將計算係數
將計算方程組的解
三、 演算法分析
1、 高斯列主元消去法
該演算法的主要思想是通過在主函式main()中依次呼叫三個函式input()、gaosi()、solution()來實現列主元的消去並求出方程組的解。其中函式input()用來輸入方程組的個數、係數矩陣及右端項的值;然後在函式gaosi()中通過三重for迴圈語句,判斷是否需要進行行的交換即主元的選擇,進而來實現高斯列主元消去演算法,並在執行時將每次進行主元選擇後的係數矩陣都輸出了;最後,呼叫函式solution()輸出方程組的解。
2、 追趕法
在該演算法中,定義了三個一維陣列來存放主對角線下方、主對角線及主對角線上方的元素的值。在主函式main()中,輸入主對角線下方、主對角線及主對角線上方的元素,並輸入右端項,然後通過呼叫函式ludecompose()和backsubs()來實現追趕法,其具體演算法見程式部分,最後在主函式中將計算的方程組的解輸出即可。
四、 程式源**
1、 高斯列主元消去法
#include<>
#include<>
int n;
float a[50][50],b[50];
void output()
}void input()
printf("請輸入右端項b:\n");
for(i=0;iscanf("%f",&b[i]);
printf("\n");
}void gaosi()
output();
for(i=k+1;i
}printf("\n");
}void solution()
printf("求得方程組的解為:\n");
for(i=0;i printf("x%d=%f\n",i+1,b[i]);
}void main()
2、 追趕法
#include <>
#include <>
#include<>
#define n 20
double a[n], b[n], c[n-1], f[n], r[n];
int n;
void ludecomposelu分解
void backsubs回代
void main()
printf("\n輸入下三角元素\n");
printf("輸入%d個a值: ", n-1);
for (int i=1; i scanf("%lf", &a[i]);
getchar();
printf("\n輸入主對角線元素\n");
printf("輸入%d個b值: ", n);
for (i=0; i scanf("%lf", &b[i]);
getchar();
printf("\n輸入上三角元素\n");
printf("輸入%d個c值: ", n-1);
for (i=0; i scanf("%lf", &c[i]);
getchar();
printf("\n輸入%d個方程組右端項: \n", n);
for (i=0; i scanf("%lf", &f[i]);
getchar();
ludecompose();
backsubs();
printf("\n線性方程組的解為: \n");
for (i=0; i printf("x%d=%lf\n", i+1, f[i]);
}void ludecompose被b取代, β被c取代, 以節省儲存空間
c[0]=c[0]/b[0];
for(int i=1;i r[i]=a[i];
b[i]=b[i]-r[i]*c[i-1];
c[i]=c[i]/b[i];
}r[i]=a[i];
b[i]=b[i]-r[i]*c[i-1];
}void backsubsy被f取代, x也被f取代, 以節省儲存空間
f[0]=f[0]/b[0];
for(int i=1; i f[i]=(f[i]-r[i]*f[i-1])/b[i];
f[n-1]=f[n-1];
for(i=n-2;i>=0;i--)
f[i]=f[i]-c[i]*f[i+1];
}五、 上機執行截圖
1、 高斯列主元消去法
2、 追趕法
六、 程式流程圖
1、 高斯列主元消去法
2、 追趕法
七、 結果分析
1、 高斯列主元消去法
為了能夠更好的說明程式的準確性,在此採用了課本上的第148-149頁的例題,即
方程組為,求得該方程組的解為
課本上計算的方程組的解為
二者比較可得,由該演算法計算的結果與課本上的例題是相近的。可見該程式是比較理想的。
2、 追趕法
用該程式計算三對角線方程組
, 其解為
容易驗證,其計算結果是比較準確的。
八、 心得體會
通過這次上機實驗,我掌握了用高斯列主元消去法求線性方程組的解以及用追趕法求解三對角線方程組的解的基本思想和原理,懂得了如何編寫c語言程式**來求解這兩類數學問題。在編寫程式的過程中,我對以前學過的c語言知識進行了回顧,溫故而知新,相信也使自己的程式設計能力有了一定的提高。
在進行高斯列主元消去法的程式設計過程中,開始時編寫的程式不能正確表示列主元消去演算法,導致執行結果出錯。後來經過認真分析和思考,較好地解決了該問題。
通過追趕法的程式設計,我掌握了求解三對角線方程組的根的基本思想和原理,這是不同於求解其它線性方程組的一種比較好的解決此類方程組的特殊方法,能更好、更有效地求得方程組的解。
我覺得在一次實驗中,要做的不僅是對方法原理的熟知,更要舉一反三,注重細節,這樣才能對自己的程式設計能力有所提高,這也是上機的另乙個重要的目的。
數值分析實驗報告
實驗一題目一 已知函式表如下 試用三次lagrange插值多項式求x 0.5635時的函式值。解 lagrange插值法公式 程式框圖如下 本題中n 4 分析設計思想 設計思路如上面的流程圖所示,用我們學過的c語言程式設計實現。程式清單 include include include float l...
數值分析實驗報告
數值分析 課程設計實驗報告模板 常微分方程資料值解 用龍格 庫塔法分析lorenz方程的特性 一 考慮著名的lorenz方程 其中s,r,b為變化區域內有一定限制的實引數,該方程形式簡單,表面上看並無驚人之處,但由該方程揭示出的許多現象,促使 混沌 成為數學研究的嶄新領域,在實際應用中產生了巨大的影...
數值分析實驗報告
實驗專案 a 列主元高斯消去法 b 矩陣直接三角分解法 c 雅可比迭代法 d 高斯 賽德爾迭代法 e sor迭代法 f 冪法求最大特徵值 實驗名稱 列主元高斯消去法 實驗目的 熟悉了解高斯消去法的原理,並知道如何用高斯消去法求方程組的解 實驗所用的軟體 win tc 版本 1.9.0.0 例項用高斯...