列主消元法 解方程

来源:互联网 发布:免费网管软件 编辑:程序博客网 时间:2024/04/28 05:29
Code:
  1. #include <iostream>   
  2. using namespace std;   
  3. const int N = 20;   
  4. float a[N][N];   
  5.   
  6. float fabs(float x)//求绝对值   
  7. {   
  8.   return x>0?x:-x;   
  9. }   
  10.   
  11. int main()   
  12. {   
  13.     int n,i,j,p,x,y,f,q,bigq;   
  14.     float k,t,max;   
  15.     cout<<"请输入行列式的阶数:";   
  16.     while (cin>>n && n>0)   
  17.     {   
  18.        int judge = 1;//作为系数行列式是否是0 的标志   
  19.   
  20.        cout<<"请输入线性方程组的系数矩阵:"<<endl;   
  21.        /***********************/  
  22.        for(i = 1; i<=n ; i++)   
  23.          for(j = 1; j<=n ;j++)   
  24.          {   
  25.              cin>>a[i][j];   
  26.          }   
  27.          //输入线性方程组的系数矩阵   
  28.   
  29.        /*******************/  
  30.          cout<<"请输入线性方程组的常数列:"<<endl;   
  31.   
  32.          for(i= 1;i<=n ; i++)   
  33.          cin>>a[i][n+1];   
  34.          //输入完毕;   
  35.        /*******************/  
  36.   
  37.      for(j= 1; j<=n ; j++)   //  n row   
  38.          {   
  39.              cout<<"第"<< j << "大步" <<endl;   
  40.              for(q= j , max = fabs((a[i][j])) ,bigq =j; q<=n; q++)   
  41.              //q从j开始作比较;   
  42.              //bigq = j 开始时  默认 为 j 行   
  43.              {   
  44.                  if( fabs(a[q][j]) >max)   
  45.                  {   
  46.                      max = fabs(a[q][j]);   
  47.                      bigq = q; //若 要 互换  则  选取 q 行 为主 元   
  48.                  }   
  49.              }   
  50.              cout<<"列主元为第"<< bigq <<"行的元素,绝对值为:" <<max<<endl;   
  51.              //寻找第J列中系数最大的一行用bigq记下行号   
  52.   
  53.              for(p = 1; p<=n+1 ; p++)   
  54.               //当a[j][j]元为零时,第j行和第bigq行互换;   
  55.               //出错:p到n结束;没有交换叙述矩阵   
  56.              {   
  57.                  t = a[j][p];   //交换   
  58.                  a[j][p] = a[bigq][p];   
  59.                  a[bigq][p] = t;   
  60.              }   
  61.             cout<<"第"<< j <<"行和第" << bigq <<"行发生互换"<<endl;   
  62.              //比较换行后的处理   
  63.             if(0 == a[j][j])   
  64.             {   
  65.                 cout<<"该线性方程组无解或者解不唯一(提前结束)"<< 0 <<endl;   
  66.                 judge = 0;   
  67.                 break;   
  68.             }   
  69.             for( i =f=n ; i>j && max!=0 ; i--)   
  70.             //i代表第J大步的第i小步   
  71.             {   
  72.                 k = -a[i][j]/a[j][j];   
  73.                 for(p=1; p<=n+1; p++)  //error husiwen:p<n+1;  注意 系数也要处理   
  74.                 {   
  75.                     a[i][p] += a[j][p]*k;// k 为 乘系数    k = -a[i][j]/a[j][j]; 消掉 下面的 系数   
  76.                     if(a[i][p]< 0.0001)//  当比较小的时候 取值 为0;   
  77.                     a[i][p] =0;   
  78.                 }   
  79.                 //依次消去a[i][j]元,构造上三角行列式   
  80.                 cout<<"一小步:/n 行的系数为:"<< k <<";乘"<<k<<"处理之后得到:"<<endl;   
  81.                 for(x=1 ;x<=n ; x++)   
  82.                 {   
  83.                     for(y=1; y<=n+1; y++)   
  84.                     {   
  85.                         cout.setf(ios::left); // c++ 格式 输出   
  86.                         cout.width(5);   
  87.                         cout<<a[x][y]<<" ";    // 输出系数 和 b ;n+1 表示等式的右边   
  88.                     }   
  89.                     cout<<endl;   
  90.                     //行列式消去化0的情况的跟踪报道   
  91.                 }   
  92.             }   
  93.          }   
  94.    for(j=1; j<=n; j++)//j代表一大步   
  95.       for(i=f=1; i<j&& judge !=0 ; i++)//i 代表第j大步中的第i小步   
  96.       {   
  97.           k = -a[i][j]/a[j][j];   
  98.           for(p=1; p<=n+1; p++)   
  99.              a[i][p]+=a[j][p]*k;   
  100.   
  101.       }   
  102.       if(judge != 0)   
  103.       {   
  104.           cout<<"该行列式方程的解为:"<<endl;   
  105.           for(i=1; i<=n; i++)   
  106.           cout<<"x"<< i <<"="<<a[i][n+1]/a[i][i]<<endl; //此时a[i]求解 方程组 的根,输出   
  107.       }   
  108.       //计算完毕 输出结果   
  109.       cout<<"请输入行列式的阶数(按0结束):";   
  110.     }   
  111.   
  112.     return 0;   
  113. }