版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計任務(wù)書</b></p><p> 測控技術(shù)與儀器系107773班 學(xué)號7777 姓名 </p><p> 課題名稱: 求線性代數(shù)方程組的解 </p><p><b> 課題要求:&
2、lt;/b></p><p> 本課程設(shè)計在訓(xùn)練和提高學(xué)生綜合運用vb、c等語言進行編程的能力的同時,可使學(xué)生對求解線性代數(shù)方程組的消去法和迭代法有更為深入的理解。本課題的基本內(nèi)容有:</p><p> 1、設(shè)置一個提示語句提示輸入方程的個數(shù);</p><p> 2、設(shè)置一個提示語句提示輸入未知數(shù)的個數(shù);</p><p> 3、
3、準確、快速的計算出所輸入方程組的解,并顯示出來。</p><p><b> 課題進程:</b></p><p> 迭代法與高斯消去法解線性方程組的算法分析 2天</p><p> 分別用vc、vb編程實現(xiàn)線性代數(shù)方程組的求解 5天</p><p> 軟件調(diào)試和測試,提出改進方案,
4、并進行對比分析 2天</p><p> 撰寫課程設(shè)計報告 4天</p><p> 指導(dǎo)教師: </p><p><b> 摘要</b></p><p> 許多源于工程技術(shù)方面的數(shù)學(xué)問題,都可以歸結(jié)為解求線性方程組。因此在各
5、種數(shù)據(jù)處理中,線性方程組的求解是最常見的問題之一。</p><p> 針對求解線性代數(shù)方程組,本文提出了兩種解法:迭代法和高斯消去法。迭代法程序設(shè)計簡單,可以實現(xiàn)高精度,本文用vc編程實現(xiàn)。高斯消去法數(shù)值較穩(wěn)定,克服了迭代數(shù)據(jù)易溢出的缺點,本文用vb編程實現(xiàn)。相比vc,vb界面更美觀,可視性和實用性好,更適合于此款計算軟件。</p><p> 本文中的程序能快速求解出10 維以下線性代
6、數(shù)代數(shù)方程組的解,在迭代法vc程序中提示精度且顯示迭代過程,在vb高斯消去法軟件根據(jù)線性方程組的維數(shù)顯示輸入框,并依次顯示計算結(jié)果。可以重復(fù)計算。兩款程序都能保證一定的高精度。這將為計算者帶來很大的方便。</p><p> 關(guān)鍵詞:高斯消去法,迭代法,線性方程,動態(tài)數(shù)組</p><p><b> 目錄</b></p><p> 一.設(shè)計要
7、求 …………………………………………………………………4</p><p> 二.設(shè)計的目的意義 …………………………………………………………4</p><p> 三.設(shè)計思想 …………………………………………………………………5</p><p> 3.1確定方法 ………………………………………………………………5</p><p&g
8、t; 3.2數(shù)據(jù)分析 ………………………………………………………………6</p><p> 3.3算法分析 ………………………………………………………………6</p><p> 四.軟件的編制和調(diào)試 ………………………………………………………8</p><p> 4.1用迭代法在VC環(huán)境下開發(fā) …………………………………………8</p&
9、gt;<p> 4.1.1VC環(huán)境介紹 ………………………………………………………8</p><p> 4.1.2程序流程圖 ………………………………………………………10</p><p> 4.1.3程序主代碼 ………………………………………………………10</p><p> 4.1.4程序運行圖 …………………………………
10、……………………13</p><p> 4.1.5程序說明 …………………………………………………………14</p><p> 4.1.6程序改進方向 ………………………………………………………14</p><p> 4.2用高斯消去法在VB環(huán)境下開發(fā) ………………………………………15</p><p> 4.2.1VB環(huán)境介紹
11、 ………………………………………………………15</p><p> 4.2.2程序流程圖 ………………………………………………………18</p><p> 4.2.3程序主代碼 ………………………………………………………19</p><p> 4.2.4程序運行圖 ………………………………………………………23</p><p
12、> 4.2.5程序說明 …………………………………………………………24</p><p> 4.2.6程序改進方向 ………………………………………………………24</p><p> 總結(jié) ………………………………………………………………………25</p><p> 致謝 ………………………………………………………………………25</p>
13、<p> 七.參考文獻 …………………………………………………………………26</p><p> 附錄 …………………………………………………………………………26</p><p><b> 一.設(shè)計要求</b></p><p> 要求設(shè)計一個簡便的科學(xué)計算軟件可以實現(xiàn)線性代數(shù)方程組的求解,軟件功能要求如下:</p
14、><p> 1、設(shè)置一個提示語句提示輸入方程的個數(shù);</p><p> 2、設(shè)置一個提示語句提示輸入未知數(shù)的個數(shù);</p><p> 3、準確、快速的計算出所輸入方程組的解,并顯示出來。</p><p><b> 二.設(shè)計的目的意義</b></p><p> 許多源于工程技術(shù)方面的數(shù)學(xué)問題,
15、都可以歸結(jié)為解求線性</p><p> 方程組。因此在各種數(shù)據(jù)處理中,線性方程組的求解是最常見的問題之一。因此設(shè)計一種實用的解線性方程組軟件可以給計算帶來很大的便利,提高人們的工作效率。</p><p><b> 三.設(shè)計思想</b></p><p><b> 確定方法</b></p><p>
16、; 可以使用高斯消去法和迭代法。</p><p> 迭代法不僅具有程序設(shè)計簡單,適于自動計算,而且較直接法更少的計算量就可獲得滿意的解。因此,迭代法亦是求解線性方程組,尤其是求解具有大型稀疏矩陣的線性方程組的重要方法之一。</p><p> Gauss 消去法是解線性方程組的一種直接方法,有時也稱為精確法,這種算法只包含有限四次運算,并且在每一步運算過程都不會發(fā)生舍入誤差的假設(shè)下,計
17、算的結(jié)果就是方程組的精確解。但實際計算中不可避免舍入誤差的存在和影響,所以這種方法只能求得線性方程組的近似解。</p><p><b> 3.2編程思路</b></p><p> 線性方程組的一般形式是a*x=b,編寫這種程序最重要的是算法,正確的編寫求解函數(shù)高斯消元法首先把矩陣化為上三角陣,根據(jù)上三角陣的情況判斷解的情況,如果有唯一解則輸出結(jié)果。</p&g
18、t;<p> 接下來是設(shè)計輸入對話框,由于矩陣的維數(shù)不固定,要根據(jù)需要來顯示。根據(jù)未知數(shù)的個數(shù)控制文本框顯示的數(shù)目、按鈕位置和窗口的大小??梢韵葎?chuàng)建兩個text數(shù)組,一個用來輸入a,一個用來輸入b,另外還可以用兩個標簽來標記他們的位置,這當中可以用空格來控制。</p><p><b> 3.3算法分析</b></p><p> 3.3.1高斯消去法
19、</p><p> 高斯消去法的基本思想是:對線性代數(shù)方程組所對應(yīng)的增廣矩陣(A|b)進行一系列“把某一行的非零常數(shù)倍加到另一行上”的初等變換,使得(A|b)中A的對角線一下的元素全變?yōu)?,從而使原方程組等價的轉(zhuǎn)化為容易求解的上三角形線性代數(shù)方程組,再通過回代得到上三角形線性代數(shù)方程組的解,即可求得原方程組的解。</p><p> 設(shè)線性方程組的增廣矩陣為: = </p>
20、<p> 首先,在第一列中選取絕對值最大的元素 作為第一列的主元,即 ,然后交換第一行與第i行,經(jīng)一次消元計算得: =(A B)。</p><p> 重復(fù)上述過程,設(shè)已完成第k-1步的選主元素,交換兩行及消元過程后(A B)已約化為 : </p><p> 第k步選主元素,在 右下角方陣的第一列內(nèi)選取絕對值最大的元素 作為這一列的主元,即 = ,然后交
21、換 的第i行與第k行,再進行消元計算。如此重復(fù),直到最后將原線性代數(shù)方程組化為 :</p><p><b> =</b></p><p> 回代求解得到 </p><p> 列主元消去法除了每步需要按列選出主元,然后進行對換外,其消去過程與高斯順序消去法是相同的。</p><p><b> 3.
22、3.2迭代法</b></p><p> 迭代法的基本思想:是將線性方程組轉(zhuǎn)化為便于迭代的等價方程組,對任選一組初始值 (i=1,2…n),按某種計算規(guī)則,不斷地對所得到的值進行修正,最終獲得滿足精度要求的方程組的近似解。</p><p> 對于線性方程組Ax=b。其中,A為非奇異矩陣。</p><p> 將A分裂為A=M-N,其中,M為非奇異矩陣,
23、且要求線性代數(shù)方程組Mx=d容易求解,一般選擇為A的某一部分元素構(gòu)成的矩陣,稱M為A的分裂矩陣。于是,求解Ax=b轉(zhuǎn)化為求解Mx=Nx+b,由此可構(gòu)造一個迭代法:</p><p> x(0)(初始向量), x(k+1)=Bx(k)+f,(k=0,1,2…) </p><p> 其中,f=b/M,B=I-A/M為迭代法的迭代矩陣。選取M為A的對角元素組成的矩陣,即選取M=D,可得到解Ax
24、=b的雅克比迭代法:</p><p> x(0)(初始向量),x(k+1)=Bx(k)+f (k=0,1,2…) </p><p> BJ為求解Ax=b的雅克比迭代法的迭代矩陣。</p><p> 解雅克比迭代法的計算公式為:</p><p> ?。╧=0,1,2,……:i=1,2,3,……..n)</p><
25、p> 雅克比方法是求對稱矩陣的全部特征值以及相應(yīng)的特征向量的一種方法,,它是基于以下兩個結(jié)論:</p><p> 1)任何實對稱矩陣A可以通過正交相似變換成對角型,即存在正交矩陣Q使得 AQ=diag( ) 其中 i(i=1,2,…,n)是A的特征值,Q中各列為相應(yīng)的特征向量。</p><p> 2)在正交相似變換下,矩陣元素的平方和不變。即設(shè),Q為交矩陣,記B= AQ=,則
26、</p><p> 雅克比方法的基本思想:是通過一次正交變換,將A中的一對非0的非對角線化成0,并且使得非對角元素的平方和減小。反復(fù)進行上述過程,使變換后的矩陣的非對角元素的平方和趨于0,從而使該矩陣近似為對角矩陣,得到全部特征值和特征向量。</p><p> 四.軟件的編制和調(diào)試</p><p> 迭代法解線性方程組在VC6.0環(huán)境【3】下開發(fā)</p&
27、gt;<p><b> VC6.0環(huán)境介紹</b></p><p> Visual C++ 6.0,簡稱VC或者VC6.0,是微軟推出的一款C++編譯器,將“高級語言”翻譯為“機器語言(低級語言)”的程序。Visual C++是一個功能強大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已
28、成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了 Visual C++.NET(Visual C++7.0),但它的應(yīng)用有很大的局限性,只適用于Windows 2000、Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C++6.0為平臺。</p><p><b> 特色:</b></p><p> Visual C++
29、6.0由Microsoft開發(fā), 它不僅是一個C++ 編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。Microsoft的主力
30、軟件產(chǎn)品。Visual C++是一個功能強大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了Visual C++.NET(Visual C++7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實際中,更多的是以Visual
31、 C++6.0為平臺。</p><p><b> 缺點:</b></p><p> 由于C++是由C語言發(fā)展起來的,也支持C語言的編譯。6.0版本是使用最多的版本,很經(jīng)典。最大的缺點是對于模版的支持比較差。現(xiàn)在最新補丁為SP6,推薦安裝,否則易出現(xiàn)編譯時假死狀態(tài)。僅支持Windows操作系統(tǒng)。目前發(fā)現(xiàn)與windows 7兼容性不好,安裝成功后可能會出現(xiàn)無法打開cp
32、p文件的現(xiàn)象。</p><p> 4.1.2程序流程圖</p><p> 圖4.1.2a 程序流程圖</p><p> 4.1.3迭代法VC核心編碼</p><p> struct Line *Change(struct Line*Lhead,int n){</p><p> struct Line*p1,*
33、p2,*p3,*p;</p><p> struct Row*ptr;</p><p> int i=1,k,j;</p><p> float max,t;</p><p> if(Lhead==NULL){</p><p> printf("鏈表為空!\n");</p>
34、<p><b> exit(1);}</b></p><p><b> p2=Lhead;</b></p><p> while(i<=n){</p><p><b> max=0;</b></p><p><b> k=0;</b&g
35、t;</p><p><b> t=0.0;</b></p><p> ptr=p2->head;</p><p> while(ptr!=NULL){</p><p> if(ptr->R!=n+1){</p><p> t+=fabs(ptr->x);</p&
36、gt;<p> if(max<fabs(ptr->x)){</p><p> max=fabs(ptr->x);</p><p> k=ptr->R;}}</p><p> ptr=ptr->link;}</p><p><b> t=t-max;</b></p
37、><p> if(max<=t){</p><p> printf("系數(shù)矩陣A不具有嚴格對角優(yōu)勢,該程序不能用Gauss-Jacobi迭代法解該方程組!\n");</p><p> return NULL;}</p><p> if(p2->L==k)</p><p> p2=p
38、2->next;</p><p> else if(p2->L>k){</p><p> printf("系數(shù)矩陣A不具有嚴格對角優(yōu)勢,該程序不能用Gauss-Jacobi迭代法解該方程組!\n");</p><p><b> exit(0);}</b></p><p> e
39、lse{p3=Lhead;</p><p> while(p3->L!=k)</p><p> p3=p3->next;</p><p> ptr=p3->head;</p><p> p3->head=p2->head;</p><p> p2->head=ptr;}&
40、lt;/p><p><b> i++;}</b></p><p> return Lhead;}</p><p> void Deal(struct Line *Lhead,float e,int N,int n){</p><p> struct Term*ptr; float Term;</p>
41、<p> struct Line*p1; struct Row*current;</p><p> float m=0,a,b,c=0; int k=0,i=0;</p><p> if(Lhead==NULL)</p><p> {printf("鏈表為空\n");exit(1);}</p><
42、p> ptr=malloc(n*sizeof(Term));</p><p> for(i=0;i<n;i++)</p><p> {(ptr+i)->x=0; (ptr+i)->m=0;}</p><p> printf("迭代過程的數(shù)據(jù)變化表如下:\n");</p><p> pr
43、intf(" K");</p><p><b> 程序運行圖</b></p><p> 圖4.1.4a 程序運行圖</p><p> 圖4.1.4b 程序運行圖</p><p><b> 程序說明</b></p><p> 該程序用于10
44、次以下線性代數(shù)代數(shù)方程的求解,該程序的優(yōu)點是能把每步的迭代結(jié)果輸出(如圖4.1.4),并且保證一定的精確度。運行速度快,算法收斂速度也快。最重要的是,它能實現(xiàn)循環(huán)計算,直到你點擊右上角的紅叉為止,這給計算者帶來了一定的方便,也便于計算者對每次參數(shù)的變化輸出結(jié)果有一定的對比。缺點是界面并不美觀,系數(shù)的輸入并沒有那么的直觀。</p><p><b> 程序改進方向</b></p>
45、<p> 該程序還有很大的缺陷,在正常使用的情況下一般不會出現(xiàn)錯誤,但是當計算者沒有正常輸入或者因馬虎輸錯了字符,該程序可能進入混亂計算界面,這些錯誤主要是因為溢出造成,所以在這方面可以做進一步改善。</p><p> 運用高斯消去法在VB環(huán)境【4】下開發(fā)</p><p><b> VB環(huán)境介紹</b></p><p> v
46、b是Visual Basic的簡稱,是由美國微軟公司于1991年開發(fā)的一種可視化的、面向?qū)ο蠛筒捎檬录?qū)動方式的結(jié)構(gòu)化高級程序設(shè)計語言,可用于開發(fā) Windows 環(huán)境下的各類應(yīng)用程序。它簡單易學(xué)、效率高,且功能強大可以與 Windows 專業(yè)開發(fā)工具SDK相媲美。在Visual Basic環(huán)境下,利用事件驅(qū)動的編程機制、新穎易用的可視化設(shè)計工具,使用Windows內(nèi)部的廣泛應(yīng)用程序接口(API)函數(shù),動態(tài)鏈接庫(DLL)、對象的鏈接與
47、嵌入(OLE)、開放式數(shù)據(jù)連接(ODBC)等技術(shù),可以高效、快速地開發(fā)Windows環(huán)境下功能強大、圖形界面豐富的應(yīng)用軟件系統(tǒng)。</p><p><b> VB編程語言歷史</b></p><p> Visual Basic從1991年誕生以來,現(xiàn)在已經(jīng)20年了。Visual Basic 是微軟的起家產(chǎn)品,微軟當然不忘了這位功臣。隨著每一次微軟技術(shù)的浪潮,Visu
48、al Basic都會隨之獲得新生??梢灶A(yù)見,將來無論微軟又發(fā)明了什么技術(shù)或平臺,Visual Basic一定會首先以新的姿態(tài)登上去的。如果你想緊跟微軟,永遠在最新的技術(shù)上最快速地開發(fā),你就應(yīng)該選擇Visual Basic。</p><p><b> 特點:</b></p><p><b> ?、倜嫦?qū)ο?lt;/b></p><p
49、> VB采用了面向?qū)ο笤O(shè)計思想,它基本思路是把復(fù)雜的設(shè)計問題分解為多個能夠完成獨立功能且相對簡單的對象集合。所謂“對象”就是個可操作實體如窗體、窗體中命令按鈕、標簽、文本框等,面向?qū)ο缶幊叹褪侵赋绦騿T可根據(jù)界面設(shè)計要求直接在界面上設(shè)計出窗口、菜單、按鈕等類型對象并為每個對象設(shè)置屬性。</p><p> 在VB. NET 2002和之后的版本,VB是完全支持面向?qū)ο蟮木幊陶Z言;而對于早期版本(6.0版和之
50、前的版本),只能稱作是基于對象的編程語言,原因是它不支持類的繼承。</p><p><b> ?、谑录?qū)動</b></p><p> 在Windows環(huán)境下是以事件驅(qū)動方式運行每個對象的都能響應(yīng)多個區(qū)別事件,每個事件都能驅(qū)動段代碼事件過程,該代碼決定了對象功能。通常稱這種機制為事件驅(qū)動的編程機制??捎捎脩舨僮饔|發(fā)也可以由系統(tǒng)或應(yīng)用觸發(fā)例如單擊個命令按鈕就觸發(fā)了按鈕C
51、lick(單擊)事件該事件中代碼就會被執(zhí)行,若用戶未進行任何操作(未觸發(fā)事件)則就處于等待狀態(tài)整個應(yīng)用就是由彼此獨立事件過程構(gòu)成。</p><p> ③軟件Software集成式開發(fā)</p><p> VB為編程提供了個集成開發(fā)環(huán)境,在這個環(huán)境中編程者可設(shè)計界面、編寫代碼、調(diào)試直至把應(yīng)用編譯成可在Windows中運行的可執(zhí)行文件,并為它生成安裝VB集成開發(fā)環(huán)境,為編程者提供了很大方便。
52、</p><p><b> ?、芙Y(jié)構(gòu)化設(shè)計語言</b></p><p> VB具有豐富數(shù)據(jù)類型是種符合結(jié)構(gòu)化設(shè)計思想語言而且簡單易學(xué)此外作為種設(shè)計語言VB還有許多獨到的處。</p><p> ⑤強大數(shù)據(jù)庫訪問功能</p><p> VB利用數(shù)據(jù)Control控件可以訪問多種數(shù)據(jù)庫VB 6.O提供ADOControl
53、控件不但可以用最少代碼實現(xiàn)數(shù)據(jù)庫操作和控制也可以取代DataControl控件和RDOControl控件。</p><p> ⑥支持對象鏈接和嵌入技術(shù)</p><p> VB核心是對對象鏈接和嵌入(OLE)技術(shù)支持它是訪問所有對象種思路方法利用OLE技術(shù)能夠開發(fā)集聲音、圖像、動畫、字處理、Web等對象于一體的功能強大的軟件。</p><p><b>
54、?、呔W(wǎng)絡(luò)功能</b></p><p> VB 6.0提供了DltTML(Dynamic}tTML)設(shè)計工具利用這種技術(shù)可以動態(tài)創(chuàng)建和編輯Web頁面使用戶在VB中開發(fā)多功能網(wǎng)絡(luò)應(yīng)用軟件Software。</p><p><b> ⑧多個應(yīng)用向?qū)?lt;/b></p><p> VB提供了多種向?qū)鐟?yīng)用向?qū)?、安裝向?qū)?、?shù)據(jù)對象向?qū)Ш蛿?shù)據(jù)
55、窗體向?qū)ㄟ^它們可以快速地創(chuàng)建區(qū)別類型、區(qū)別功能應(yīng)用。</p><p><b> 程序流程圖</b></p><p> 圖4.2.2 程序流程圖</p><p> 高斯消元法解線性方程組【5】VB核心編碼</p><p> Option Explicit</p><p> Public
56、 num As Integer</p><p> Public a(1 To 10, 1 To 10) As Double</p><p> Public b(1 To 10) As Double</p><p> Public x(1 To 10) As Double</p><p> Sub Guass()</p>
57、<p> Dim d As Double, t As Double, js(1 To 10) As Double</p><p> Dim i, j, k, l, m, n, iss, NN As Integer</p><p> NN = num + 1</p><p><b> l = 1</b></p>&
58、lt;p><b> n = num</b></p><p> For k = 1 To NN - 1</p><p><b> d = 0#</b></p><p> For i = k To NN</p><p> For j = k To NN</p><p&
59、gt; If Abs(a(i, j)) > d Then</p><p> d = Abs(a(i, j))</p><p><b> js(k) = j</b></p><p><b> iss = i</b></p><p><b> End If</b>&
60、lt;/p><p><b> Next j</b></p><p><b> Next i</b></p><p> If d + 1# = 1# Then</p><p><b> l = 0</b></p><p><b> Else
61、</b></p><p> If js(k) <> k Then</p><p> For i = 1 To NN</p><p> t = a(i, k)</p><p> a(i, k) = a(i, js(k))</p><p> a(i, js(k)) = t</p>
62、;<p><b> Next i</b></p><p><b> End If</b></p><p> If iss <> k Then</p><p> For j = 1 To NN</p><p> t = a(k, j)</p><
63、p> a(k, j) = a(iss, j)</p><p> a(iss, j) = t</p><p><b> Next j</b></p><p><b> t = b(k)</b></p><p> b(k) = b(iss)</p><p> b
64、(iss) = t</p><p><b> End If</b></p><p><b> End If</b></p><p> If l = 0 Then</p><p> MsgBox ("guass fail at 1.請正確輸入。")</p>&
65、lt;p><b> Exit Sub</b></p><p><b> End If</b></p><p> For j = k + 1 To NN</p><p> a(j, k) = a(j, k) / a(k, k)</p><p> For i = k + 1 To NN&
66、lt;/p><p> For m = k + 1 To NN</p><p> a(i, m) = a(i, m) - a(i, k) * a(k, m)</p><p><b> Next m</b></p><p> b(i) = b(i) - a(i, k) * b(k)</p><p>
67、; a(i, k) = 0</p><p><b> Next i</b></p><p><b> Next j</b></p><p><b> Next k</b></p><p> If Abs(a(n, n)) = 0 Then</p><
68、;p><b> l = 0</b></p><p> MsgBox ("guass fail at 2")</p><p><b> Exit Sub</b></p><p><b> End If</b></p><p> x(n) = b
69、(n) / a(n, n)</p><p> For i = n - 1 To 1 Step -1</p><p><b> t = 0#</b></p><p> For j = i + 1 To NN</p><p> t = t + a(i, j) * x(j)</p><p>&l
70、t;b> Next j</b></p><p> x(i) = (b(i) - t) / a(i, i)</p><p><b> Next i</b></p><p> js(n) = NN - 1</p><p> For k = NN - 1 To 1 Step -1</p>
71、<p> If js(k) <> k Then</p><p><b> t = x(k)</b></p><p> x(k) = x(js(k))</p><p> x(js(k)) = t</p><p><b> End If</b></p>
72、<p><b> Next k</b></p><p> End Sub </p><p><b> 程序運行圖</b></p><p> 圖4.2.4a 程序運行圖</p><p> 圖4.2.4b 程序運行圖</p><p><b
73、> 程序說明</b></p><p> 該程序可以完成10維以下的線性代數(shù)方程的求解,運算時先輸入未知數(shù)的個數(shù),點擊確定按鈕,界面會生成相應(yīng)數(shù)量的文本框,填入數(shù)組矩陣后點擊計算按鈕,在結(jié)果標簽欄便會順序出現(xiàn)結(jié)果。該程序的優(yōu)點是有直觀的輸入界面(如圖4.2.4),能多次清零再進行計算,計算結(jié)果有一定的精度。并且每個輸入框都有輸入限制,只允許數(shù)字和正負號的輸入,避免程序輸入錯誤而導(dǎo)致運算出錯。缺
74、點是容錯能力差,輸入界面略顯粗糙。不過總的來說,以該程序小巧簡單的界面來說,用來求解高次方程還是給人一種非常舒服的感覺。</p><p><b> 程序改進方向</b></p><p> 該程序比較完美,唯一不足的就是沒法把每步的迭代結(jié)果輸出。接著還有一點小地方可以因個人習慣進行改進,就是當輸入錯誤時,讓程序彈出一個彈窗提示錯在哪里。這些都可以因不同的要求進一步的
75、去改進。</p><p> 4.3兩種方法優(yōu)缺點的比較</p><p> 迭代法具有循環(huán)的計算式,方法簡單,程序?qū)崿F(xiàn)方便,能充分利用系數(shù)的稀疏性,適宜解大型稀疏矩陣方程組。迭代法不存在誤差累積問題。使用迭代法的關(guān)鍵問題是其收斂性與收斂速度,收斂性與迭代初值的選取無關(guān)。雅克比迭代法的收斂條件是: 為精度要求</p><p> 高斯列主元消去法特點是每次在系數(shù)矩
76、陣中依次按列在主對角線以下的元素中,選取絕對值最大的元素作為主元,將它調(diào)至主對角線上,然后用它去消去對角線以下的元素,最后變?yōu)橥獾纳先切畏匠探M求解。如果那一列的所有元素都為0,則說明該方程組解不唯一。</p><p> 高斯列主元消去法計算簡單,工作量大為減少,且計算經(jīng)驗與理論分析均表明,它具有良好的數(shù)值穩(wěn)定性,故列主元法是求解中小型稠密線性方程組的最好方法之一。 </p><p>
77、<b> 五.總結(jié)</b></p><p> 通過本次課程設(shè)計,進一步學(xué)會迭代方法和消去法的數(shù)學(xué)思想,并對程序代碼進行解析與改進,這對于我們以后學(xué)習和研究實際問題具有重要的意義。本課題運用所學(xué)的數(shù)學(xué)專業(yè)知識來研究,有助于我們進一步掌握大學(xué)數(shù)學(xué)方面的知識,特別是迭代方法。通過這個課題的研究,我進一步掌握了迭代方法的思想,以及程序的解析與改進,對于今后類似實際問題的解決具有重要的意義。對V
78、B ,VC開發(fā)環(huán)境也有了主觀上的認識。從中遇到了很多困難,從剛開始的無從下手,到現(xiàn)在油然而生的成就感,這個過程或者說這個經(jīng)歷讓我學(xué)到了很多知識。當我們遇到困難的時候,可以求助老師,也可以求助互聯(lián)網(wǎng),但是退縮是不對的,因為一旦退縮,那么我們將失去一個鍛煉,提升自己能力的機會。雖然這個課程設(shè)計很難,但我通過不斷探索,查找了各種相關(guān)資料,最終在老師的指導(dǎo)下和同學(xué)的幫助下,我成功完成了該課程設(shè)計,也將為我以后的畢業(yè)設(shè)計打下基礎(chǔ)。</p&g
79、t;<p><b> 六.致謝</b></p><p> 這次課程設(shè)計能夠圓滿的結(jié)束,在次,我衷心的感謝我的指導(dǎo)老師程強強,給了我很大的幫助與啟發(fā),提供并介紹給我們一些很有用的資料書,無論是在這次設(shè)計過程 ,還是以后走出社會都很有用。同時感謝本班同學(xué)的建議與幫忙,以及感謝在網(wǎng)上默默幫助我不留名字的那些人。我此次計算機課程設(shè)計的完成與你們每一個人分不開</p>
80、<p><b> 七.參考文獻</b></p><p> [1] 徐士良,常用程序集(C 語言描述)(第三版),清華大學(xué)出版社,2 004-11-1,167頁</p><p> [2]顏慶津,數(shù)值分析( 第3 版) ,北京航天航空大學(xué)出版社,2 006-7-1,153頁</p><p> [3] 該書編委會,Visual
81、 Basic 6.0/.Net 精彩編程150例(Ⅱ),西北工業(yè)大學(xué)出版社,2004-05-01</p><p> [4] 百度VB百科http://baike.baidu.com/view/3063.htm</p><p> [5] 劉彬彬,安劍,V B 從入門到精通( 第2 版 ) ,清華大學(xué)出版社,2010-07-01</p><p><b>
82、; 附錄</b></p><p><b> 1.VC完整程序</b></p><p> #include<stdio.h></p><p> #include<math.h></p><p> #include<stdlib.h></p><p
83、> struct Line{</p><p><b> int L;</b></p><p> struct Row *head;</p><p> struct Line *next;</p><p><b> };</b></p><p> struct
84、 Row{</p><p><b> int R;</b></p><p><b> float x;</b></p><p> struct Row *link; };//建立每次迭代結(jié)果的數(shù)據(jù)存儲單元</p><p> struct Term{</p><p>&
85、lt;b> float x;</b></p><p> float m; }</p><p> struct Line *Create(int Line,int Row)</p><p> {struct Line *Lhead=NULL,*p1=NULL,*p2=NULL;</p><p> struct Row
86、*Rhead=NULL,*ptr1,*ptr2=NULL;</p><p> int i=1,j=1;</p><p><b> float X;</b></p><p> while(i<=Line){</p><p> while(j<=Row+1){</p><p>
87、scanf("%f",&X);</p><p> if(X!=0||j==Row+1){</p><p> ptr1=(struct Row*)malloc(sizeof(Row));</p><p> if(ptr1==NULL){</p><p> printf("內(nèi)存分配錯誤!\n"
88、;);</p><p><b> exit(1);}</b></p><p> ptr1->x=X;</p><p> ptr1->R=j;</p><p> if(ptr2==NULL){</p><p> ptr2=ptr1;</p><p>
89、Rhead=ptr1;}</p><p> else{ptr2->link=ptr1;</p><p> ptr2=ptr1;}</p><p><b> }</b></p><p><b> j++;</b></p><p><b> }</
90、b></p><p> if(ptr2!=NULL){</p><p> ptr2->link=NULL;</p><p> ptr2=NULL;</p><p><b> }</b></p><p> if(Rhead!=NULL){</p><p>
91、; p1=(struct Line*)malloc(sizeof(Line));</p><p> if(p1==NULL){</p><p> printf("內(nèi)存分配錯誤!\n");</p><p><b> exit(1);</b></p><p><b> }</b&
92、gt;</p><p><b> p1->L=i;</b></p><p> p1->head=Rhead;</p><p> if(p2==NULL){</p><p><b> Lhead=p1;</b></p><p><b> p2=p
93、1;}</b></p><p> else{p2->next=p1;</p><p><b> p2=p1;}}</b></p><p><b> i++;</b></p><p> Rhead=NULL;</p><p><b> j=
94、1;}</b></p><p> if(p2!=NULL)</p><p> p2->next=NULL;</p><p> return Lhead;}</p><p> struct Line *Change(struct Line*Lhead,int n){</p><p> stru
95、ct Line*p1,*p2,*p3,*p;</p><p> struct Row*ptr;</p><p> int i=1,k,j;</p><p> float max,t;</p><p> if(Lhead==NULL){</p><p> printf("鏈表為空!\n");
96、</p><p><b> exit(1);}</b></p><p><b> p2=Lhead;</b></p><p> while(i<=n){</p><p><b> max=0;</b></p><p><b>
97、k=0;</b></p><p><b> t=0.0;</b></p><p> ptr=p2->head;</p><p> while(ptr!=NULL){</p><p> if(ptr->R!=n+1){</p><p> t+=fabs(ptr-&g
98、t;x);</p><p> if(max<fabs(ptr->x)){</p><p> max=fabs(ptr->x);</p><p> k=ptr->R;}}</p><p> ptr=ptr->link;}</p><p><b> t=t-max;<
99、;/b></p><p> if(max<=t){</p><p> printf("系數(shù)矩陣A不具有嚴格對角優(yōu)勢,該程序不能用Gauss-Jacobi迭代法解該方程組!\n");</p><p> return NULL;}</p><p> if(p2->L==k)</p>&l
100、t;p> p2=p2->next;</p><p> else if(p2->L>k){</p><p> printf("系數(shù)矩陣A不具有嚴格對角優(yōu)勢,該程序不能用Gauss-Jacobi迭代法解該方程組!\n");</p><p><b> exit(0);}</b></p>
101、<p> else{p3=Lhead;</p><p> while(p3->L!=k)</p><p> p3=p3->next;</p><p> ptr=p3->head;</p><p> p3->head=p2->head;</p><p> p2->
102、;head=ptr;}</p><p><b> i++;}</b></p><p> return Lhead;}</p><p> void Deal(struct Line *Lhead,float e,int N,int n){</p><p> struct Term*ptr;</p>
103、<p> float Term;</p><p> struct Line*p1;</p><p> struct Row*current;</p><p> float m=0,a,b,c=0;</p><p> int k=0,i=0;</p><p> if(Lhead==NULL)<
104、/p><p> {printf("鏈表為空\n");</p><p><b> exit(1);}</b></p><p> ptr=malloc(n*sizeof(Term));</p><p> for(i=0;i<n;i++)</p><p> {(ptr+
105、i)->x=0;</p><p> (ptr+i)->m=0;}</p><p> printf("迭代過程的數(shù)據(jù)變化表如下:\n");</p><p> printf(" K");</p><p> for( i=1;i<=n;i++)</p><p&g
106、t; printf(" X%d",i);</p><p> printf("\n %d",k);</p><p> for( i=0;i<n;i++)</p><p> printf(" %.5f",ptr[i].x);</p><p> printf(
107、"\n");</p><p><b> do{ m=0;</b></p><p><b> p1=Lhead;</b></p><p> while(p1!=NULL){</p><p> current=p1->head;</p><p>
108、 while(current!=NULL){</p><p> if(current->link==NULL)</p><p> b=current->x;</p><p> else if(current->R==p1->L)</p><p> a=current->x;</p>&l
109、t;p> else c+=(current->x)*ptr[(current->R)-1].x;</p><p> current=current->link;}</p><p> ptr[(p1->L)-1].m=(b-c)/a-ptr[(p1->L)-1].x;</p><p> if(m<fabs(ptr[(p
110、1->L)-1].m))</p><p> m=fabs(ptr[(p1->L)-1].m);</p><p> ptr[(p1->L)-1].x=(b-c)/a;</p><p><b> c=0;</b></p><p> p1=p1->next;}</p><p&
111、gt;<b> k++;</b></p><p> printf(" %d",k);</p><p> for( i=0;i<n;i++)</p><p> printf(" %0.5f",ptr[i].x);</p><p> printf("\n&
112、quot;);</p><p> }while(m>=e&&k<=N);</p><p><b> if(k>N){</b></p><p> printf("用迭代法解線性方程組失敗!\n");</p><p><b> exit(1);}<
113、/b></p><p> printf(" 用Gauss-Seidel迭代法解的方程的近似解為:\n");</p><p> for( i=0;i<n;i++)</p><p> printf(" X%d=%0.5f\n",i+1,ptr[i].x);}</p><
114、;p> int main(){</p><p> int i,n,N;</p><p><b> float e;</b></p><p> struct Line *head;</p><p> printf("輸入線性方程組的維數(shù)n、最大容許迭代次數(shù)N、容許誤差e:\n");<
115、;/p><p> printf("n=");</p><p> scanf("%d",&n);</p><p> printf("N=");</p><p> scanf("%d",&N);</p><p> prin
116、tf("e=");</p><p> scanf("%f",&e);</p><p> printf("輸入線性方程組的系數(shù)矩陣A及常數(shù)項Bi:\n");</p><p> for( i=1;i<=n+1;i++)</p><p> {if(i!=n+1)<
117、;/p><p> printf(" X%d",i);</p><p> else printf(" B\n");</p><p><b> }</b></p><p> head=Create(n,n);</p><p> printf("
118、;\n"); </p><p> head=Change(head,n);</p><p> Deal(head,e,N,n);</p><p> return 0;}</p><p><b> 2.VB完整程序</b></p><p> Option
119、Explicit</p><p> Private Sub Command1_Click()</p><p> Dim i As Integer, j As Integer, k As Integer</p><p><b> k = 0</b></p><p> For i = 1 To num</p&g
120、t;<p> For j = 1 To num</p><p> a(i, j) = Val(Text1(k).Text)</p><p><b> k = k + 1</b></p><p><b> Next j</b></p><p> b(i) = Val(Text2
121、(i - 1).Text)</p><p><b> Next i</b></p><p> Call Guass</p><p> For i = 1 To num</p><p> Label5(i - 1).Caption = Left$(Str$(x(i)), 6)</p><p>
122、; Label5(i - 1).Visible = True</p><p> Label4.Visible = True</p><p><b> Next i</b></p><p><b> End Sub</b></p><p> Private Sub Command2_Clic
123、k()</p><p> Dim i As Integer, j As Integer, k As Integer</p><p> Dim setX As Integer, setY As Integer</p><p> Dim setlX(1 To 10) As Integer</p><p> num = Val(txtNum
124、.Text)</p><p> Call Form_Load</p><p> If num > 10 Then</p><p> MsgBox "請輸入小于10的數(shù)據(jù)。"</p><p><b> Exit Sub</b></p><p><b>
125、End If</b></p><p> Label1.Caption = Space(1) & "a(x,y)" & Space(7)</p><p> Label3.Caption = ""</p><p> Label1.Height = 400</p><p>
126、 Label1.Top = Text1(0).Top - 500</p><p> Label3.Top = Text1(0).Top</p><p><b> k = 0</b></p><p> For i = 1 To num</p><p> setX = 600</p><p>
127、 Label1.Caption = Label1.Caption & Str$(i) & Space(2)</p><p> For j = 1 To num</p><p> setY = Text1(0).Top + (i - 1) * Text1(0).Height</p><p> Text1(k).Move setX, setY,
128、Text1(0).Width, Text1(0).Height</p><p> Text1(k).Visible = True</p><p> If i = num Then</p><p> Label5(j - 1).Move setX, setY + Text1(0).Height + 80, Text1(0).Width, Text1(0).Hei
129、ght</p><p><b> End If</b></p><p> setlX(j) = setX</p><p> setX = setX + Text1(0).Width + 50</p><p><b> k = k + 1</b></p><p><
130、;b> Next j</b></p><p> Text2(i - 1).Move setX, setY, Text1(0).Width, Text1(0).Height</p><p> Text2(i - 1).Visible = True</p><p> Label3.Caption = Label3.Caption & R
131、ight(Str$(i), 1) & Space(2)</p><p><b> Next i</b></p><p> Label1.Left = 200</p><p> Label3.Left = 300</p><p> Label3.Width = 100</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《計算方法》課程設(shè)計--用列主元高斯消去法求線性代數(shù)方程組的解
- 非線性代數(shù)方程組理論引入高等代數(shù)課程研究.pdf
- 與PDE數(shù)值解相關(guān)的線性代數(shù)方程組求解.pdf
- 解線性代數(shù)方程組直接法的matlab gui設(shè)計[畢業(yè)論文]
- 解線性代數(shù)方程組迭代法的matlab gui設(shè)計[開題報告]
- 解線性代數(shù)方程組迭代法的matlab gui設(shè)計[文獻綜述]
- 解線性代數(shù)方程組迭代法的matlab gui設(shè)計[畢業(yè)論文]
- 第二章 非線性代數(shù)方程組的解法
- 非線性代數(shù)方程組與幾何約束問題求解.pdf
- 虛擬區(qū)域分解法導(dǎo)出的線性代數(shù)方程組數(shù)值解法.pdf
- 解周期塊狀三對角線性代數(shù)方程組的新算法.pdf
- 解具特殊系數(shù)矩陣線性代數(shù)方程組的預(yù)條件迭代法.pdf
- 計算機課程設(shè)計
- vf計算機課程設(shè)計
- 計算機課程設(shè)計報告
- 非線性代數(shù)方程組求解的布谷鳥算法及其改進算法研究.pdf
- 計算機課程設(shè)計---冒泡排序
- 解線性代數(shù)方程組迭代法的matlab gui設(shè)計【信息科學(xué)與技術(shù)專業(yè)】【畢業(yè)設(shè)計+文獻綜述+開題報告】
- 微型計算機課程設(shè)計報告
- 計算機課程設(shè)計----銷售管理系統(tǒng)
評論
0/150
提交評論