程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 利用克拉莫法則求解n元線性方程組,莫法則線性方程組

利用克拉莫法則求解n元線性方程組,莫法則線性方程組

編輯:C++入門知識

利用克拉莫法則求解n元線性方程組,莫法則線性方程組


接上一篇隨筆,利用克拉莫法則求解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 */

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved