[算法] 高斯消元法 列主消元法 C++ 代码

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<iomanip>
  4 using namespace std;
  5 #define e     0.00000001
  6 #define maxn 50
  7 
  8 int    n;//规模nXn
  9 double a[maxn][maxn];//系数矩阵
 10 double b[maxn];//b矩阵
 11 double m[maxn][maxn];//中间变量矩阵
 12 double x[maxn];//最终解
 13 int    H=1;//扩大H被结算(优化)
 14 /*
 15 读取数据
 16 */
 17 void read(){
 18     cout<<"请输入系数矩阵规模n:= ";
 19     cin>>n;
 20     cout<<"|-----------------------------\n";
 21     cout<<"|请输入系数矩阵,如:\n";
 22     cout<<"|1.1348 3.8326 1.1651 3.4017\n"; 
 23     cout<<"|0.5301 1.7875 2.5330 1.5435\n";
 24     cout<<"|3.4129 4.9317 8.7643 1.3142\n";
 25     cout<<"|1.2371 4.9998 10.6721 0.0147\n";
 26     cout<<"|-----------------------------\n";
 27     for(int i=1;i<=n;i++)
 28         for(int j=1;j<=n;j++){
 29             cin>>a[i][j];
 30             a[i][j]*=H;
 31         }
 32     cout<<"|-----------------------------\n";
 33     cout<<"|请输入b矩阵,如:\n";
 34     cout<<"|9.5342 6.3941 18.4231 16.9237\n";
 35     cout<<"|-----------------------------\n";
 36     for(int i=1;i<=n;i++){
 37         cin>>b[i];
 38         b[i]*=H;
 39     }
 40 }
 41 
 42 /*
 43 中间矩阵输出
 44 参数:消元次数
 45 */
 46 void PrintProc(int cases){
 47     printf("--------第%d次消元结果如下:\n",cases);
 48     for(int i=1;i<=n;i++){
 49         for(int j=1;j<=n;j++){
 50             cout<<setw(10)<<a[i][j]<<' ';
 51         }
 52         cout<<setw(10)<<b[i]<<'\n';
 53     }
 54     cout<<"END THIS SHOW-------------\n";
 55 }
 56 
 57 /*
 58 显示结果
 59 */
 60 void Print(){
 61     cout<<"|-----------------------------\n";
 62     cout<<"|结果为:\n";
 63     for(int i=1;i<=n;i++){
 64         printf("x[%d]=  %lf\n",i,x[i]);
 65     }
 66     cout<<"|-----------------------------\n\n";
 67 }
 68 
 69 /*
 70 顺序消元法
 71 */
 72 void ShunXuXiaoYuan(){
 73     //消元计算
 74     for(int k=1;k<n;k++){
 75         for(int i=k+1;i<=n;i++){
 76             m[i][k]=a[i][k]/a[k][k];
 77             for(int j=k+1;j<=n;j++){
 78                 a[i][j]-=m[i][k]*a[k][j];
 79             }
 80         }
 81         for(int i=k+1;i<=n;i++){
 82             b[i]-=m[i][k]*b[k];
 83         }
 84         PrintProc(k);//输出中间计算过程
 85     }
 86     //回代求解
 87     x[n]=b[n]/a[n][n];
 88     for(int i=n-1;i>0;i--){
 89         x[i]=b[i];
 90         for(int j=i+1;j<=n;j++)
 91             x[i]-=a[i][j]*x[j];
 92         x[i]/=a[i][i];
 93     }
 94     //输出结果
 95     Print();
 96 }
 97 
 98 /*
 99 列主消元
100 */
101 void LieZhuXiaoYuan(){
102     for(int k=1;k<n;k++){
103         //选主元[这一列的绝对值最大值]
104         double ab_max=-1;
105         int       max_ik;
106         for(int i=k;i<=n;i++){
107             if(abs(a[i][k])>ab_max){
108                 ab_max=abs(a[i][k]);
109                 max_ik=i;
110             }
111         }
112         //交换行处理[先判断是否为0矩阵]
113         if(ab_max<e){//0矩阵情况
114             cout<<"det A=0\n";
115             break;
116         }else if(max_ik!=k){//是否是当前行,不是交换
117             double temp;
118             for(int j=1;j<=n;j++){
119                 temp=a[max_ik][j];
120                 a[max_ik][j]=a[k][j];
121                 a[k][j]=temp;
122             }
123             temp=b[max_ik];
124             b[max_ik]=b[k];
125             b[k]=temp;
126         }
127         //消元计算
128         for(int i=k+1;i<=n;i++){
129             a[i][k]/=a[k][k];
130             for(int j=k+1;j<=n;j++){
131                 a[i][j]-=a[i][k]*a[k][j];
132             }
133             b[i]-=a[i][k]*b[k];
134         }
135         PrintProc(k);//输出中间计算过程
136         if(k<n-1)continue;
137         else{
138             if(abs(a[n][n])<e){
139                 cout<<"det A=0\n";
140                 break;
141             }else{//回代求解
142                 x[n]=b[n]/a[n][n];
143                 for(int i=n-1;i>0;i--){
144                     x[i]=b[i];
145                     for(int j=i+1;j<=n;j++)
146                         x[i]-=a[i][j]*x[j];
147                     x[i]/=a[i][i];
148                 }
149                 //输出结果
150                 Print();
151             }
152         }
153     }
154 }
155 
156 /*
157 主函数
158 */
159 int main(){
160     while(1){
161         read();
162         LieZhuXiaoYuan();
163         //ShunXuXiaoYuan();
164     }return 0;
165 }
166 /*
167 书上高斯消元的例子:
168 1 1 1 
169 1 3 -2
170 2 -2 1
171 
172 6 1 1
173 */
174 /*
175 书上列主消元的例子:
176 -0.002 2 2
177 1 0.78125 0
178 3.996 5.5625 4
179 
180 0.4 1.3816 7.4178
181 */

 

posted @ 2014-04-01 00:37  beautifulzzzz  阅读(10623)  评论(0编辑  收藏  举报