[알고리즘] 가우시안 제거

머리말
로스 밸리에 오늘 밀어 가우스 소거법 템플릿 .
조금 플레이 블로그 만들기
복잡성은
실제로 매우 폭력적인 알고리즘이다
(N ^ 3 (\ 세타 \ ) \)
설명하는 알고리즘을
참조초등 수학지식, 우리가 제거하는 두 가지 방법이 있다는 것을 알고 제거 공제, 제거에
다음 컴퓨터에 제거를 달성하기 위해 복잡 조금 보인다
그래서 우리는 뺄셈 제거 및 매트릭스 스토리지 방정식 선택
: 밤을
\ (\ 왼쪽 \ {\ {행렬} 시작
바로 \ \ X + 2Y + 3Z = 0 \\ 4 배 + 5Y + 6Z = 0 \\ 7 배 + 8Y + 9Z = 0 \ 끝 {행렬} \ \} \) 우리는 그것을 변환 하기
(\ 좌측 \ {\ 시작 \ & 0 \\ 4 5 6 | | & 0 \\ 7 8 9 | & 0 \ {단부 매트릭스} \ {오른쪽 행렬} 1, 2 및 3을 \} \)
이 일정 기간 동안 제 n + 1 상품 식의 n 차 방정식은
있지만 다른 수식 제거되는 수식을 선택 하는가?
에러를 최소화하기 위해 큰 방정식 계수가 제거되도록 선택했다.
증명 : 우리는 분명 더 큰 방정식 계수의 나머지 부분을 원하는 그것에 대해 생각 그래서 우리는 "최대 계수 식 제거 할"를 선택해야한다
우리는 내가, 애 우리가 전에 트랜스 듀서를 넣어 항목을 제거한다고 가정 라인 (쉽게 조작 할)
다음 다른 항목을 제거하고, 그 결과
하나 앞으로 하나 가져 마지막 표현식의 시작에서 마지막 변수 다른 값을 올리
팁 : 작업 할 때, 당신이 원하는 수식 자체를 나눈 모든 것을 제거하기를 항목
코드

#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