高斯消元
每个方程等号右侧的常数放在最右侧
↓
double a[105][105];
double eps = 1e-7;
//高斯消元
void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n + 1; ++j) {
cin >> a[i][j];
}
}
for (int i = 1; i <= n; ++i) {//枚举列
int max = i;
for (int j = i + 1; j <= n; ++j) {//选择该列最大系数,真实目的是选择一个非0系数
if (fabs(a[j][i]) > fabs(a[max][i]))
max = j;
}
for (int j = 1; j <= n + 1; ++j) {
swap(a[i][j], a[max][j]);//移到前面
}
if (fabs(a[i][i]) < eps) {//对角线上的主元系数等于0,说明没有唯一解
cout << "No Solution" << endl;
return;
}
for (int j = n + 1; j >= 1; j--) {
a[i][j] = a[i][j] / a[i][i];//把这一行的主元系数变为1
}
for (int j = 1; j <= n; ++j) {//消去主元所在列的其他行的主元
if (j != i) {
double temp = a[j][i] / a[i][i];
for (int k = 1; k <= n + 1; ++k) {
a[j][k] -= a[i][k] * temp;
}
}
}
}
for (int i = 1; i <= n; ++i) {//最后得到简化阶梯矩阵
cout << fixed << setprecision(2) << a[i][n + 1] << endl;
}
}
Last updated