高斯消元法的一点理解><

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

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;
}

 

posted @ 2017-10-10 20:41  lxykk  阅读(2253)  评论(0编辑  收藏  举报