n階矩陣求逆矩陣(C++面向?qū)ο?_第1頁(yè)
n階矩陣求逆矩陣(C++面向?qū)ο?_第2頁(yè)
n階矩陣求逆矩陣(C++面向?qū)ο?_第3頁(yè)
n階矩陣求逆矩陣(C++面向?qū)ο?_第4頁(yè)
n階矩陣求逆矩陣(C++面向?qū)ο?_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、簡(jiǎn)嘛南筒歹院厚徳博香明自壷遁冬HUNANUNIVERStTYOFCOMMERCE旃切日強(qiáng)課程設(shè)計(jì)報(bào)告實(shí)驗(yàn)內(nèi)容:n階方陣求逆的實(shí)現(xiàn)相關(guān)課程:信息系統(tǒng)開發(fā)語(yǔ)言(一)學(xué)期:2011-2012學(xué)年第2學(xué)期學(xué)時(shí)學(xué)分:68學(xué)時(shí)4學(xué)分專業(yè)班級(jí):信管1022班學(xué)號(hào):*名:指導(dǎo)老師:提交日期:2012年06月21日信息系統(tǒng)開發(fā)語(yǔ)言(一)課程設(shè)計(jì)n階方陣求逆的實(shí)現(xiàn)一、課程設(shè)計(jì)目的1、了解什么是矩陣及逆矩陣。2、通過(guò)VC+6.0編寫一個(gè)實(shí)現(xiàn)求矩陣逆矩陣的程序。3、鞏固和加深學(xué)生對(duì)算法課程基本知識(shí)的理解和掌握。4、培養(yǎng)利用算法知識(shí)解決實(shí)際問(wèn)題的能力。5、掌握利用程序設(shè)計(jì)語(yǔ)言進(jìn)行算法程序的開發(fā)、調(diào)試、測(cè)試.6、掌握書寫

2、算法設(shè)計(jì)說(shuō)明文檔的能力。7、提高綜合運(yùn)用算法、程序設(shè)計(jì)語(yǔ)言、數(shù)據(jù)結(jié)構(gòu)知識(shí)的能力。二、問(wèn)題描述給出任意一個(gè)維數(shù)大于1小于256的矩陣,通過(guò)程序求出其逆矩陣。aaa,存在矩陣B,使得矩陣A與B的乘積為單位矩陣,則稱矩000102aaa101112aaa202122陣B為矩陣A的逆矩陣。三、問(wèn)題分析根據(jù)矩陣與逆矩陣的定義,即矩陣A與矩陣B相乘等于單位矩陣的思路,編輯程序。為使問(wèn)題更加簡(jiǎn)單明了化,現(xiàn)舉除一個(gè)具體例子,便于理解,我們?cè)谇蠼鈹?shù)學(xué)題目中,經(jīng)常會(huì)遇到這一類的題目:如求方陣A的逆矩陣aa0102aaii12aa2122a00a10a20拿到這個(gè)題,我們首先應(yīng)該是理解什么叫矩陣及逆矩陣,我們根據(jù)定

3、義可知,一個(gè)矩陣如果存在逆矩陣,那么這個(gè)矩陣的秩一定不會(huì)小于該矩陣的維數(shù),拿到一個(gè)題,要求一個(gè)逆矩陣的方法是很多的,比較常用的還是先把矩陣化為上三角或者下三角矩陣,判斷矩陣是否存在逆矩陣,然后,然后根據(jù)矩陣與逆矩陣之積等于單位矩陣從而得出逆矩陣,這是比較一般的思路,我們一下設(shè)計(jì)基本上也是以此為基礎(chǔ)的。四、算法分析、設(shè)計(jì)與描述算法分析和設(shè)計(jì)對(duì)于矩陣求逆,逆矩陣的定義是:對(duì)于n階方陣A,若存在矩陣B,使得AB=BA=E,則稱A為可逆矩陣,簡(jiǎn)稱A可逆,并稱B為A的逆矩陣。A存在逆矩陣的充要條件是|A|HO。若用定義的方法求解,計(jì)算量大,當(dāng)矩陣的階數(shù)很大時(shí)很浪費(fèi)時(shí)間,為了節(jié)省時(shí)間,通過(guò)查閱資料和上網(wǎng)搜

