高斯列主消元法求解方程c語(yǔ)言程序報(bào)告_第1頁(yè)
高斯列主消元法求解方程c語(yǔ)言程序報(bào)告_第2頁(yè)
高斯列主消元法求解方程c語(yǔ)言程序報(bào)告_第3頁(yè)
高斯列主消元法求解方程c語(yǔ)言程序報(bào)告_第4頁(yè)
高斯列主消元法求解方程c語(yǔ)言程序報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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、hunan university程序設(shè)計(jì)訓(xùn)練報(bào) 告 專業(yè)班級(jí) 材料科學(xué)與工程四班 指導(dǎo)老師 院長(zhǎng) (系主任) 2012 年 6 月30 日目錄1軟件開發(fā)平臺(tái)12軟件功能說(shuō)明12.1功能分析說(shuō)明12.2功能說(shuō)明圖43軟件設(shè)計(jì)詳細(xì)內(nèi)容53.1采用的主要數(shù)據(jù)結(jié)構(gòu)類型53.2流程圖54軟件測(cè)試114.1軟件測(cè)試用例114.2軟件測(cè)試報(bào)告165總結(jié)和致謝166附錄.176.1源碼17 6.2 二人分工說(shuō)明.226.3參考文獻(xiàn)22221 軟件開發(fā)平臺(tái)visul c+ 6.02 軟件功能說(shuō)明用高斯列主消元法求解方程個(gè)數(shù)不超過(guò)15個(gè)的線性方程組2.1 功能分析說(shuō)明線性方程組可以表示為以下形式:通解于:方程等價(jià)

2、于ax=b對(duì)其增廣矩陣進(jìn)行初等行換不改變方程組的解,從而將其化為簡(jiǎn)單形式來(lái)求解方程組。|a|= (-1)aaa &calculate(intn,int m)功能:quanpailie_a()功能:計(jì)算一個(gè)全排列(-1)aaa的值gauss_row_xiaoqu()功能:將增廣矩陣通過(guò)交換兩行的方法使得第一列中a絕對(duì)值最大第二行各元素分別減去第一行對(duì)應(yīng)元素的a/a倍,使得a化為零;第三行各元素分別減去第一行對(duì)應(yīng)元素的a/a倍,使得a化為零;同理將a,aa都化為零;通過(guò)交換兩行的方法使得第一列中a絕對(duì)值最大第三行各元素分別減去第二行對(duì)應(yīng)元素的a/a倍,使得a化為零;第四行各元素分別減去第二

3、行對(duì)應(yīng)元素的a/a倍,使得a化為零;同理將a,aa都化為零;以此類推,可將主對(duì)角線下的元素全化為零,變?yōu)樯先蔷仃?。gauss_calculate()功能化為上三角矩陣之后,增廣矩陣最后一行可以表示為x=解得x=/倒數(shù)第二行可以表示為ax+ax=b解得x= (b- ax)/2依次按照此法可以求出個(gè)未知量對(duì)應(yīng)的值gauss_row()功能:調(diào)用函數(shù)calculate_a(n,m)計(jì)算行列式| a|的值,調(diào)用函數(shù)gauss_row_xiaoqu()將(a |b)化為上三角矩陣,調(diào)用函數(shù)gauss_calculate()計(jì)算未知量的值。若行列式不為零,輸出“系數(shù)行列式不為零,有唯一解”,并輸出解;若

4、行列式為零,輸出“系數(shù)行列式為零,無(wú)唯一解”。exchange _han(m,n)功能:交換a與b即(a |b)中m行和n行對(duì)應(yīng)元素的值。exchange(m,i)功能:交換a_ym與a_yi的值。input()功能:輸入函數(shù)個(gè)數(shù),若大于15,則提醒重新輸入;若小于15,則按照提示輸入方程組對(duì)應(yīng)得增廣矩陣,并備份數(shù)據(jù)。 2.2 功能說(shuō)明圖 高斯列主消元法求解線性方程組 輸入增廣矩陣:輸出結(jié)果:系數(shù)行列式不為零,方程有唯一解a=b=c=d=3 軟件設(shè)計(jì)詳細(xì)內(nèi)容3.1 采用的主要數(shù)據(jù)結(jié)構(gòu)類型#include<iostream>#include<stdlib.h>#inclu

