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

下載本文檔

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

文檔簡介

1、|詡南商母吃厚德博藝皿占皿UNIVERSITYOFCOMMERCE精明目強課程設(shè)計報告實驗內(nèi)容:n 階方陣求逆的實現(xiàn)相關(guān)課程:信息系統(tǒng)開發(fā)語言(一)學期:2011-2012 學年第 2 學期學時學分:68 學時 4 學分專業(yè)班級:信管 1022 班學號:100312087姓名:管小芬指導老師:陳榮元提交日期:2012 年 06 月 21 日HUNAN信息系統(tǒng)開發(fā)語言(一)課程設(shè)計n階方陣求逆的實現(xiàn)一、課程設(shè)計目的1、了解什么是矩陣及逆矩陣。2、通過VC+6.0編寫一個實現(xiàn)求矩陣逆矩陣的程序。3、鞏固和加深學生對算法課程基本知識的理解和掌握。4、培養(yǎng)利用算法知識解決實際問題的能力。5、掌握利用程

2、序設(shè)計語言進行算法程序的開發(fā)、調(diào)試、測試.6、掌握書寫算法設(shè)計說明文檔的能力。7、提高綜合運用算法、程序設(shè)計語言、數(shù)據(jù)結(jié)構(gòu)知識的能力。二、問題描述給出任意一個維數(shù)大于1小于256的矩陣,通過程序求出其逆矩陣300301302如 A=ai0aiia12,存在矩陣B,使得矩陣A與B的乘積為單位矩陣,則稱矩a20321a22_陣B為矩陣A的逆矩陣。三、問題分析根據(jù)矩陣與逆矩陣的定義,即矩陣A與矩陣B相乘等于單位矩陣的思路,編輯程序。為使問題更加簡單明了化,現(xiàn)舉除一個具體例子,便于理解,我們在求解數(shù)學題目中,經(jīng)常會遇到這一類的題目:如求方陣A的逆矩陣a00a01a02A=ai0aiiai220a2ia

3、22_拿到這個題,我們首先應(yīng)該是理解什么叫矩陣及逆矩陣,我們根據(jù)定義可知,一個矩陣如果存在逆矩陣,那么這個矩陣的秩一定不會小于該矩陣的維數(shù),拿到一個題,要求一個逆矩陣的方法是很多的,比較常用的還是先把矩陣化為上三角或者下三角矩陣,判斷矩陣是否存在逆矩陣,然后,然后根據(jù)矩陣與逆矩陣之積等于單位矩陣從而得出逆矩陣,這是比較一般的思路,我們一下設(shè)計基本上也是以此為基礎(chǔ)的。四、算法分析、設(shè)計與描述1 .算法分析和設(shè)計對于矩陣求逆,逆矩陣的定義是:對于n階方陣A,若存在矩陣B,使得AB=BA=E則稱A為可逆矩陣,簡稱A可逆,并稱B為A的逆矩陣。A存在逆矩陣的充要條件是|A|*0。若用定義的方法求解,計算

4、量大,當矩陣的階數(shù)很大時很浪費時間,為了節(jié)省時間,通過查閱資料和上網(wǎng)搜索,決定采用高斯-約旦發(fā)來進行方陣的求逆操作。對于矩陣的乘法,利用矩陣乘法定義即可實現(xiàn),矩陣的乘法的定義是:若A是一個m*n階矩陣,B是一個n*p階矩陣,則AB=d一個m*p階矩陣,而C中的每一個(i,j)元都等于A的第i行中的各元和B的第j列的各對應(yīng)元之乘積的和。只要按照該定義就可以求出兩個矩陣的乘積。2 .算法描述a.高斯-約旦法求解逆矩陣的算法描述如下:首先,對于k從0到n-1作如下幾步:1)從第k行、第k列開始的右下角子陣中選取絕對值最大的元素,并記住次元素所在的行號和列號,在通過行交換和列交換將它交換到主元素位置上

