[科技点] 高斯消元
对于方程
可以通过高斯消元求解。
其实如果手解这个方程还是很简单的,但是程序并不会手解,所以就得用通用方法来解这种方程。先看样例:
首先转化成矩阵
然后从小到大枚举列,先到第一列,找到这一列最大的系数
然后进行方程之间的加减,根据系数获得一个比值,让第
然后接着继续下去,依次消去第二项的系数,第三项的系数,就最后可以得到一个之和一个
要注意寻找最大系数的那一步只能从没做过的行中来选,不然会打乱最后的答案矩阵,这就不好了。但是进行相减消元的时候还是得减到处理过的行里去,这样可以消去方里还不为零的系数,主要是能对常数项做出贡献,最后得出答案。
关于无解:只要一列还没有做过的出现了全
P3389 【模板】高斯消元法
#include <bits/stdc++.h>
using namespace std;
#define esp 1e-15
int n;
double a[107][107];
void Gauss() {
for (int i = 1; i <= n; ++i) {
int p = i;
for (int j = i + 1; j <= n; ++j)
if (fabs(a[j][i]) > fabs(a[j][p]))
p = j;
if (-esp < a[i][i] && a[i][i] < esp) {
puts("No Solution");
return ;
}
for (int j = 1; j <= n + 1; ++j)
swap(a[i][j], a[p][j]);
for (int j = 1; j <= n; ++j) {
if (i == j) continue;
double t = a[j][i] / a[i][i];
for (int k = i; k <= n + 1; ++k)
a[j][k] -= a[i][k] * t;
}
}
for (int i = 1; i <= n; ++i)
printf("%.2f\n", a[i][n + 1] / a[i][i]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n + 1; ++j)
scanf("%lf", &a[i][j]);
Gauss();
return 0;
}