n階方陣求逆矩陣__C語言課程設(shè)計(jì)報(bào)告_第1頁(yè)
n階方陣求逆矩陣__C語言課程設(shè)計(jì)報(bào)告_第2頁(yè)
n階方陣求逆矩陣__C語言課程設(shè)計(jì)報(bào)告_第3頁(yè)
n階方陣求逆矩陣__C語言課程設(shè)計(jì)報(bào)告_第4頁(yè)
n階方陣求逆矩陣__C語言課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

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

4、a;/定義絕對(duì)值函數(shù) 在運(yùn)算的過程中,我們要判斷一些數(shù)據(jù)是否為零,這時(shí)候我們采用宏定義#define err 1e-8方式,通過將得出數(shù)據(jù)在絕對(duì)值與e-8進(jìn)行比較,可以保證我們計(jì)算的準(zhǔn)確性。 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);/從文本文件讀入方程系數(shù)矩陣 memset(a,0,sizeof(a);/數(shù)組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);從文本文件分別讀入方程系數(shù)矩陣與向量 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;/消元 此局部是本程序設(shè)計(jì)的核心,是高斯消元法的單位化和消元局部。/打印每步化簡(jiǎn)及計(jì)算過程 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);/在程序中輸出逆矩陣 為了保證程序的可視性,我們?cè)谶@里打印每步的計(jì)算和化簡(jiǎn)過程。printf(n); prin

7、tf(nijvzhengyijinshuruzhiwenbenwenjian“ans.txt.nn);/逆矩陣已經(jīng)輸入至文本文件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); /輸出逆矩陣在程序運(yùn)行時(shí)輸出答案,并輸出答案至自動(dòng)創(chuàng)立的文本文件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階矩陣相乘的程序,我們利用循環(huán)結(jié)構(gòu)來實(shí)現(xiàn)。運(yùn)行結(jié)果不存在逆矩陣:不存在逆矩陣的情形有很多種,可能是初始矩陣的某行全為零,也有可能是初始矩陣經(jīng)過變化之后其某行全部變?yōu)榱?。此時(shí),無答案輸出至文本文件。2.存在逆矩陣的情形,這里選取了一6階方陣,如下圖為一6階方陣,在VC中運(yùn)行運(yùn)行后,我們可以得到如下的結(jié)果 如下圖我們可以清楚的看到,程序在將從文本輸入的矩陣變成增廣矩陣之后,分別對(duì)每一行元素進(jìn)行單位化

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論