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


高斯消元法用於討論線性方程組的解。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM