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