4、索,決定采用高斯-約旦發(fā)來(lái)進(jìn)行方陣的求逆操作。對(duì)于矩陣的乘法,利用矩陣乘法定義即可實(shí)現(xiàn),矩陣的乘法的定義是:若A是一個(gè)m*n階矩陣,B是一個(gè)n*p階矩陣,則AB=C是一個(gè)m*p階矩陣,而C中的每一個(gè)(i,j)元都等于A的第i行中的各元和B的第j列的各對(duì)應(yīng)元之乘積的和。只要按照該定義就可以求出兩個(gè)矩陣的乘積。算法描述a.高斯-約旦法求解逆矩陣的算法描述如下:首先,對(duì)于k從0到n-1作如下幾步:1)從第k行、第k列開始的右下角子陣中選取絕對(duì)值最大的元素,并記住次元素所在的行號(hào)和列號(hào),在通過(guò)行交換和列交換將它交換到主元素位置上。這一步稱為全選主元。2)m(k,k)=1/mi(k.k)3)m(k,j)

5、=m(k,j)*m(k,k),j=0,1,.,n-1;j!=k4)m(i,j)=m(i,j)-m(i,k)*m(k,j),i,j=0,1,.,n-1;i,j!=k5)m(i,k)=-m(i,k)*m(k,k),i=0,1,.,n-1;i!=k最后,根據(jù)在全選主元過(guò)程中所記錄的行、列交換的信息進(jìn)行恢復(fù),恢復(fù)的原則如下:在全選主元過(guò)程中,先交換的行(列)后進(jìn)行恢復(fù);原來(lái)的行(列)交換用列(行)交換來(lái)恢復(fù)。2.算法描述(可插入流程圖)1.程序設(shè)計(jì)的基本思路該程序設(shè)計(jì)了一個(gè)類,用于存儲(chǔ)用戶數(shù)據(jù)的方陣階數(shù)、用戶輸入的方陣數(shù)據(jù)以及方陣的逆矩陣數(shù)據(jù)。因?yàn)橛脩粜枰?jì)算的方陣的階數(shù)不定,因此采用了double型

6、指針動(dòng)態(tài)開辟內(nèi)存的方式來(lái)存儲(chǔ)用戶輸入的方陣數(shù)據(jù)和逆矩陣數(shù)據(jù)。同時(shí),該類定義了等方法,用來(lái)實(shí)現(xiàn)最成員變量的初始化,方陣求逆,矩陣相乘的操作。程序運(yùn)行開始,首先調(diào)用類的方法,在該方法中首先要求用戶輸入矩陣的階數(shù),并根據(jù)該階數(shù)開辟內(nèi)存空間,接著要求用戶輸入方陣的數(shù)據(jù),輸入完畢后,程序調(diào)用類的方法用以實(shí)現(xiàn)方陣的求逆,在求逆過(guò)程中,首先判斷該矩陣是否存在逆矩陣,若存在則進(jìn)行求逆,若不存在則給出提示并要求用戶重新輸入。求逆完成后存儲(chǔ)結(jié)果并顯示,同時(shí)程序調(diào)用類的方法對(duì)兩個(gè)矩陣進(jìn)行相乘操作,用來(lái)驗(yàn)證求逆結(jié)果是否正確。該程序設(shè)計(jì)的主要難點(diǎn)和重點(diǎn)在于方陣的逆矩陣求解方法,通過(guò)復(fù)習(xí)矩陣的相關(guān)知識(shí)和查閱資料,決定采用

