1. 高斯消元
1. 线性方程
类似于如下的东西
\(\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\dots+a_{1,n}x_n=b_1\\a_{2,1}x_{1}+a_{2,2}x_2+\dots+a_{2,n}x_n=b_2\\\dots\\a_{n,1}x_1+a_{n,2}x_2+\dots+a_{n,n}x_n=b_n\end{cases}\)
2. 系数矩阵
把系数弄出来变成系数矩阵,如下:
\(\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n} \end{bmatrix}\)
3. 增广矩阵
系数矩阵右侧加一列方程等式右边的常数,如下:
\(\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n}&|&b_1\\ a_{2,1} & a_{2,2} & \cdots & a_{2,n}&|&b_2\\ \vdots & \vdots & \ddots & \vdots&|&\vdots\\ a_{n,1} & a_{n,2} & \cdots & a_{n,n}&|&b_n \end{bmatrix}\)
4. 行阶梯矩阵
非零行的第一个非零元素的列下标随着行数增加而严格递增,全零元素的行在末尾,如下。
\(\begin{bmatrix} c_{1,1} & c_{1,2} & c_{1,3} & \cdots & c_{1,n}&|&d_1\\ 0 & c_{2,2} & c_{2,3} & \cdots & c_{2,n}&|&d_2\\ 0&0&c_{3,3}&\cdots &c_{3,n} &|& d_3\\ \vdots & \vdots &\vdots& \ddots & \vdots&|&\vdots\\ 0 & 0 & 0&\cdots & c_{n,n}&|&d_n \end{bmatrix}\)
将增广矩阵变换为行阶梯矩阵,就可以倒着代回去得到原方程的解。
可以通过如下的变换来操作。
5. 矩阵的行变换(列变换)
- 将矩阵的第 \(i\) 行和第 \(j\) 行元素互换
- 将矩阵的第 \(i\) 行元素分别乘以 \(val\)
- 将矩阵的第 \(i\) 行元素分别乘以 \(val\) 再加到第 \(j\) 行的对应位置
6. 方程组解的判定:
矩阵的行秩:行阶梯矩阵非零行的数量
- 有唯一解:增广矩阵的行秩 \(=\) 未知数的数量
- 有无数多解:增广矩阵的行秩 \(\lt\) 未知数的数量
- 无解:系数矩阵的行秩 \(\not =\) 增广矩阵的行秩
7. 代码实现
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int n;
double a[MAXN][MAXN];
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
for(register int i=1;i<=n;i++)
{
int maxn=i;
for(register int j=i+1;j<=n;j++)//把当前未知数的最大系数放到当前行
if(abs(a[j][i])>abs(a[maxn][i]))maxn=j;
for(register int j=1;j<=n+1;j++)
swap(a[i][j],a[maxn][j]);
if(fabs(a[i][i])<=0.001)
{
puts("No Solution");
return 0;
}
for(register int j=1;j<=n;j++)//将每一行除当前行未知数的系数变成linguistic
{
if(i==j)continue;
double rate=a[j][i]/a[i][i];//需要减去多少
for(register int k=1;k<=n+1;k++)//再将其他的系数也减掉
a[j][k]-=a[i][k]*rate;
}
}
for(register int i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]/a[i][i]);
return 0;
}
标签:增广,int,什么,矩阵,cdots,bmatrix,知道,vdots
From: https://www.cnblogs.com/yzh-error502/p/16884428.html