5、。這一步稱為全選主元。2) m(k,k)=1/m(k,k)3) m(k,j)=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ù)在全選主元過程中所記錄的行、列交換的信息進行恢復,恢復的原則如下:在全選主元過程中,先交換的行(列)后進行恢復;原來的行(列)交換用列(行)交換來恢復。2.算法描述(可插入流程圖)1.程序設(shè)計的基本思路該程序設(shè)計了一個類,用于存儲用戶數(shù)據(jù)的方陣階數(shù)、用戶輸入的方陣數(shù)據(jù)

6、以及方陣的逆矩陣數(shù)據(jù)。因為用戶需要計算的方陣的階數(shù)不定,因此采用了double型指針動態(tài)開辟內(nèi)存的方式來存儲用戶輸入的方陣數(shù)據(jù)和逆矩陣數(shù)據(jù)。同時,該類定義了等方法,用來實現(xiàn)最成員變量的初始化,方陣求逆,矩陣相乘的操作。程序運行開始,首先調(diào)用類的方法,在該方法中首先要求用戶輸入矩陣的階數(shù),并根據(jù)該階數(shù)開辟內(nèi)存空間,接著要求用戶輸入方陣的數(shù)據(jù),輸入完畢后,程序調(diào)用類的方法用以實現(xiàn)方陣的求逆,在求逆過程中,首先判斷該矩陣是否存在逆矩陣,若存在則進行求逆,若不存在則給出提示并要求用戶重新輸入。求逆完成后存儲結(jié)果并顯示,同時程序調(diào)用類的方法對兩個矩陣進行相乘操作,用來驗證求逆結(jié)果是否正確。該程序設(shè)計的主

7、要難點和重點在于方陣的逆矩陣求解方法, 通過復習矩陣的相關(guān)知識和查閱資料,決定采用高斯-約旦法來實現(xiàn)對方陣的求逆,為了計算的方便,數(shù)據(jù)也是采用一維數(shù)據(jù)而不是二維數(shù)據(jù)才存儲。矩陣類matrix的uml圖如下:martixij- rowiintc- in_bufferdouble*- outbufferdouble*+matrixf)+*martix()J+set_data():voiij十swap(a:double&,b:double&)oidj+lnverseMatrix():intj+Cheng()oicij2.程序代碼及說明#include#includeusingname

8、spacestd;double*B;/保存矩陣A與E的組合矩陣intN=0;voidInit()/初始化B但是還沒有輸入A的值(cout現(xiàn)在請該矩陣輸入的維數(shù)NN;if(N1)cout檢查矩陣的維數(shù)是否正確!endl;while(N1);B=newdouble*N+1;/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:0;voidAinit()/輸入原矩陣每一行的每一個數(shù)的值cout請輸入原矩陣每一行的每一個數(shù)的值:endl;inti,j;fo

9、r(i=1;i=N;+i)cout輸入第i行各數(shù)的的值:endl;for(j=1;jBij;)cout該矩陣為:endl;for(i=1;i=N;+i)(for(j=1;j=N;+j)coutsetw(9)setprecision(6)Bij;coutendl;)intTo1(inti)/在進行矩陣變成上三角是將第i行第i列的數(shù)變成1/并且返回是否變換成功/0-失敗,也就是說改矩陣的秩不是N,并不能求出逆矩陣/1-成功,返回后進行下一步程序(intj;intii=i;doubleij;if(Biiii!=0)ij=Biiii;else(for(j=i+1;jN)return0;/失敗for(;

10、i=2*N;+i)/將第j行的加到第ii行Biii+=Bji;ij=Biiii;)for(i=ii;i=2*N;+i)/將第ii行第ii列的變?yōu)?Biii/=ij;return1;/成功返回)voidTo0(inti,intj)/利用第i行第i列的數(shù)將第j行到第i行的第i列變?yōu)?if(i=j)return;intii=i,jj=j;doubleij;intn=(ij)?-1:1;/在下面是j+=n/n用來檢驗是求上三角,還是下三角/-1ij也就是將上三角變?yōu)?for(;j!=i;j+=n)for(ii=i,ij=Bji;ii=2*N;+ii)B皿ii-=ij*Biii;)voidPrint()

