求解线性代数方程组的直接法C++
时间: 2024-08-13 19:07:45 浏览: 44
在C++中,求解线性代数方程组通常使用高斯-约旦消元法(Gaussian Elimination)或LU分解法等直接法。这些方法在处理小到中等规模的矩阵时效率较高,因为它们不需要迭代,而是通过一系列精确的计算步骤得到解。
以下是使用C++实现高斯-约旦消元法的一个简单示例:
```cpp
#include <iostream>
#include <vector>
// 用于存储矩阵的结构体
struct Matrix {
int rows, cols;
std::vector<std::vector<double>> data;
};
// 高斯-约旦消元函数
std::vector<double> gauss_jordan(const Matrix& A, const std::vector<double>& b) {
std::vector<double> x(A.cols);
for (int i = 0; i < A.rows; ++i) {
if (i == 0)
continue;
// 对当前行进行消元
for (int j = i; j < A.cols; ++j) {
double factor = A.data[i][j] / A.data[j];
for (int k = 0; k <= A.rows; ++k)
A.data[i][k] -= factor * A.data[k]; // 用主元替换元素
}
// 将当前行的解加到结果向量中
for (int j = 0; j < A.cols; ++j)
x[j] += A.data[i][j];
}
// 回带求解
for (int i = A.rows - 1; i >= 0; --i) {
for (int j = 0; j < i; ++j)
x[j] -= A.data[i][j] / A.data[i][i] * x[i];
x[i] /= A.data[i][i]; // 消除分母为0的情况
}
return x;
}
int main() {
Matrix A = {{2, 1, -1}, {1, 3, 2}, {4, -1, 3}};
std::vector<double> b = {1, 2, 3};
// 检查矩阵是否可逆
if (A.data == 0) {
std::cout << "矩阵不可逆!" << std::endl;
return 1;
}
std::vector<double> solution = gauss_jordan(A, b);
for (int i = 0; i < solution.size(); ++i)
std::cout << "x_" << i << " = " << solution[i] << std::endl;
return 0;
}
```
阅读全文