ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[算法]高斯消元

2019-06-08 20:38:27  阅读:218  来源: 互联网

标签:ch matrix int ll 算法 include 高斯消 式子


前言
今天被推到洛谷的高斯消元模板
打了一下,并补一篇博客
复杂度
其实是个很暴力的算法
\(\Theta(n^3)\)
算法讲解
参照小学数学知识,我们知道有两种消元的方法:加减消元,带入消元
然计算机实现带入消元貌似有点复杂
所以我们选择加减消元,并且用矩阵存储式子
栗子:
\(\left\{ \begin{matrix} \ \ x + 2y + 3z = 0\\ 4x + 5y + 6z = 0\\ 7x + 8y + 9z = 0 \end{matrix} \right\}\)
我们将它转换成
\(\left\{ \begin{matrix} 1 & 2 & 3 & | & 0\\ 4 & 5 & 6 & | & 0\\ 7 & 8 & 9 & | & 0 \end{matrix} \right\}\)
即第n个式子的第n+1项为该式子的常数项
但是选择哪个式子来消其他式子的元呢?
为了使误差最小,我们选择要消去的项系数最大的式子。
证明:想一下,我们显然希望剩下的式子系数更大,于是就要选择“要消去的项系数最大的式子”
假设我们要消第i项,我们珂以把该式换到第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;
}

标签:ch,matrix,int,ll,算法,include,高斯消,式子
来源: https://www.cnblogs.com/linzhengmin/p/10991617.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有