7、高斯-約旦法來(lái)實(shí)現(xiàn)對(duì)方陣的求逆,為了計(jì)算的方便,數(shù)據(jù)也是采用一維數(shù)據(jù)而不是二維數(shù)據(jù)才存儲(chǔ)。矩陣類matrix的uml圖如下:martiJGj-raw:intiin_bufferdoubledut_bufferdoubled+matrix()i叫nnmrti刈L+set_data():void-Hswap(a;double&H-lnverselVlatnxOjnt,+Cheng()voicl2程序代碼及說(shuō)明#include#includeusingnamespacestd;double*B;/保存矩陣A與E的組合矩陣intN=0;voidInit()/初始化B但是還沒(méi)有輸入A的值cout現(xiàn)在請(qǐng)?jiān)?/p>

8、矩陣輸入的維數(shù)NN;if(Nl)cout檢查矩陣的維數(shù)是否正確!endl;while(N1);B二newdouble*N+l;/B0n不用inti;for(i=0;i=N;+i)Bi=newdouble2*N+1;/Bn0不用intj;for(i=0;i=N;+i)for(j=0;j=2*N;+j)Bij=(j-i=N)?1:O;voidAinit()/輸入原矩陣每一行的每一個(gè)數(shù)的值cout請(qǐng)輸入原矩陣每一行的每一個(gè)數(shù)的值:endl;inti,j;for(i=1;i=N;+i)cout輸入第i行各數(shù)的的值:endl;for(j=1;jBij;cout該矩陣為:endl;for(i=l;i二N;

9、+i)for(j=1;j=N;+j)coutsetw(9)setprecision(6)Bij;coutendl;intTo1(inti)/在進(jìn)行矩陣變成上三角是將第i行第i列的數(shù)變成1/并且返回是否變換成功/0-失敗,也就是說(shuō)改矩陣的秩不是N,并不能求出逆矩陣/1-成功,返回后進(jìn)行下一步程序intj;intii二i;doubleij;if(Biiii!=0)ij=Biiii;elsefor(j=i+1;jN)return0;/失敗for(;i=2*N;+i)/將第j行的加到第ii行Biii+=Bji;ij=Biiii;for(i=ii;i=2*N;+i)/將第ii行第ii列的變?yōu)?Biii/

10、=ij;return1;/成功返回voidTo0(inti,intj)/利用第i行第i列的數(shù)將第j行到第i行的第i列變?yōu)?if(i=j)return;intii=i,jj=j;doubleij;intn=(ij)?T:1;/在下面是j+=n/n用來(lái)檢驗(yàn)是求上三角,還是下三角/-1ij也就是將上三角變?yōu)?for(;j!=i;j+=n)for(ii=i,ij=Bji;ii=2*N;+ii)Bjii-=ij*Biii;voidPrint()inti,j;intn二N*2;coutendl該矩陣的逆矩陣為endl;for(i=l;i二N;i+)for(j=N+1;j=n;+j)coutsetw(9)s

