高斯消元学习笔记
概述 & 用法
高斯消元就是一种解方程的方法
现在有个n个方程,n个未知数组成的方程组:
\(a_{i,1}*x_1+a_{i,2}*x_1...+a_{i,n}*x_n=b_i\)
.
.
.
然后我们把系数都拿出来组成一个 \(n*(n+1)\) 的矩阵
接下来就是消消消
具体方法:
按列消除,目标是矩阵中只剩下 \(a_{i,i}\) ,其余元素皆为0
枚举每一列 i
找到这列中最大的元素,将该行与第i行整体调换一下
然后将第i行所有元素除以 \(a_{i,i}\),使得 \(a_{i,i}==1\)
再将其余行每一行都减掉第i行乘一个常数,使得第i列除 \(a_{i,i}\) 外都为0
最后剩下的第 n+1 列就是每个未知数的值
代码
#define db double
db a[1001][1001];
void solve()
{
for(int i=1;i<=n;i++)
{
int maxx=i;
for(int j=i+1;j<=n;j++) if(a[j][i]>a[maxx][i]) maxx=j;
for(int j=i;j<=n+1;j++) swap(a[i][j],a[maxx][j]);
if(!a[i][i]) {
cout<<"YZHX"<<endl;
}
for(int j=i+1;j<=n+1;j++) a[i][j]/=a[i][i];
a[i][i]=1;
for(re int j=1;j<=n;j++)
{
if(i==j) continue;
int k=a[j][i]/a[i][i];
for(re int p=i;p<=n+1;p++)
a[j][p]=a[j][p]-a[i][p]*k;
}
}
return ;
}
嗯,就这样了...