n階方陣求逆矩陣__C語言課程設計報告_第1頁
n階方陣求逆矩陣__C語言課程設計報告_第2頁
n階方陣求逆矩陣__C語言課程設計報告_第3頁
n階方陣求逆矩陣__C語言課程設計報告_第4頁
n階方陣求逆矩陣__C語言課程設計報告_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、C語言程序設計 姓 名 學 號 一卡通號 n階方陣求逆矩陣題目n階方陣求逆(B級)功能要求:輸入一個nn256階方陣A,方程系數矩陣與向量均從文本文件讀入;輸出A的逆矩陣至文本文件;將得到的逆矩陣與矩陣A相乘,驗證其結果是否為單位矩陣。提示:具體算法可參考相關文獻。題目分析逆矩陣定義: 設A為n階方陣,如果存在n階方陣B,使得 AB=BA=E, 那么稱A是可逆的,并稱B是A的逆矩陣。否 那么,便說A是不可逆的。題目分析矩陣乘法: 假設A是一個m*n階矩陣,B是一個n*p階矩陣,那么AB=C是一個m*p階矩陣,而C中的每一個i,j元都等于A的第i行中的各元和B的第j列的各對應元之乘積的和。 算法

2、設計 在數學問題中,求解方陣逆矩陣的方法有很多。其中比較常見的一種方法是用初等變換求方陣的逆矩陣,即高斯消元法求逆矩陣。高斯消元法可以用來找出一個可逆矩陣的逆矩陣。設A 為一個N * N的矩陣,其逆矩陣可被兩個分塊矩陣表示出來。將一個N * N單位矩陣 放在A 的右手邊,形成一個N * 2N的分塊矩陣B = A,I 。經過高斯消元法的計算程序后,矩陣B 的左手邊會變成一個單位矩陣I ,而逆矩陣A - 1 會出現在B 的右手邊。 開始從文本讀入系數矩陣及向量將矩陣變成增廣矩陣找到一行中不為零的數是否跳出當前循環該矩陣為奇異矩陣單位化矩陣消元直到循環玩每一行輸出逆矩陣至文本文件逆矩陣與原矩陣相乘結

3、束如下圖是程序的算法流程圖。從中我們可以看出該程序主要分為七局部,分別為:文件的讀入局部、判斷是否為逆矩陣局部、單位化矩陣局部、消元局部、打印步驟局部、檢驗乘積局部及輸出局部。其中單位化和消元局部是本程序設計的核心,即高斯消元法的主要步驟。具體程序如下:/采用高斯消元法#include #include #define maxn 1000#define err 1e-8/宏定義保證計算中準確性double amaxnmaxn*3;/maxn是代碼最大元素的下標double abs(double a)/返回傳遞給它的參數的絕對值函數 if (a0) return a; else return -

4、a;/定義絕對值函數 在運算的過程中,我們要判斷一些數據是否為零,這時候我們采用宏定義#define err 1e-8方式,通過將得出數據在絕對值與e-8進行比較,可以保證我們計算的準確性。 int main() printf(Now read the matrix from m.txt.n); int n,i,j,k; double l; FILE * f1 =fopen(m.txt,r); fscanf(f1,%d,&n);/從文本文件讀入方程系數矩陣 memset(a,0,sizeof(a);/數組a初始化 for (i=0;in;i+) for (j=0;jn;j+) fscanf(f

5、1,%lf,&aij);/從文本讀入矩陣 aij+2*n=aij;/在n*2n階矩陣后再加上原矩陣形成n*3n階矩陣 fclose(f1); printf(Done reading.n);從文本文件分別讀入方程系數矩陣與向量 for (i=0;in;i+) aii+n=1;/建立單位矩陣,即將單位矩陣變成伴隨矩陣 for (i=0;in;i+) bool got=false;/定義布爾型變量 for (j=i;jerr) got=true; for (k=0;k=i;j-) aij/=aii;/單位化矩陣 for (j=0;jerr) for (k=n*2-1;k=i;k-) ajk-=aik

6、*aji/aii;/消元 此局部是本程序設計的核心,是高斯消元法的單位化和消元局部。/打印每步化簡及計算過程 printf(Step %i:n,i); for (j=0;jn;j+) for (k=0;kn*2;k+) printf(%.2lf ,ajk); printf(n); printf(nn); printf(Done nijvzhengwei:nn);for (i=0;in;i+) for (j=0;jn;j+) printf(%.2lf ,aij+n);printf(n);/在程序中輸出逆矩陣 為了保證程序的可視性,我們在這里打印每步的計算和化簡過程。printf(n); prin

7、tf(nijvzhengyijinshuruzhiwenbenwenjian“ans.txt.nn);/逆矩陣已經輸入至文本文件ans.txt f1=fopen(ans.txt,w); fprintf(f1,%in,n); for (i=0;in;i+) for (j=0;jn;j+) fprintf(f1,%.2lf ,aij+n); fprintf(f1,n); fclose(f1); /輸出逆矩陣在程序運行時輸出答案,并輸出答案至自動創立的文本文件ans.txt printf(A * A-1=n); for (i=0;in;i+) for (j=0;jn;j+) l=0; for (k=

8、0;kn;k+) l+=aik+2*n*akj+n; printf(%.2lf ,l+err); /判斷逆矩陣與原矩陣的乘積是否為單位矩陣 printf(n); printf(n); return 0; 此局部是判斷逆矩陣與原矩陣的乘積是否為單位矩陣。參考m*n階矩陣與n*p階矩陣相乘的程序,我們利用循環結構來實現。運行結果不存在逆矩陣:不存在逆矩陣的情形有很多種,可能是初始矩陣的某行全為零,也有可能是初始矩陣經過變化之后其某行全部變為零。此時,無答案輸出至文本文件。2.存在逆矩陣的情形,這里選取了一6階方陣,如下圖為一6階方陣,在VC中運行運行后,我們可以得到如下的結果 如下圖我們可以清楚的看到,程序在將從文本輸入的矩陣變成增廣矩陣之后,分別對每一行元素進行單位化

溫馨提示

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

評論

0/150

提交評論