C++實(shí)驗(yàn)報(bào)告高斯消元法_第1頁(yè)
C++實(shí)驗(yàn)報(bào)告高斯消元法_第2頁(yè)
C++實(shí)驗(yàn)報(bào)告高斯消元法_第3頁(yè)
C++實(shí)驗(yàn)報(bào)告高斯消元法_第4頁(yè)
C++實(shí)驗(yàn)報(bào)告高斯消元法_第5頁(yè)
已閱讀5頁(yè),還剩2頁(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)介

高斯肖元法C++上機(jī)實(shí)驗(yàn)報(bào)告學(xué)生姓名:學(xué)號(hào):專業(yè)班級(jí):實(shí)驗(yàn)類型:綜合一實(shí)驗(yàn)工程名稱全選主元高斯消去法解線性方程組二實(shí)驗(yàn)原理設(shè)有n元線性方程組(考慮便于C++程序數(shù)組表示,方程的下標(biāo)從0開(kāi)始),寫為矩陣形式為Ax=b,其中A為線性方程組的系數(shù)矩陣,x為列向量,是方程組的解,b也是列向量.一般來(lái)講,可以假定矩陣A是非奇異陣。〔n階矩陣A的行列式不為零,即|A|≠0,那么稱A為非奇異矩陣〕,,將系數(shù)矩陣A和向量b放在一起,形成增廣矩陣B:全選主元消去就在矩陣B上進(jìn)行,整個(gè)過(guò)程分為如下兩個(gè)步驟:第一步:消去過(guò)程。對(duì)于k從0開(kāi)始到n-2結(jié)束,進(jìn)行以下三步。首先,從系數(shù)矩陣A的k行k列開(kāi)始的子矩陣中選取絕對(duì)值最大的元素作為主元素。例如:然后交換B的第k行與第行,第k列與第列,這樣,這個(gè)子矩陣中具有最大絕對(duì)值的元素被交換到k行k列的位置上.其次,進(jìn)行歸一化計(jì)算。計(jì)算方法為:最后進(jìn)行消去計(jì)算:第二步,回帶過(guò)程:三代碼的實(shí)現(xiàn)LinearEqu的定義,LinearEqu.cpp文件中包括該類的成員函數(shù)實(shí)現(xiàn)文件;7-9.cpp文件包括程序的主函數(shù),主函數(shù)中定義了一個(gè)類LinearEqu的對(duì)象,通過(guò)這個(gè)對(duì)象求解一個(gè)四元線性方程組。//Matrix.h文件一,定義一個(gè)CMatrix類#ifndef_MATRIX_H#define_MATRIX_HclassCMatrix//定義CMatrix基類{public://外部接口 CMatrix(intsize=2);//構(gòu)造函數(shù) ~CMatrix();//析構(gòu)函數(shù)voidsetMatrix(constdouble*values);//矩陣賦初值voidprintMatrix()const;//顯示矩陣intgetsize()const{returnsize;}//得到矩陣大小double&element(inti,intj){returnelements[i*size+j];}doubleelement(inti,intj)const{returnelements[i*size+j];}private://保護(hù)數(shù)據(jù)成員intsize;//定義矩陣的大小double*elements;//矩陣存放數(shù)組首地址};#endif//_MATRIX_H//LinearEqu.h文件二,CLinearEqu類定義#ifndef_LINEAR_EQU_H#define_LINEAR_EQU_H#include"Matrix.h"classCLinearEqu:publicCMatrix//公有派生類CLinearEqu定義{public://外部接口 CLinearEqu(intsize=2);//構(gòu)造函數(shù) ~CLinearEqu();//析構(gòu)函數(shù)voidsetLinearEqu(constdouble*a,constdouble*b);//方程賦值boolsolve();//全選住院高斯消去法求解方程voidprintLinearEqu()const;//顯示方程voidprintSolution()const;//顯示方程的解private://私有數(shù)據(jù)double*sums;//方程右端項(xiàng)double*solution;//方程的解};#endif//_LINEAR_EQU_H經(jīng)過(guò)公有派生,LinearEqu類獲得了除構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的Matrix類的全部成員。由于基類的成員是公有和保護(hù)類型,因此在派生類中的成員函數(shù)中,基類繼承來(lái)的成員全部可以訪問(wèn),而對(duì)于建立LinearEqu類對(duì)象的外部模塊來(lái)講,基類的保護(hù)成員是無(wú)法訪問(wèn)的。通過(guò)保護(hù)訪問(wèn)類型和公有的基方式,就實(shí)現(xiàn)了基類Matrix的數(shù)據(jù)的有效共享和可靠保護(hù)。在程序中,方程的系數(shù)矩陣、解以及右端項(xiàng)全部采用動(dòng)態(tài)內(nèi)存分配技術(shù),這些工作都是在基類、派生類的構(gòu)造函數(shù)中完成,它們的析構(gòu)函數(shù)中完成。//Matrix.cpp文件三,CMatrix類實(shí)現(xiàn)#include"Matrix.h"http://包含類的定義頭文件#include<iostream>usingnamespacestd;voidCMatrix::setMatrix(constdouble*values)//設(shè)置矩陣{for(inti=0;i<size*size;i++) elements[i]=values[i];//矩陣成員賦初值}CMatrix::CMatrix(intsize/*=2*/):size(size)//矩陣CMatrix類的構(gòu)造函數(shù){ elements=newdouble[size*size];}CMatrix::~CMatrix()//矩陣Matrix類的析構(gòu)函數(shù){delete[]elements;//釋放空間}voidCMatrix::printMatrix()const//顯示矩陣的元素{ cout<<"TheMatrixis:"<<endl;for(inti=0;i<size;i++) {for(intj=0;j<size;j++) cout<<element(i,j)<<""; cout<<endl; }}//LinearEqu.cpp文件四,CLinearEqu類實(shí)現(xiàn)#include"LinearEqu.h"http://包含類的定義頭文件#include<iostream>#include<cmath>usingnamespacestd;CLinearEqu::CLinearEqu(intsize/*=2*/):CMatrix(size)//用size調(diào)用基類構(gòu)造函數(shù){ sums=newdouble[size];//動(dòng)態(tài)內(nèi)存分配 solution=newdouble[size];}CLinearEqu::~CLinearEqu()//派生類CLinearEqu的析構(gòu)函數(shù){delete[]sums;//釋放內(nèi)存delete[]solution;//會(huì)自動(dòng)調(diào)用基類析構(gòu)函數(shù)}voidCLinearEqu::setLinearEqu(constdouble*a,constdouble*b)//設(shè)置線性方程組{ setMatrix(a);//調(diào)用基類函數(shù)for(inti=0;i<getsize();i++) sums[i]=b[i];}voidCLinearEqu::printLinearEqu()const//顯示線性方程組{ cout<<"TheLineequtionis:"<<endl;for(inti=0;i<getsize();i++) {for(intj=0;j<getsize();j++) cout<<element(i,j)<<""; cout<<""<<sums[i]<<endl; }}voidCLinearEqu::printSolution()const//輸出方程組的解{ cout<<"TheResultis:"<<endl;for(inti=0;i<getsize();i++) cout<<"x["<<i<<"]="<<solution[i]<<endl;}inlinevoidswap(double&v1,double&v2)//交換兩個(gè)實(shí)數(shù){doubletemp=v1; v1=v2; v2=temp;}boolCLinearEqu::solve()//全選主元高斯消去法求解方程{int*js=newint[getsize()];//存儲(chǔ)主元素所在列號(hào)的數(shù)組for(intk=0;k<getsize()-1;k++)//選主元素 {intis;//主元素所在行號(hào)doublemax=0;//所有元素的最大值for(inti=k;i<getsize();i++)for(intj=k;j<getsize();j++) {doublet=fabs(element(i,j));if(t>max) { max=t; js[k]=j; is=i; } }if(max==0) {delete[]js;returnfalse; }else//通過(guò)行列交換,把主元素交換到第K行第K列 {if(js[k]!=k)for(inti=0;i<getsize();i++) swap(element(i,k),element(i,js[k]));if(is!=k) {for(intj=k;j<getsize();j++) swap(element(k,j),element(is,j)); swap(sums[k],sums[is]); } }//消去過(guò)程doublemajor=element(k,k);for(intj=k+1;j<getsize();j++) element(k,j)/=major; sums[k]/=major;for(inti=k+1;i<getsize();i++) {for(intj=k+1;j<getsize();j++) element(i,j)-=element(i,k)*element(k,j); sums[i]-=element(i,k)*sums[k]; } }//判斷剩下的一個(gè)元素是否等于零doubled=element(getsize()-1,getsize()-1);if(fabs(d)<1e-15) {delete[]js;returnfalse; }//回帶過(guò)程 solution[getsize()-1]=sums[getsize()-1]/d;for(inti=getsize()-2;i>=0;i--) {doublet=0.0;for(intj=i+1;j<=getsize()-1;j++) t+=element(i,j)*solution[j]; solution[i]=sums[i]-t; } js[getsize()-1]=getsize()-1;for(intk=getsize()-1;k>=0;k--)if(js[k]!=k)swap(solution[k],solution[js[k]]);delete[]js;returntrue;}在類的成員函數(shù)實(shí)現(xiàn)過(guò)程中,派生類的構(gòu)造函數(shù)使用參數(shù)調(diào)用了基類的構(gòu)造函數(shù),為矩陣動(dòng)態(tài)分配了內(nèi)存空間。而派生類的析構(gòu)函數(shù)同樣也調(diào)用了基類的析構(gòu)函數(shù),只是整個(gè)調(diào)用過(guò)程完全由系統(tǒng)內(nèi)部完成。基類的保護(hù)數(shù)據(jù)成員的身份出現(xiàn),派生類的成員函數(shù)可以自由的進(jìn)行訪問(wèn)。全選主元高斯消去法求解函數(shù)返回值為整型,正常完成之后,返回值為1,非正常結(jié)束后,返回值為0,根據(jù)函數(shù)的返回值,就可以判斷求解過(guò)程的完成情況//7-9.cpp文件五,主函數(shù)#include"LinearEqu.h"http://類定義頭文件#include<iostream>usingnamespacestd;intmain()//主函數(shù){doublea[]=//方程系數(shù)矩陣 { 0.2368,0.2471,0.2568,1.2671, 0.1968,0.2071,1.2168,0.2271, 0.1581,1.1675,0.1768,0.1871, };doubleb[]={1.8471,1.7471,1.6471,1.5471};//方程右端項(xiàng) CLinearEquequ(4);//定義一個(gè)四元方程組對(duì)象 equ.setLinearEqu(a,b);//設(shè)置方程組 equ.printLinearEqu();//通過(guò)調(diào)用輸出方程組if(equ.solve())//求解方程組 equ.printSolution();//輸出方程組的解else cout<<"fail"<<endl;return0;}在程序的主函數(shù)局部,選擇了一個(gè)四元方程組來(lái)作為一個(gè)實(shí)際例子驗(yàn)證算法。方程組的系數(shù)及右端項(xiàng)數(shù)據(jù)都使用一維數(shù)組來(lái)存儲(chǔ)。首先定義一個(gè)運(yùn)行結(jié)果如下:四實(shí)際應(yīng)用許多實(shí)際問(wèn)題經(jīng)常最后歸結(jié)為求解線性方程組。例如:用最小二乘法處理測(cè)量結(jié)果時(shí),和用網(wǎng)格法逼近微分方程的邊值問(wèn)題時(shí),都會(huì)得到線性方程組。這些方程組中的未知量往往是幾十個(gè),甚至上百個(gè),如果要解含n個(gè)未知量的線性方程時(shí),就得計(jì)算出n+1個(gè)n階行列式,而計(jì)算每一個(gè)n階行列式就需做n!次乘法,一般來(lái)說(shuō),即使借助電子計(jì)算機(jī),也需要數(shù)月乃至數(shù)年的時(shí)間,所以在解這些含有未知量的線性方程組時(shí),不僅要借助于電子計(jì)算機(jī),同時(shí)還必須尋求恰當(dāng)?shù)挠?jì)算方法。而高斯全選主元消去法是一種效率很高、較為常用的線性方程組解法。以下以電阻網(wǎng)絡(luò)為例加以說(shuō)明。電阻網(wǎng)絡(luò)實(shí)例簡(jiǎn)單電網(wǎng)中的電流可以利用線性方程組來(lái)描述。當(dāng)電流經(jīng)過(guò)電

溫馨提示

  • 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)論