11、etprecision(6)Bij;coutendl;/intTo1(inti)/在進(jìn)行矩陣變成上三角是將第i行第i列的數(shù)變成1/voidTo0(inti,intj)/利用第i行第i列的數(shù)將第j行到第i行的第i列變?yōu)?voidmain()Init();/初始化B但是還沒(méi)有輸入A的值A(chǔ)init();/輸入原矩陣每一行的每一個(gè)數(shù)的值inti;intflag=l;for(i=1;iN;+i)if(Tol(i)ToO(i,N)elsecout改矩陣的秩小于N,沒(méi)有逆矩陣=l&flag=l;i)if(Tol(i)To0(i,0);elsecout改矩陣的秩小于N,沒(méi)有逆矩陣i;六、程序運(yùn)行、調(diào)試和結(jié)果分

12、析1.程序運(yùn)行中出現(xiàn)的問(wèn)題及調(diào)試手段(包括異常處理)在運(yùn)行過(guò)程中是出現(xiàn)過(guò)很多問(wèn)題的,錯(cuò)誤也是非常之多的,就是各種不能運(yùn)行,先就針對(duì)錯(cuò)誤比較突出的一些問(wèn)題進(jìn)行分析,錯(cuò)誤一的提示:fatalerrorC1083:Cannotopenincludefile:stdafx.h:Nosuchfileordirectory執(zhí)行cl.exe時(shí)出錯(cuò)根據(jù)英文提示,才發(fā)現(xiàn)原來(lái)在設(shè)置代碼時(shí)我按照以前編輯程序的經(jīng)驗(yàn)預(yù)定義了一個(gè)頭文件“stdafx.h,當(dāng)我把頭文件“stdafx.h省去再次運(yùn)行時(shí),該錯(cuò)誤就已經(jīng)解決。錯(cuò)誤二的提示:warningC4508:main:functionshouldreturnavalue;

13、voidreturntypeassumed對(duì)于這個(gè)問(wèn)題,是不應(yīng)該犯的錯(cuò)誤,這個(gè)錯(cuò)誤的錯(cuò)誤源在于編輯代碼的最后一個(gè)階段,并沒(méi)有注意到int定義的函數(shù)是有返回值的而void定義的函數(shù)才沒(méi)有返回值,于是我將int改成了void,此處錯(cuò)誤就解決了。具體錯(cuò)誤代碼如下:intmain()/定義一個(gè)矩陣類matrixm;/調(diào)用該類的set_data方法,來(lái)對(duì)其內(nèi)部成員變量賦值m.set_data();/對(duì)輸入的矩陣求逆,如果求逆失敗,說(shuō)明輸入的矩陣不存在逆矩陣,則要求用戶重/新輸入while(m.InverseMatrix()=l)m.set_data();/求逆成功后,計(jì)算兩個(gè)矩陣的乘積是否為單位矩陣,用

14、以驗(yàn)證求解的正確性m.Cheng();錯(cuò)誤二的提示:errorC2143:syntaxerror:missing;before類似于錯(cuò)誤三的錯(cuò)誤是非常多的,這在編輯程序時(shí)是最容易出錯(cuò),也是最容易被遺忘的。在編輯程序時(shí),我們必須要有嚴(yán)謹(jǐn)認(rèn)真的態(tài)度,防止類似于錯(cuò)誤二和錯(cuò)誤三的情況發(fā)生。還有一個(gè)很奇怪的現(xiàn)象就是連接是顯示的是0個(gè)錯(cuò)誤,但是檢測(cè)卻出現(xiàn)了一個(gè)圖一錯(cuò)誤,但是卻可以運(yùn)行,比如圖一所示:ID:D$bugC-.exe_回眄ClassV.|lFil兇iEw|血C+.exe-1error(s),0uarning(s)MicrosoftVisualC+n家文i4已過(guò)翊存茁,DebugC+,exe要建立

15、立冊(cè)嗎?否(N)朝肖圖二這個(gè)問(wèn)題經(jīng)過(guò)仔細(xì)研究后,發(fā)現(xiàn)在在圖二中如果選擇的是:“是”的話,則運(yùn)行不了,如果選擇“否”就可以正常運(yùn)行,并出現(xiàn)以上情況,出現(xiàn)以上情況的原因是這個(gè)文件夾是我很早以前建立的,做這個(gè)實(shí)驗(yàn)的時(shí)候我并沒(méi)有重新建立文件夾,而是利用了以前做實(shí)驗(yàn)時(shí),建好的文件,直接修改了文件里面的程序,直接進(jìn)行調(diào)試、檢測(cè)以及運(yùn)行,只要重新建立文件,就可以解決以上問(wèn)題了,重新建立文件夾后,運(yùn)行情況如圖三Configuration:100312087-Win32DebugLinking.100312Q87.exe-0error(5),0uiarning(s)組建L謂試在文件1中查找在文件2中查找結(jié)果、S

16、QLDebugging/圖三2.程序運(yùn)行結(jié)果分析(多組數(shù)據(jù)測(cè)試)運(yùn)行中的第一種情況如圖四:圖四當(dāng)輸入的維數(shù)為0時(shí),顯示的文字為:逆矩陣為空,兩矩陣相乘結(jié)果也為空,這是如下程序的運(yùn)行結(jié)果matrix:matrix()/將矩陣階數(shù)初始化為0,并將兩個(gè)指針指向NULL。row=0;in_buffer二NULL;out_buffer二NULL;matrix:matrix()/如果指針依然指向內(nèi)存,則將指針指向的內(nèi)存釋放掉,并將指針指向NULLif(in_buffer)deletein_buffer;in_buffer二NULL;if(out_buffer)deleteout_buffer;out_bu

17、ffer二NULL;運(yùn)行中的第二種情況:此矩陣沒(méi)有逆矩陣,是因?yàn)樵摼仃嚨闹炔坏扔谠摼仃嚨木S數(shù)2,設(shè)該矩陣用A表示,也就是該矩陣的lAl=0,這是如下代碼中的結(jié)果,在矩陣中,矩陣的秩小于改矩陣的維數(shù),該矩陣是沒(méi)有逆矩陣的,這有矩陣逆矩陣的定義就知道了。代碼如下:for(k=0;krow;k+)doublemax=0;/全選主元/尋找最大元素for(i=k;irow;i+)for(j=k;jmax)max=*(out_buffer+i*row+j);isk=i;jsk=j;/如果最大值為0,則不存在逆矩陣,要求用戶重新輸入if(0=max)cout該矩陣不存在逆矩陣,請(qǐng)重新輸入endl;retur

