線形方程式を解くガウス消去法

ガウス

#include <iostream> 
#include <algorithm> 
#include <cmath> using namespace std; const double eps = 1e- 6 ;
const int N = 110 ; int n;
ダブルa [N] [N];
void out ()
{ forint i = 0 ; i <n; i ++ ){
         forint j = 0 ; j <= n; j ++ 
            printf(" %10.2lf " 
        cout <<

 

  

 
    、a [i] [j]); endl; 
    } 
    cout << endl; 
} 
int gauss ()
{ 
    int c、r; // cは列を意味し、rは
    (c = 0、r = 0 ; c <n; c ++ )の意味する
    { int t = r;
         forint i = r; i <n; i ++ if(fabs(a [i] [c])> fabs(a [t] [c]))t = i; // 現在の列の絶対を見つける(fabs(a [t] [c])<eps)が続く場合に最大値を持つ行; forint i = c; i <= n; i ++
        
        
        
        
        )swap(a [t] [i]、a [r] [i]);
        forint i = n; i> = c; i--)a [r] [i] / = a [r] [c]; //(行の最初の数の系数变成1 
        forint i = r + 1 ; i <n; i ++ if(fabs(a [i] [c])> eps)
                 forint j = n ; j> = c; 
                    j -- a [i] [j] -= a [r] [j] * a [i] [c];
        アウト(); 
        r ++ ; 
    } 
    if(r < n)
    { 
        forint i = r; i <n; i ++if(fabs(a [i] [n])> eps)
                 return  2 ; // 未知の数を解かない限り、2つの方程式の後ろの[i] [n]はすべて0でなければなりません。
        return  1 ; // 無数の解<n方程式n未知数(2つの未知数、1つの方程式など)
    } 
    
    
    forint i = n- 1 ; i> = 0 ; i -- forint j = i + 1 ; j <n; j ++ 
            a [i] [n] -= a [i] [j] * a [j] [n]; 
            
    
    return  0 ; 
} 

int main()
{ 
    cin >> n;
    forint i = 0 ; i <n; i ++ forint j = 0 ; j <n + 1 ; j ++ 
            cin >> a [i] [j]; 
    
    int t = gauss(); 
    
    if(t == 0 
    { 
        forint i = 0 ; i <n; i ++)printf(" %.2lf \ n " 、a [i] [n]); 
    } 
    else  if(t == 1)puts(" 無限群解" );
    そうしないとputs(" 解なし" ); 
}
            

係数を入力してください:

3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00 -1.00 -1.00
2.00 7.00

プロセス変数の出力:1.00 0.50 -1.50 -4.50 0.00 1.50 0.50 -1.50       0.00 -0.50  0.50 2.50 


      1.00 0.50 -1.50 -4.50 
      0.00 1.00 0.33 -1.00 
      0.00 0.00 0.67 2.00 

      1.00 0.50 -1.50 -4.50 
      0.00 1.00 0.33 -1.00 
      0.00 0.00 1.00 3.00 

-4.50 
-1.00 
3.00 
マトリックス基本変換ランクのスリー法:
1)行のAによってゼロ以外の数値。
2)特定の2行を入れ替えます
。3)特定の行の倍数を別の行に追加します。(目的は別の行を削除して0にすること
です)ガウスの削除の手順:
1)各列を列挙し、現在の絶対値が最大の行を見つけます。
2)この行を先頭に変更します。
3)以下のすべての行の現在の列列を0に減らします。

結局、上三角になるはずです。
この除去ステップでは、マトリックスの2次元配列を鋭く観察する必要があります。
for(int i = r + 1; i <n; i ++ 
            if(fabs(a [i] [c])> eps)
                for(int j = n; j> = c; j-- 
                    a [i] [j]-= a [r] [j] * a [i] [c];たとえば
、ここでそれは次のことを意味します:0である行rを除く他のすべての行の現在の列cを削除します。数値a [i] [j]は、この行の最初の数値a [i] [c]から差し引かれます(行rの列cの数が1に設定されているため)。前の行を乗算して行a [r] [を比較しますj]各列の番号。
for(int i = n-1; i> = 0; i-- 
        for(int j = i + 1; j <n; j ++ 
            a [i] [n]-= a [i] [j] * a [j] [n];
ここで得られる結果は、各式の最後の1つ、つまり右側の値です:a [i] [n]。左側には、それぞれの未知数を表す結果が1つしかないためです。それぞれが最後の数式の隣に基づいて要素を削除し、値の右側にある1の数字だけ左にヒットすることが結果の目的です。
a [n-1] [n]は最後の未知数の解です。最後から2番目の未知数の値:a [n-2] [n] = a [n-2] [n] -a [n-2] [n-1] * a [n-1] [n]
                               a [i] [n] = a [i] [n] -a [i] [j] * a [j] [n](i:n-1-> 0、j:i + 1->> n- 1)(次の行a [j] [j]はすでに1であるため、この行の次の行の右側にあるa [i] [j] * a [j] [n]の解を引いた値です)

 

おすすめ

転載: www.cnblogs.com/longxue1991/p/12731053.html