11、inti,j;intn=N*2;coutendl該矩陣的逆矩陣為endl;for(i=1;i=N;i+)(for(j=N+1;j=n;+j)coutsetw(9)setprecision(6)Bij;coutendl;/intTo1(inti)/在進行矩陣變成上三角是將第i行第i列的數(shù)變成1/voidTo0(inti,intj)/利用第i行第i列的數(shù)將第j行到第i行的第i列變?yōu)?voidmain()(Init();/初始化B但是還沒有輸入A的值A(chǔ)init();/輸入原矩陣每一行的每一個數(shù)的值inti;intflag=1;for(i=1;iN;+i)(if(To1(i)To0(i,N);else

12、(cout改矩陣的秩小于N,沒有逆矩陣=1&flag=1;-i)(if(To1(i)To0(i,0);else(cout改矩陣的秩小于N,沒有逆矩陣i;)六、程序運行、調(diào)試和結(jié)果分析1.程序運行中出現(xiàn)的問題及調(diào)試手段(包括異常處理)在運行過程中是出現(xiàn)過很多問題的,錯誤也是非常之多的,就是各種不能運行,先就針對錯誤比較突出的一些問題進行分析,錯誤一的提示:fatalerrorC1083:Cannotopenincludefile:stdafx.h:Nosuchfileordirectory執(zhí)行cl.exe時出錯.根據(jù)英文提示,才發(fā)現(xiàn)原來在設(shè)置代碼時我按照以前編再次運行時,該錯誤就已經(jīng)解決

13、。輯程序的經(jīng)驗預定義了一個頭文件stdafx.h,當我把頭文件stdafx.h”省去錯誤二的提示:warningC4508:main:functionshouldreturnavalue;voidreturntypeassumed對于這個問題,是不應(yīng)該犯的錯誤,這個錯誤的錯誤源在于編輯代碼的最后一個階段,并沒有注意到int定義的函數(shù)是有返回值的而void定義的函數(shù)才沒有返回值,于是我將int改成了void,此處錯誤就解決了。具體錯誤代碼如下:intmain()/定義一個矩陣類matrixm;/調(diào)用該類的set_data方法,來對其內(nèi)部成員變量賦值m.set_data();/對輸入的矩陣求逆,如

14、果求逆失敗,說明輸入的矩陣不存在逆矩陣,則要求用戶重新輸入while(m.InverseMatrix()=1)m.set_data();/求逆成功后,計算兩個矩陣的乘積是否為單位矩陣,用以驗證求解的正確性m.Cheng();錯誤三的提示:errorC2143:syntaxerror:missing;before類似于錯誤三的錯誤是非常多的, 這在編輯程序時是最容易出錯, 也是最容易被遺忘的。在編輯程序時,我們必須要有嚴謹認真的態(tài)度,防止類似于錯誤二和錯誤三的情況發(fā)生。還有一個很奇怪的現(xiàn)象就是連接是顯示的是0個錯誤,但是檢測卻出現(xiàn)了一個錯誤,但是卻可以運行,比如圖一所示:ID:DebugC4-.

15、exe1現(xiàn)在請該矩陣輸入的維數(shù)N3幡譬右勰一個數(shù)123輸人第2行各數(shù)的的值:2 21入第3行各數(shù)的的值:3 43攤陣為二123221343上矩陣的逆矩陣為43-2-1.5-32.511-1FII匕石as5vTiFilWic,C+,exe-1error(s),0warning)圖一MicrosoftVisualC+一個或更多文件已過時或祐在.,DebugC+f.exe要建立它相舊?要建立它相舊?否時既肖圖二這個問題經(jīng)過仔細研究后,發(fā)現(xiàn)在在圖二中如果選擇的是:“是”的話,則運行不了,如果選擇“否”就可以正常運行,并出現(xiàn)以上情況,出現(xiàn)以上情況的原因是這個文件夾是我很早以前建立的,做這個實驗的時候我并

16、沒有重新建立文件夾,而是利用了以前做實驗時,建好的文件,直接修改了文件里面的程序,直接進行調(diào)試、檢測以及運行,只要重新建立文件,就可以解決以上問題了,重新建立文件夾后,運行情況如圖三I*H:U0( (mnS7m網(wǎng)0031208自閑Debug口00m2帥舒*睛輸入方陣那數(shù)請輸入4個數(shù)捱;ClassV.JlFilcVicwf1Configuration:1BQ312flfi7-Jin32DebugLinking188312687.exe-0error(s),0narning(s)hn組建組建k k調(diào)試、調(diào)試、在文件在文件i中查找中查找、政件沖鄴政件沖鄴、結(jié)果結(jié)果逐口施科逐口施科gj圖三2.程序運行

17、結(jié)果分析(多組數(shù)據(jù)測試)運行中的第一種情況如圖四:圖四當輸入的維數(shù)為0時,顯示的文字為:逆矩陣為空,兩矩陣相乘結(jié)果也為空,這是如下程序的運行結(jié)果matrix:matrix()(/將矩陣階數(shù)初始化為0,并將兩個指針指向NULLrow=0;in_buffer=NULL;out_buffer=NULL;matrix:matrix()(/如果指針依然指向內(nèi)存,則將指針指向的內(nèi)存釋放掉,并將指針指向為totomVmVcontinue二mU-U-何為相ananA A陣陣導拿拿矩矩eses在帶兩prprNULLif(in_buffer)(deletein_buffer;in_buffer=NULL;)if(

18、out_buffer)(deleteout_buffer;out_buffer=NULL;)運行中的第二種情況:,12087苣,卜?3X10031208丁管100312087總*卜回請輸入方陣的階數(shù)請輸入請輸入4個數(shù)據(jù)個數(shù)據(jù)100a皤賈贏徽電請卻輸入此矩陣沒有逆矩陣,是因為該矩陣的秩不等于該矩陣的維數(shù)2,設(shè)該矩陣用A表示,也就是該矩陣的lAl=0,這是如下代碼中的結(jié)果,在矩陣中,矩陣的秩小于改矩陣的維數(shù),該矩陣是沒有逆矩陣的,這有矩陣逆矩陣的定義就知道了代碼如下:for(k=0;krow;k+)(doublemax=0;/全選主元/尋找最大元素for(i=k;irow;i+)(for(j=k;

19、jmax)(max=*(out_buffer+i*row+j);isk=i;jsk=j;/如果最大值為0,則不存在逆矩陣,要求用戶重新輸入if(0=max)(cout該矩陣不存在逆矩陣,請重新輸入“endl;return1;運行中的第三種情況:H1003120S7Sd1003120S7dDebug100312087.=|回一-1請輸入方陣的階數(shù)請輸入方陣的階數(shù)蓍輸入蓍輸入9個數(shù)據(jù)個數(shù)據(jù)123154645逆矩陣為:逆矩陣為:-0.290323-0.06451fcl0_22&B060,6129030.4193550,03225810.83871-0.2580G5-0.0967742兩矩陣相

20、乘結(jié)果為:兩矩陣相乘結(jié)果為:100a10aB1Pressmnykeytocontinue由程序設(shè)定以及逆矩陣的性質(zhì)可知,以上輸入的矩陣是符合要求的,故輸入后可以得到逆矩陣,經(jīng)過多次試驗可知,只要維數(shù)大于1小于256,且符合矩陣逆矩陣的定義,根據(jù)以上程序都是可以執(zhí)行的。七、總結(jié)與體會我只能說C+位門課真的是太高深莫測了,你還能再復雜一點嗎?可是更讓我覺得意外的是以前一直以為學C+跌口識為了開發(fā)軟件應(yīng)用軟件什么的,沒想到連我最喜歡的數(shù)學都可以這樣來解決?。∥疑险n其實基本是還是蠻認真的,但是拿到題目卻是愕然的呀!原以為是很簡單的東西沒想到細究起來其實這么復雜,所有我深深的明白沒有淺顯的知識,只有淺顯

21、的理解啊。知識還是要一步一個腳印的扎穩(wěn)啊,不能半知半解,要不然其實很不懂沒什么區(qū)別!經(jīng)過這次試驗我深深明白,上課聽老師講講是遠遠不夠的,一天24個小時,我們有8個小時在睡覺,8個小時在上課,那么決定我們生命長度以及寬度的就是那課余的8小時,所以,課后的時間我們應(yīng)該好好利用,用心的學習,達到不懂到懂,懂到精的境界!不要小看任何事,任何簡單的背后都會有不簡單。在學習C+前,我認為C+哄是在C語言的基礎(chǔ)上的一種延伸,認為只要學過C語言,就可以用C語言的那種設(shè)計思想來學習C+卡設(shè)計C+取序。正是由于抱了這種錯誤的思想,使我在一開始學習C+勺時候遇到了很大的困難,我沒有辦法體會面向?qū)ο蟮脑O(shè)計思想,我在學

22、習這門課的時候老是想著實現(xiàn)這個函數(shù)功能的具體過程,而沒太注意對象分類的重要性。隨著課程學習的深入,我感覺到了利用類和對象、繼承、封裝等一系列知識可以把我們程序中很多繁雜、重復的部分省略掉,還可以解決一些利用面向過程的設(shè)計思想無法解決的問題,我自己也試著編寫一些小的C+E序,當然在這個過程中遇到了很多困難,其中調(diào)試帶來的困難讓我無法忘記,在調(diào)試程序的同時,我也總結(jié)出來了一些調(diào)試的小技巧,讓我在C語言課程設(shè)計中也受用匪淺。在學習這門課的過程中,我感受到了自己親自動手編程序、調(diào)程序的重要性,我們要熟悉C+勺語法、體會調(diào)試的思想,最好的一個手段就是自己動手編程、調(diào)試,這會比我們一味的看書效果好得多。另

23、外,我還感覺到要編一個程序出來。嚴謹認真的態(tài)度是非常重要的,沒有一個嚴謹認真的態(tài)度,是做不成什么事情的,很多時候,我們出現(xiàn)的問題不是我們不懂,而是我們的粗心大意導致了我們的錯誤連篇, 出現(xiàn)錯誤的時候我們就必須檢查和糾正, 這也是非常費時費力的,所以無論是在工作中還是在學習中,我們都必須抱著認真嚴謹?shù)膽B(tài)度來面對任何事,只有這樣才可以事半功倍。 同時我也認識到同學之間的相互幫助以及同學之間的相互促進使非常重要的,在為這個論文設(shè)計奮戰(zhàn)了幾天幾夜之后,在查找程序幾處提示錯誤的時候,自己怎么都找不到錯誤在哪里,于是就向同學尋求幫助,他們一下子就找到了我的錯誤,我想這就是當局者迷旁觀者清吧,我們被自己的思想禁錮了,在生活也是如此,多聽別人的意見、多與別人交流,會更有益于我們的成長。很高興能夠了解到C+勺神奇魅力和面向?qū)ο蟪绦蛟O(shè)計的獨特思想,它為我今后的程序設(shè)計奠定了基礎(chǔ)。感謝老師對我們的悉心教授!課程設(shè)計成績評定表等 級 成績組成優(yōu)秀良好中等及格不及格報 告 文檔1 .文檔很規(guī)范。2 .排版很清晰。3 .內(nèi)容很全面。4 .設(shè)計很合理。1 .文檔規(guī)范。2 .排版清晰。3 .內(nèi)容全面。4 .設(shè)計合理。1 .文檔

溫馨提示

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

評論

0/150

提交評論