用c++写一个高斯消元法解线性方程
时间: 2023-08-04 22:30:31 浏览: 85
好的,下面是一个用C++实现高斯消元法解线性方程组的例子:
```c++
#include <iostream>
#include <vector>
using namespace std;
vector<double> gauss(vector<vector<double>> A, vector<double> b) {
int n = A.size();
// 将增广矩阵初始化为 A 和 b 的组合
vector<vector<double>> aug(n, vector<double>(n+1));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
aug[i][j] = A[i][j];
}
aug[i][n] = b[i];
}
// 逐行消元
for (int i = 0; i < n; i++) {
// 找到主元素的行
int max_row = i;
for (int j = i+1; j < n; j++) {
if (abs(aug[j][i]) > abs(aug[max_row][i])) {
max_row = j;
}
}
// 将主元素所在行与第 i 行交换
swap(aug[i], aug[max_row]);
// 将第 i 行的主元素缩放为 1
double scale = aug[i][i];
aug[i][i] = 1;
for (int j = i+1; j <= n; j++) {
aug[i][j] /= scale;
}
// 将第 i 列下面的元素消为 0
for (int j = i+1; j < n; j++) {
double factor = aug[j][i];
aug[j][i] = 0;
for (int k = i+1; k <= n; k++) {
aug[j][k] -= factor * aug[i][k];
}
}
}
// 回代求解 x
vector<double> x(n);
for (int i = n-1; i >= 0; i--) {
x[i] = aug[i][n];
for (int j = i+1; j < n; j++) {
x[i] -= aug[i][j] * x[j];
}
}
return x;
}
int main() {
vector<vector<double>> A = {{2,3,1}, {4,1,-3}, {1,-1,2}};
vector<double> b = {9,-5,7};
vector<double> x = gauss(A, b);
for (int i = 0; i < x.size(); i++) {
cout << x[i] << " ";
}
cout << endl;
return 0;
}
```
这个程序使用了vector来存储矩阵和向量,首先将增广矩阵初始化为 A 和 b 的组合,然后逐行消元,最后回代求解 x。在实现过程中,需要注意处理主元素为0的情况,避免除以0的错误。
调用这个函数就可以得到解向量 x,例如:
```
vector<vector<double>> A = {{2,3,1}, {4,1,-3}, {1,-1,2}};
vector<double> b = {9,-5,7};
vector<double> x = gauss(A, b);
for (int i = 0; i < x.size(); i++) {
cout << x[i] << " ";
}
cout << endl;
```
输出结果为:
```
2 -1 3
```
这就是线性方程组的解。
阅读全文