接上一篇隨筆,利用克拉莫法則求解n元線性方程組。
代碼:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 void appDescribe(); //程序說明 5 double valDet( double* detPtr, int rank); //求解行列式 6 class LinearEquations 7 { 8 public: 9 LinearEquations(); //構造方程組 10 void sol(); //求解 11 void showAns(); //顯示解 12 private: 13 int rank; //階數 14 double* parPtr; //系數行列式 15 double* conPtr; //常數項 16 double* ansPtr; //解 17 }; 18 LinearEquations::LinearEquations() 19 { 20 cout<<"輸入方程元數:"; 21 cin>>rank; 22 int rank2=rank*rank; 23 parPtr=new double[rank2]; 24 conPtr=new double[rank]; 25 cout<<endl<<"輸入系數行列式:"<<endl; 26 for(int i=0;i<rank2;i++) 27 cin>>parPtr[i]; 28 cout<<endl<<"輸入常數項:"<<endl; 29 for(int i=0;i<rank;i++) 30 cin>>conPtr[i]; 31 } 32 void LinearEquations::sol() 33 { 34 int rank2=rank*rank; 35 double det=valDet(parPtr,rank); 36 ansPtr=new double[rank]; 37 double *tempParptr=new double[rank2]; 38 double tempDet; 39 if(det==0) 40 { 41 ansPtr=NULL; 42 return; 43 } 44 for(int i=0;i<rank;i++) 45 { 46 for(int j=0;j<rank2;j++) 47 tempParptr[j]=parPtr[j]; 48 for(int j=0;j<rank;j++) 49 tempParptr[i+j*rank]=conPtr[j]; 50 tempDet=valDet(tempParptr,rank); 51 ansPtr[i]=tempDet/det; 52 } 53 } 54 void LinearEquations::showAns() 55 { 56 if(ansPtr==NULL) 57 { 58 cout<<"該線性方程組無解或有無數解"<<endl; 59 return; 60 } 61 cout<<endl<<"該線性方程組的解為:"<<endl; 62 for(int i=0;i<rank;i++) 63 cout<<'x'<<i+1<<':'<<ansPtr[i]<<endl; 64 } 65 int main() 66 { 67 appDescribe(); 68 LinearEquations l1; 69 l1.sol(); 70 l1.showAns(); 71 system("pause"); 72 return 0; 73 } 74 void appDescribe() 75 { 76 cout<<"***************************************"<<endl 77 <<"本程序利用克拉莫法則求解n元線性方程組。"<<endl 78 <<"案例:"<<endl 79 <<"輸入方程元數:4"<<endl<<endl 80 <<"輸入系數行列式:"<<endl 81 <<"1 1 1 1"<<endl 82 <<"1 2 -1 4"<<endl 83 <<"2 -3 -1 -5"<<endl 84 <<"3 1 2 11"<<endl<<endl 85 <<"輸入常數項:"<<endl 86 <<"5 -2 -2 0"<<endl<<endl 87 <<"該線性方程組的解為:"<<endl 88 <<"x1:1"<<endl 89 <<"x2:2"<<endl 90 <<"x3:3"<<endl 91 <<"x4:-1"<<endl 92 <<"***************************************"<<endl; 93 } 94 double valDet( double* detPtr, int rank) 95 { 96 double val=0; 97 if(rank==1) return detPtr[0]; 98 for(int i=0;i<rank;i++) //計算余子式保存在nextDetPtr[]中 99 { 100 double *nextDetPtr=new double[(rank-1)*(rank-1)]; 101 for(int j=0;j<rank-1;j++) 102 for(int k=0;k<i;k++) 103 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k]; 104 for(int j=0;j<rank-1;j++) 105 for(int k=i;k<rank-1;k++) 106 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k+1]; 107 val+=detPtr[i]*valDet(nextDetPtr,rank-1)*pow(-1.0,i); 108 } 109 return val; 110 } 111 /* 112 數據1: 113 2 114 115 1 2 116 2 1 117 118 3 3 119 數據2: 120 4 121 122 1 1 1 1 123 1 2 -1 4 124 2 -3 -1 -5 125 3 1 2 11 126 127 5 -2 -2 0 128 */