zoukankan      html  css  js  c++  java
  • 浅谈高斯消元

    一.简介

    高斯消元法,我们在线性代数里面的是学过的,它的主要用途是求解n元一次线性方程组。

    举个例子,下面这个就是一个4元一次方程组

     

    我们可以把它化成一个大小为4*5的矩阵

       

    在求解之前,我们首先要了解一下几个线性方程组的基本性质

    1. 矩阵中任意两行交换位置,解不变。
    2. 同一行乘上同一个数,解不变。
    3. 同一行乘上同一个数再加上另一个方程,解不变

    接下来,我们来讲解下具体过程,我们的目的就是完成消元后,对于左边的系数矩阵,每一行都有且只有一个数不为0。具体方法就是用上面的运用上面的原理。具体步骤如下

    1. 枚举每一行,一行一行的处理;
    2. 我们规定第i行存的是xi的解,因为精度问题,我们首先要找出i+1到n里xi最大系数的那一行交换到当前第i行。
    3. 接下来,我们要去消除其他行里的xi,具体做法就是将当前行的xi的系数乘上xj/xi,然后用第j行减去第i行。
    4. 枚举结束后直接输出结果即可。

    二.代码实现

    #define re register
    #define maxn 105
    #define D double
    D a[maxn][maxn];
    for(re int i = 1; i<=n; ++i)
    {
        for(re int j = 1; j<=n+1; ++j)
            scanf("%lf",&a[i][j]);
    }
    for(re int i = 1; i<=n; ++i)
    {
        re int max = i;
        for(re int j =i+1; j<=n; ++j)
        {
            if(fabs(a[j][i])>fabs(a[max][i]))
                max =j;
        }
        for(re int j =1 ; j<=n+1; ++j)
            swap(a[i][j],a[max][j]);
        if(!a[i][i])//如果有一项最大值都为0,则无解
        {
            puts("No Solution");
            return 0;
        }
        for(re int j =1; j<=n+1; ++j)
        {
            if(j!=i)
            {
                re D temp =a[j][i]/a[i][i];
                for(re int k = i+1; k<=n+1; ++k)
                {
                    a[j][k]-=temp*a[i][k];
                }
            }
        }
    
    }
    for(re int i =1; i<=n; ++i)
        printf("%.2lf
    ",a[i][n+1]/a[i][i]);

    三.相关习题

  • 相关阅读:
    【分享】管理的最高境界是简单
    建立市场化风险评估机制推进地方政府信用评级建设
    手游-神雕侠侣 85侠客纪攻略(已通关)
    使用git的分支功能实现定制功能摘取与组合的想法
    组内正则培训记录
    组内Linq培训记录
    一次代码重构记录
    git代码库误操作还原记录
    关于代码重构的开始
    如何管理高手、大牛?
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/12239995.html
Copyright © 2011-2022 走看看