码迷,mamicode.com
首页 > 其他好文 > 详细

利用克拉莫法则求解n元线性方程组

时间:2016-03-14 07:04:08      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

接上一篇随笔,利用克拉莫法则求解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 */

 

利用克拉莫法则求解n元线性方程组

标签:

原文地址:http://www.cnblogs.com/shuiming/p/5274400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!