利用高斯法求解线性方程组C++
时间: 2023-07-11 18:39:19 浏览: 112
高斯消元法是求解线性方程组的常用方法,基本思想是通过初等变换将系数矩阵化为上三角矩阵,再通过回代求解出未知数的值。
以下是一个求解 n 元线性方程组 Ax = b 的 C++ 代码:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
const double eps = 1e-10;
vector<double> solve(vector<vector<double>> A, vector<double> b) {
int n = A.size();
for (int i = 0; i < n; i++) {
// 将主元素归一
double div = A[i][i];
for (int j = i; j < n; j++) {
A[i][j] /= div;
}
b[i] /= div;
// 消元
for (int j = i + 1; j < n; j++) {
double mul = A[j][i];
for (int k = i; k < n; k++) {
A[j][k] -= mul * A[i][k];
}
b[j] -= mul * b[i];
}
}
// 回代求解
vector<double> x(n);
for (int i = n - 1; i >= 0; i--) {
x[i] = b[i];
for (int j = i + 1; j < n; j++) {
x[i] -= A[i][j] * x[j];
}
}
return x;
}
int main() {
int n;
cout << "请输入方程组的元数:";
cin >> n;
cout << "请输入系数矩阵 A 和常数向量 b:" << endl;
vector<vector<double>> A(n, vector<double>(n));
vector<double> b(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> A[i][j];
}
cin >> b[i];
}
vector<double> x = solve(A, b);
cout << "方程的解为:";
for (int i = 0; i < n; i++) {
if (abs(x[i]) < eps) x[i] = 0.0;
cout << x[i] << " ";
}
cout << endl;
return 0;
}
```
该代码先通过高斯消元将系数矩阵 A 和常数向量 b 化为上三角矩阵,然后再通过回代求解出未知数的值。注意在回代过程中需要将解向量 x 的值从后往前计算。
需要注意的是,高斯消元法有一些特殊情况需要处理,如主元素为 0,系数矩阵不可逆等情况。此外,由于浮点数的舍入误差,当系数矩阵的某个元素非常小的时候,可能会导致精度问题。因此,一些实际应用中可能需要使用更加稳定的方法,如 LU 分解、Cholesky 分解等。
阅读全文