5、de<iomanip.p>#include"bios.h"一位數(shù)組二維數(shù)組 3.2 流程圖 主流程圖:yny 開始 結(jié)束輸入方程個(gè)數(shù)nn>15?輸入方程對(duì)應(yīng)的增廣矩陣(a|b)調(diào)用函數(shù)calculate()計(jì)算系數(shù)行列式|a|的值|a|=0?調(diào)用函數(shù)gauss_row_xiaoqu將a化為上三角矩陣調(diào)用函數(shù)gauss_calculate()計(jì)算未知量的值輸出個(gè)未知量對(duì)應(yīng)的值輸出“行列式為零,方程無(wú)唯一解”n函數(shù)calculate_a()流程圖:yn結(jié)束輸出a_suma_sum+=quanpailie_a()exchange(m,m+i)calculate_

6、a(n-1,m+1)exchange(m,m+i)i<n?i=0n=1?開始yn函數(shù)gauss_row_xiaoqu()流程圖1開始k=01k<lenth?j=ki=k,maxi=ii<lenth?|aij |>|amaxij |?maxi=ii+maxik?exchange_hang(k,maxi)k<lenth-1i=k+1lik=aik/akk,j=kj<lenth?aij= aij- akj*likbi= bi-bk*liki+k+yn結(jié)束yynnynnyyn函數(shù)exchange_hang()流程圖:開始j=0j<lenth?temp=amja

7、mj=anjj+temp=bmbm=bnbn=temp結(jié)束yn函數(shù)gauss_calculate()流程圖:開始blenth-1= blenth-1/alenth-1lenth-1i=lenth-222i0?j=i+1sum_ax=oj<lenth?sum_ax+=aij*bjbi=( bi- sum_ax)/ aijj+結(jié)束yynn4軟件測(cè)試4.1軟件測(cè)試用例一方程組有唯一解得情況:1開始界面 2.輸入方程個(gè)數(shù)3.輸入方程的增廣矩陣4.輸出結(jié)果二方程組無(wú)唯一解得情況: 1.開始界面 2.輸入方程個(gè)數(shù) 3.輸入方程的增廣矩陣 4.輸出結(jié)果三方程個(gè)數(shù)大于15的情況 1.開始界面 2.輸入大

8、于15的數(shù),提示重新輸入4.2軟件測(cè)試報(bào)告標(biāo)號(hào)項(xiàng)目預(yù)期結(jié)果實(shí)際結(jié)果出錯(cuò)原因出錯(cuò)頻率01input()能正常輸入數(shù)據(jù)完成預(yù)期結(jié)果細(xì)節(jié)沒(méi)處理好數(shù)次02calculate_a()計(jì)算行列式的值完成預(yù)期結(jié)果循環(huán)出錯(cuò)經(jīng)常03quanpailie()計(jì)算一個(gè)全排列的值完成預(yù)期結(jié)果公式搞錯(cuò)數(shù)次04gauss_row()求解方程完成預(yù)期結(jié)果無(wú)無(wú)05gauss_row_xiaoqu()將矩陣化為上三角完成預(yù)期結(jié)果各種原因最多06gauss_calculate()計(jì)算結(jié)果完成預(yù)期結(jié)果數(shù)組用錯(cuò)數(shù)次07exchange_hang()交換兩行完成預(yù)期結(jié)果無(wú)無(wú)08exchange()交換兩個(gè)數(shù)據(jù)完成預(yù)期結(jié)果無(wú)無(wú)5總結(jié)和致

9、謝在c程序的編寫當(dāng)中,發(fā)現(xiàn)很多很棘手的問(wèn)題。線性方程組的求解是抽象的數(shù)學(xué)問(wèn)題,其中涉及大量變量,因此采用了數(shù)組。在進(jìn)行矩陣的初等行變換時(shí),由于細(xì)節(jié)問(wèn)題處理的不夠好,導(dǎo)致了多次編譯不得通過(guò),最后是反復(fù)修改,反復(fù)試驗(yàn),再請(qǐng)同學(xué)指導(dǎo)的情況下才最終使得編譯成功。后期主要完成對(duì)程序進(jìn)行細(xì)節(jié)上的完善,和訓(xùn)練報(bào)告的寫作。期間流程圖的畫法以及word的使用也花費(fèi)了大把精力。雖然過(guò)程需要一定的耐心和細(xì)心,最終在兩人的合作下共同完成了報(bào)告,最終還是感覺(jué)受益很多。6附錄6.1源碼#include<iostream.h>#include<iomanip.h>#include<stdlib

10、.h>#include<math.h>/-全局變量定義區(qū)#define number 15 /方程最大個(gè)數(shù)double anumbernumber, bnumber, copy_anumbernumber, copy_bnumber; /系數(shù)行列式int a_ynumber; /a中隨著橫坐標(biāo)增加列坐標(biāo)的排列順序,如a00,a12,a21.則a_y=0,2,1.;int lenth, copy_lenth; /方程的個(gè)數(shù)double a_sum; /計(jì)算行列式的值char *x; /未知量a,b,c的載體/-函數(shù)聲明區(qū)void input(); /輸入方程組void prin

