zoukankan      html  css  js  c++  java
  • [算法] 高斯消元法 列主消元法 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<<"|-----------------------------
    ";
     21     cout<<"|请输入系数矩阵,如:
    ";
     22     cout<<"|1.1348 3.8326 1.1651 3.4017
    "; 
     23     cout<<"|0.5301 1.7875 2.5330 1.5435
    ";
     24     cout<<"|3.4129 4.9317 8.7643 1.3142
    ";
     25     cout<<"|1.2371 4.9998 10.6721 0.0147
    ";
     26     cout<<"|-----------------------------
    ";
     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<<"|-----------------------------
    ";
     33     cout<<"|请输入b矩阵,如:
    ";
     34     cout<<"|9.5342 6.3941 18.4231 16.9237
    ";
     35     cout<<"|-----------------------------
    ";
     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次消元结果如下:
    ",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]<<'
    ';
     53     }
     54     cout<<"END THIS SHOW-------------
    ";
     55 }
     56 
     57 /*
     58 显示结果
     59 */
     60 void Print(){
     61     cout<<"|-----------------------------
    ";
     62     cout<<"|结果为:
    ";
     63     for(int i=1;i<=n;i++){
     64         printf("x[%d]=  %lf
    ",i,x[i]);
     65     }
     66     cout<<"|-----------------------------
    
    ";
     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
    ";
    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
    ";
    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 */
  • 相关阅读:
    MySQL锁总结
    DDL和DML
    字节、字、位、比特之间的关系
    Mysql数据库、表设计规范指南
    Mysql性能优化关键配置指南
    3.python正则匹配不到内容时消耗大量内存
    1. postman使用
    2. python提示:TypeError: unhashable type: 'list'
    14. selenium的Page Object模型
    12.unittest的学习
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3637411.html
Copyright © 2011-2022 走看看