zoukankan      html  css  js  c++  java
  • 高斯消元法的一点理解><

    高斯消元法用于讨论线性方程组的解。

    1、概念

    齐次线性方程组:所有方程的常数项均为0

    非齐次线性方程组:方程的常数项不均为0

    线性方程组的各项系数构成系数矩阵

    线性方程组的各项系数和常数项构成增广矩阵

    注:齐次线性方程组有零解和非零解。未知量取值不全为0,称之为非零解。故齐次线性方程组必定有解,而非齐次线性方程组存在唯一解,无解,无数解三种情况。

    2、核心

    通过矩阵初等行变换,将增广矩阵变换为阶梯性矩阵,再将矩阵转换为方程组逐步带回,得到原方程的解的过程叫高斯消元法。

    3、线性方程组解的判定

    定义增广矩阵的秩r(A B),系数矩阵的秩r(A);

    推论一:线性方程组有解的充要条件:r(A B)=r(A);

    推论二:线性方程组有唯一解的充要条件:r(A B)=r(A)=n;

    推论三:线性方程组有无数解的充要条件:r(A B)=r(A)<n;

    对于齐次线性方程组r(A B)!=r(A),方程组只有零解。

    对于非齐次线性方程组r(A B)!=r(A),方程组无解。

    注:用列中最大元素当作主元能减小答案误差

    4、模板:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include <stdlib.h>
    #define dd double
    using namespace std;
    int n;
    dd a[110][110],ans[110];
    void kk()//阶梯性矩阵
    {
        for(int m=1;m<=n;m++)
        {
        int p=m;
        for(int i=m+1;i<=n;i++)//选取列中最大系数当作主元
            if(a[i][m]>a[p][m])p=i;
        if(p!=m)swap(a[p],a[m]);//交换行
        if(a[m][m]==0){puts("No Solution");exit(0);}
        for(int i=m+1;i<=n;i++)
        {
            dd mul=-a[i][m]/a[m][m];
            for(int j=m;j<=n+1;j++)
            a[i][j]+=a[m][j]*mul;
        }
        }
        for(int m=n;m>=1;m--)
        {
        for(int i=n;i>=m-1;i--)
            a[m][n+1]-=ans[i]*a[m][i];
        ans[m]=a[m][n+1]/a[m][m];
        }
        for(int i=1;i<=n;i++)printf("%.2f\n",ans[i]);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);
        kk();
        return 0;
    }
  • 相关阅读:
    汉语-词语:什么
    汉语-词语:甚么
    汉语-汉字:心
    汉语-词汇:头脑
    汉语-词语:冰冷
    汉语-词汇:冷静
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    两个int类型的数据相加,有可能会出现超出int的表示范围。
    成员变量与局部变量的区别_
    函数额基本概述
  • 原文地址:https://www.cnblogs.com/lxykk/p/7647722.html
Copyright © 2011-2022 走看看