高斯消元法用於討論線性方程組的解。
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; }