用高斯下降法解多元一次方程組(C++實現)
阿新 • • 發佈:2019-01-29
昨天演算法上機出了一道求多元一次方程組的題目,大神們早早就提交了,而我弄了很久,然而並不能在規定時間內完成。究其原因,是線性代數的知識已經忘光了。痛定思痛,我決定把這個題目弄出來,上傳到CSDN部落格,以警醒我日後仍需多加用功。
本文的程式碼涉及到以下幾個易忘點:
①動態輸入,換行時停止輸入;
②動態構建二維陣列;
③函式傳遞二維陣列;
閱讀本文程式碼需要基礎:線性代數矩陣轉化
演算法輸入:2 -1 1 1 4 1 -1 5 1 1 1 0
演算法輸出:1 0 -1
程式碼如下所示:
//==================================================|| // || //用高斯下降法解多元一次方程組 || //Input:2 -1 1 1 || // 4 1 -1 5 || // 1 1 1 0 || //Output:1 0 -1 || // || //Coding by Wison || //2015/5/10 || // || //==================================================|| #include<iostream> using namespace std; //高斯下降法求輸入陣列的上三角形等價矩陣 void gaussElimination(double** A,int size1,int size2) { double B[100][100]={}; for(int i=0;i<size1;++i) for(int j=0;j<size2;++j) B[i][j]=A[i][j]; for(int i=0;i<size1-1;++i) { for(int j=i+1;j<size1;++j) for(int k=i;k<size2;++k) { A[j][k]=A[j][k]-A[i][k]*B[j][i]/B[i][i]; } for(int p=0;p<size1;++p) for(int q=0;q<size2;++q) B[p][q]=A[p][q]; } } //逆推導上三角形等價矩陣,求輸出陣列 void decodeMatrix(double** A,int size1,int size2,double* AN,int sizean) { for(int i=size1-1;i>=0;i--) { double temp=A[i][size2-1]; for(int k=i;k<size1-1;k++) { temp=A[i][size2-1]-A[i][k+1]*AN[k+1]; } AN[i]=temp/A[i][i]; } } int main() { //先建立第一個輸入陣列,確定輸入規模 double input[10]; //輸入規模 int size=0; //得出輸入規模,併為第一個陣列賦值 for(;;) { cin>>input[size++]; if(getchar()=='\n') break; } //如果輸入規模大於1,則有效 if(size>1) { //建一個二維陣列,首先賦行數 double** A=new double*[size-1]; //為二維陣列賦列數 for(int i=0;i<size-1;++i) { A[i]=new double[size]; } //為二維陣列賦第一個陣列的值 for(int i=0;i<size;i++) { A[0][i]=input[i]; } //為二位陣列賦其他行的值 for(int i=1;i<size-1;++i) { for(int col=0;;col++) { cin>>A[i][col]; if(getchar()=='\n') break; } } //建立一個輸出陣列 double *an=new double[size-1]; //先將輸入陣列放進高斯下降函式,求上三角形等價矩陣 gaussElimination(A,size-1,size); //再通過對上三角形等價矩陣求逆推導,得出輸出陣列 decodeMatrix(A,size-1,size,an,size-1); //輸出陣列列印 for(int i=0;i<size-1;++i) cout<<an[i]<<" "; } else { //輸入格式有錯 cout<<"你所輸入未夠--請從新輸入"<<endl; } system ("pause"); return 0; }