18、n1;運(yùn)行中的第三種情況:IrH:100312087yl00312a87SDebug1003120S7.exe青輸入9個(gè)數(shù)據(jù)123154645逆矩陣為:-0.298323-0.06451610.225806-0.6129030.4193550.03225810.83871-0.258065-0.0967742兩矩陣相乘結(jié)果為:100010HB1Pressanykeytocontinue由程序設(shè)定以及逆矩陣的性質(zhì)可知,以上輸入的矩陣是符合要求的,故輸入后可以得到逆矩陣,經(jīng)過(guò)多次試驗(yàn)可知,只要維數(shù)大于1小于256,且符合矩陣逆矩陣的定義,根據(jù)以上程序都是可以執(zhí)行的。七、總結(jié)與體會(huì)我只能說(shuō)C+這門課

19、真的是太高深莫測(cè)了,你還能再?gòu)?fù)雜一點(diǎn)嗎?可是更讓我覺(jué)得意外的是以前一直以為學(xué)C+知識(shí)為了開發(fā)軟件應(yīng)用軟件什么的,沒(méi)想到連我最喜歡的數(shù)學(xué)都可以這樣來(lái)解決?。∥疑险n其實(shí)基本是還是蠻認(rèn)真的,但是拿到題目卻是愕然的呀!原以為是很簡(jiǎn)單的東西沒(méi)想到細(xì)究起來(lái)其實(shí)這么復(fù)雜,所有我深深的明白沒(méi)有淺顯的知識(shí),只有淺顯的理解啊。知識(shí)還是要一步一個(gè)腳印的扎穩(wěn)啊,不能半知半解,要不然其實(shí)很不懂沒(méi)什么區(qū)別!經(jīng)過(guò)這次試驗(yàn)我深深明白,上課聽老師講講是遠(yuǎn)遠(yuǎn)不夠的,一天24個(gè)小時(shí),我們有8個(gè)小時(shí)在睡覺(jué),8個(gè)小時(shí)在上課,那么決定我們生命長(zhǎng)度以及寬度的就是那課余的8小時(shí),所以,課后的時(shí)間我們應(yīng)該好好利用,用心的學(xué)習(xí),達(dá)到不懂到懂,懂