11、t_menu(); /打印主菜單void gauss_row(); /gauss列主元解方程組double quanpailie_a(); /根據(jù)列坐標(biāo)的排列計(jì)算的值,如a_y=0,2,1,得sum=a0 a_y0 * a1 a_y1 * a2a_y2 =a00*a12*a21;double &calculate_a(int n,int m);void exchange(int m, int i); /交換a_ym,a_yivoid exchange_hang(int m, int n); /分別交換a和b中的m與n兩行void gauss_row_xiaoqu(); /gauss列主

12、元消去法void gauss_calculate(); /根據(jù)gauss消去法結(jié)果計(jì)算未知量的值/主函數(shù)void main() input(); /輸入方程 print_menu(); /打印主菜單 gauss_row(); /函數(shù)定義區(qū)void print_menu() system("cls"); cout << "-方程系數(shù)和常數(shù)矩陣表示如下:n" for(int j = 0; j < lenth; j+) cout << "系數(shù)" << j + 1 << " &q

13、uot; cout << "t常數(shù)" cout << endl; for(int i = 0; i < lenth; i+) for(j = 0; j < lenth; j+) cout << setw(8) << setiosflags(ios:left) << aij; cout << "t" << bi << endl; void input() int i, j; do cout << "方程的個(gè)數(shù):" ci

14、n>>lenth; if(lenth>15) cout<<"it's too big."<<endl; while(lenth>15); x = new charlenth; for(i = 0; i < lenth; i+) xi = 'a' + i; /輸入方程矩陣 /提示如何輸入 cout << "=n" cout << "請(qǐng)?jiān)诿總€(gè)方程里輸入" << lenth << "系數(shù)和一個(gè)常數(shù):n&qu

15、ot; cout << "例:n方程:a" for(i = 1; i < lenth; i+) cout << "+" << i + 1 << xi; cout << "=10n" cout << "應(yīng)輸入:" for(i = 0; i < lenth; i+) cout << i + 1 << " " cout << "10n" cout <<

16、 "=n" /輸入每個(gè)方程 for(i = 0; i < lenth; i+) cout << "輸入方程" << i + 1 << ":" for(j = 0; j < lenth; j+) cin >> aij; cin >> bi; /備份數(shù)據(jù) for(i = 0; i < lenth; i+) for(j = 0; j < lenth; j+) copy_aij = aij; for(i = 0; i < lenth; i+) copy_

17、bi = bi; copy_lenth = lenth; double &calculate_a(int n, int m) /計(jì)算行列式 int i; if(n = 1) a_sum += quanpailie_a(); else for(i = 0; i < n; i+) exchange(m, m + i); calculate_a(n - 1, m + 1); exchange(m, m + i); return a_sum;double quanpailie_a() /計(jì)算行列式中一種全排列的值 int i, j, l; double sum = 0, p; for(i

18、 = 0, l = 0; i < lenth; i+) for(j = 0; a_yj != i && j < lenth; j+) if(a_yj > i) l+; for(p = 1, i = 0; i < lenth; i+) p *= aia_yi; sum += p * (l % 2 = 0) ? (1) : (-1); return sum;/高斯列主法求解方程void gauss_row() int i, j;double sum; gauss_row_xiaoqu(); /用高斯列主元消去法將系數(shù)矩陣變成一個(gè)上三角矩陣 for(i = 0

19、; i < lenth; i+) for(j = 0; j < lenth; j+) cout << setw(10) << setprecision(5) << aij; cout << setw(10) << bi << endl; for(i = 0; i < lenth; i+) a_yi = i; sum = calculate_a(lenth, 0); if(sum != 0) cout << "系數(shù)行列式不為零,方程有唯一的解:n" gauss_calcula

20、te(); for(i = 0; i < lenth; i+) /輸出結(jié)果 cout << xi << "=" << bi << "n" else cout << "系數(shù)行列式等于零,方程沒(méi)有唯一的解.n"void gauss_row_xiaoqu() /高斯列主元消去法 int i, j, k, maxi; double lik; cout << "用gauss列主消元法結(jié)果如下:n" for(k = 0; k < lenth - 1; k+) j = k; for(maxi = i = k; i < lenth; i+) if(fabs(aij) > fabs(amaxij) maxi = i; /添加絕對(duì)值運(yùn)算符 if(maxi != k) exchange_hang(k, maxi); / for(i = k + 1; i < lenth; i+) lik = aik / akk; for(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)論