高斯消元法求解线性方程组
题目
代码
#include<stdio.h>
#include<iostream>
#include <iomanip>
#define MAXN 100
using namespace std;
int main() {
int n;
double b[MAXN];
double a[MAXN][MAXN];
//输入
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n ; j++) {
cin >> a[i][j];
}
cin >> b[i];
}
// 高斯消元法
for (int i = 0; i < n; i++) { // 遍历每行
//判断是否有解
if (a[i][i] == 0) {
cout << "No solution" << endl;
return 0;
}
for (int j = 0; j < i; j++) { // 每行要遍历改行前面的所有行,进行消元
double temp = a[i][j]/a[j][j]; // 事先提出temp避免后续a[i][j]变化
for (int k = 0; k < n; k++) {
a[i][k]=a[i][k]- temp * a[j][k]; // 更新系数
}
b[i] = b[i] - temp * b[j]; // 更新b数组
}
}
// 该段代码输出消元后的阶梯矩阵
//for (int i = 0; i < n; i++) {
// for (int j = 0; j < n; j++) {
// cout << a[i][j] << " ";
// }
// cout << "|" << b[i] << endl;
//}
// 回代
// 由于只需要求值,所以只用更新存储答案的 b[] 数组
for (int i = n-1; i >= 0; i--) {
for (int j = n-1; j > i; j--) {
b[i] -= b[j] * a[i][j];
}
b[i] = b[i] / a[i][i];
if (b[i] < 1.0e-7 && b[i] > -1.0e-7) b[i] = 0; // 用于精度检测,即是否为0
}
// 输出结果
for (int i = 0; i < n; i++) {
cout << fixed << setprecision(2) << b[i] << endl;
}
return 0;
}