[アルゴリズム]ガウスの消去

はじめは、
ロス・バレーに今日プッシュガウス消去テンプレート
ビットを再生すると、ブログの作成
複雑さは、
実際には非常に暴力的なアルゴリズムである
(nは^ 3(\シータ\ )\)
を説明するためのアルゴリズムを
参照しプライマリ数学知識、我々は排除の二つの方法があることを知っている:除去に、排除減算を
除去を達成するために、次にコンピュータには少し複雑なようです
ので、我々は減算除去及びマトリックス・ストレージ・方程式の選択した
栗を:
\(\左\ {\ {行列}始める
右\ \ X + 2Y + 3Z = 0 \\ 4X + 5Y + 6Z = 0 \\ 7X + 8Y + 9Z = 0 \端{行列} \ \} \) 我々はそれを変換しますする
(\左\ {\開始\ &0 \\ 4・5・6・| |&0 \\ 7&8&9&|&0 \端{行列} \右{行列} 1&2&3&に\} \)
定数項用のn + 1つの項目の式のn番目の方程式である
が、それの他の式にどの式除去を選ぶのか?
誤差を最小にするために、我々は最大の方程式の係数を排除することを選びました。
証明:「排除する最大係数式」我々は明らかに大きな方程式の係数の残りをしたい、それについて考えるので、私たちは選択する必要があり
、私たちは私にトランスデューサを置くために、我々はアイテムiを解消したいとし柯をライン(操作しやすい)
、その後、他の項目を排除し、その結果は
、最後の式の最初から最後は前方に一つ一つをもたらし、変数他の値持ち上げ
ヒントを:作業するとき、あなたは自分自身を分けものをすべて排除したい式アイテム
コード

#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long 
#define ld long double

ll read(){
    ll x = 0; int zf = 1; char ch = ' ';
    while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
    if (ch == '-') zf = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
}

ld mat[105][106];
ld res[105];

bool guass(int n){
    int _max;
    for (int i = 0; i < n; ++i){
        _max = i;
        for (int j = i + 1; j < n; ++j)
            if (mat[_max][i] < mat[j][i]) _max = j;
        std::swap(mat[_max], mat[i]);
        ld tmp = mat[i][i];
        if (fabs(tmp) < 1e-8)
            return 0;
        for (int j = i; j <= n; ++j)
            mat[i][j] /= tmp;
        for (int j = i + 1; j < n; ++j){
            tmp = mat[j][i];
            for (int k = i; k <= n; ++k)
                mat[j][k] -= mat[i][k] * tmp;
        }
    }
    res[n - 1] = mat[n - 1][n];
    for (int i = n - 2; i >= 0; --i){
        res[i] = mat[i][n];
        for (int j = i + 1; j < n; ++j)
            res[i] -= res[j] * mat[i][j];
    }
    return 1;
}

int main(){
    int n = read();
    for (int i = 0; i < n; ++i)
        for (int j = 0; j <= n; ++j)
            mat[i][j] = read();
    if (guass(n)){
        for (int i = 0; i < n; ++i)
            printf("%.2Lf\n", res[i]);
    }
    else
        printf("No Solution");
    return 0;
}

おすすめ

転載: www.cnblogs.com/linzhengmin/p/10991617.html