数值分析高斯消去法C++
时间: 2024-12-27 15:14:58 浏览: 6
### C++ 实现高斯消元法
对于数值分析中的线性方程组求解,高斯消元法是一种经典的方法。该方法通过一系列操作将增广矩阵转换成上三角矩阵,从而简化最终的回代过程来获得解向量。
下面是一个简单的 C++ 程序用于执行高斯消元并解决给定的 n×n 方阵对应的线性系统:
```cpp
#include <iostream>
#include <vector>
using namespace std;
void gaussianElimination(vector<vector<double>>& A, vector<double>& b) {
int n = A.size();
for (int i = 0; i < n; ++i) { // 对每一列做处理
double maxElement = abs(A[i][i]);
int maxRow = i;
// 寻找当前列的最大元素所在的行
for (int k = i + 1; k < n; ++k) {
if (abs(A[k][i]) > maxElement) {
maxElement = abs(A[k][i]);
maxRow = k;
}
}
// 如果最大元素接近于零,则认为行列式为零,即无唯一解
if (maxElement < 1e-9) throw "Singular matrix";
// 将找到的最大行与第 i 行交换位置
swap(A[maxRow], A[i]);
swap(b[maxRow], b[i]);
// 使用选定的主元消除其他行对应的位置上的数
for (int j = i + 1; j < n; ++j) {
double factor = A[j][i] / A[i][i];
for (int k = i; k < n; ++k) {
A[j][k] -= factor * A[i][k];
}
b[j] -= factor * b[i];
}
}
}
// 解决上三角形系统的函数
void backSubstitution(const vector<vector<double>>& U, const vector<double>& y, vector<double>& x) {
int n = U.size();
for (int i = n - 1; i >= 0; --i) {
double sum = 0.0;
for (int j = i + 1; j < n; ++j) {
sum += U[i][j] * x[j];
}
x[i] = (y[i] - sum) / U[i][i];
}
}
```
此程序实现了两个主要部分:`gaussianElimination()` 函数负责创建一个上三角形式的系数矩阵 `A` 和右侧常数项 `b`; 而 `backSubstitution()` 则用来计算实际的结果向量 `x`.
为了使这段代码能够正常工作,在调用上述任一功能之前还需要初始化输入数据(即填充好相应的二维数组 `A` 及其右边的一维数组 `b`) 并分配适当大小的空间给输出参数 `x`. 此外需要注意的是这里假设了传入的数据总是有一个唯一的解决方案;如果遇到奇异矩阵的情况则会抛出异常提示用户[^1].
阅读全文