20、到精的境界!不要小看任何事,任何簡(jiǎn)單的背后都會(huì)有不簡(jiǎn)單。在學(xué)習(xí)C+以前,我認(rèn)為C+只是在C語(yǔ)言的基礎(chǔ)上的一種延伸,認(rèn)為只要學(xué)過(guò)C語(yǔ)言,就可以用C語(yǔ)言的那種設(shè)計(jì)思想來(lái)學(xué)習(xí)C+、設(shè)計(jì)C+程序。正是由于抱了這種錯(cuò)誤的思想,使我在一開始學(xué)習(xí)C+的時(shí)候遇到了很大的困難,我沒(méi)有辦法體會(huì)面向?qū)ο蟮脑O(shè)計(jì)思想,我在學(xué)習(xí)這門課的時(shí)候老是想著實(shí)現(xiàn)這個(gè)函數(shù)功能的具體過(guò)程,而沒(méi)太注意對(duì)象分類的重要性。隨著課程學(xué)習(xí)的深入,我感覺(jué)到了利用類和對(duì)象、繼承、封裝等一系列知識(shí)可以把我們程序中很多繁雜、重復(fù)的部分省略掉,還可以解決一些利用面向過(guò)程的設(shè)計(jì)思想無(wú)法解決的問(wèn)題,我自己也試著編寫一些小的C+程序,當(dāng)然在這個(gè)過(guò)程中遇到了很多

21、困難,其中調(diào)試帶來(lái)的困難讓我無(wú)法忘記,在調(diào)試程序的同時(shí),我也總結(jié)出來(lái)了一些調(diào)試的小技巧,讓我在C語(yǔ)言課程設(shè)計(jì)中也受用匪淺。在學(xué)習(xí)這門課的過(guò)程中,我感受到了自己親自動(dòng)手編程序、調(diào)程序的重要性,我們要熟悉C+的語(yǔ)法、體會(huì)調(diào)試的思想,最好的一個(gè)手段就是自己動(dòng)手編程、調(diào)試,這會(huì)比我們一味的看書效果好得多。另外,我還感覺(jué)到要編一個(gè)程序出來(lái)。嚴(yán)謹(jǐn)認(rèn)真的態(tài)度是非常重要的,沒(méi)有一個(gè)嚴(yán)謹(jǐn)認(rèn)真的態(tài)度,是做不成什么事情的,很多時(shí)候,我們出現(xiàn)的問(wèn)題不是我們不懂,而是我們的粗心大意導(dǎo)致了我們的錯(cuò)誤連篇,出現(xiàn)錯(cuò)誤的時(shí)候我們就必須檢查和糾正,這也是非常費(fèi)時(shí)費(fèi)力的,所以無(wú)論是在工作中還是在學(xué)習(xí)中,我們都必須抱著認(rèn)真嚴(yán)謹(jǐn)?shù)膽B(tài)度來(lái)面對(duì)任何事,只有這樣才可以事半功倍。同時(shí)我也認(rèn)識(shí)到同學(xué)之間的相互幫助以及同學(xué)之間的相互促進(jìn)使非常重要的,在為這個(gè)論文設(shè)計(jì)奮戰(zhàn)了幾天幾夜之后,在查找程序幾處提示錯(cuò)誤的時(shí)候,自己怎么都找不到錯(cuò)誤在哪里,于是就向同學(xué)尋求幫助,他們一下子就找到了我的錯(cuò)誤,我想這就是當(dāng)局者迷旁觀者清吧,我們被自己的思想禁錮了,在生活也是如此,多聽別人的意見、多與別人交流,會(huì)更有益于我們的成長(zhǎng)。很高興能夠了解到C+的神奇魅力和面向?qū)ο蟪绦蛟O(shè)計(jì)的獨(dú)特思想,它為我今后的程序設(shè)計(jì)奠定了基礎(chǔ)。感謝老師對(duì)我們的悉心教授!課程設(shè)計(jì)成績(jī)?cè)u(píng)定表、等級(jí)成績(jī)組成

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論