高斯消元

高斯消元法解线性方程组

高斯消元的目的是将矩阵变为上三角矩阵

  1. 选定未被选择过的、xi项系数绝对值最大的一行(这样更加容易判断是否有解),将整个式子除以xi的系数(xi系数化为1)。同时将其交换至第i行(方便求解)

  2. 将未被选择过的行中的该项全部按照系数相应的减去选定的那行的系数(剩下的其他行xi系数化为0)

    当所有行都选定过时,已经构成了上三角

  3. 倒序求解,每次将常数减去已经求出的所有项的解,此时可以求出当前项的解(将已知解带入求未知解)最后依次输出即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
gao'si
*/
int n;cin>>n;
vector<vector<double>>g(n+1,vector<double>(n+2));
for(int i=1;i<=n;i++){
for(int j=1;j<=n+1;j++){
cin>>g[i][j];
}
}
auto Gauss=[&](){
for(int i=1;i<=n;i++){
int now=i;
for(int j=i+1;j<=n;j++){
if(fabs(g[now][i])<fabs(g[j][i])){
now=j;//找出当前项系数的绝对值的最大值
}
}
for(int j=i;j<=n+1;j++){//将其放在对应的行,方便计算
swap(g[now][j],g[i][j]);
}
if(abs(g[i][i]-0.0)<1e-4){
//如果此时绝对值最大系数已经为0
//则证明此方程组无解
cout<<"No Solution"<<"\n";
exit(0);
//此处写return只是退出函数
}
for(int j=i+1;j<=n+1;++j){
//将系数化为1
g[i][j]/=g[i][i];
}
g[i][i]=1;
for(int j=i+1;j<=n;j++){
//在其他式子中将此项系数化为0
for(int k=i+1;k<=n+1;k++){
g[j][k]-=g[j][i]*g[i][k];
}
g[j][i]=0;
}
}
};
Gauss();
for(int i=n;i>=1;--i){
//倒着求解即可
for(int j=i+1;j<=n;++j){
//减去后面所有已经求出解的值
g[i][n+1]-=g[i][j]*g[j][n+1];
g[i][j]=0;
}
g[i][n+1]/=g[i][i]; //只剩下当前的未知量以及常数量(其实没必要除,因为已经是1了)
g[i][i]=1;
}
for(int i=1;i<=n;i++){
cout<<fixed<<setprecision(2)<<g[i][n+1]<<"\n";
}

Welcome to my other publishing channels

Powered By Valine
v1.5.2