c++写高斯赛德尔迭代法
时间: 2024-10-10 12:02:50 浏览: 33
高斯-塞德尔迭代法是一种数值线性代数方法,用于求解线性方程组。在C++中,你可以按照以下步骤编写一个简单的版本:
```cpp
#include <iostream>
#include <vector>
// 定义系数矩阵和常数向量
std::vector<std::vector<double>> matrix(double** a, int n) {
std::vector<std::vector<double>> mat(n, std::vector<double>(n));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
mat[i][j] = a[i][j];
}
}
return mat;
}
std::vector<double> const_vector(double* b, int n) {
std::vector<double> vec(n);
for (int i = 0; i < n; ++i) {
vec[i] = b[i];
}
return vec;
}
// 高斯-塞德尔迭代函数
void gauss_seidel(std::vector<double>& x, double** a, double* b, double tol, int max_iter) {
int n = x.size();
double delta;
for (int iter = 0; iter < max_iter; ++iter) {
delta = 0;
for (int i = 1; i < n; ++i) {
double sum = 0;
for (int j = 0; j < i; ++j) {
sum += a[i][j] * x[j];
}
sum += a[i][i]; // 自身项
x[i] = (b[i] - sum) / a[i][i];
if (abs(x[i] - x[i - 1]) > delta) {
delta = abs(x[i] - x[i - 1]);
}
}
if (delta <= tol) {
break;
}
}
// 输出最终解
for (double& value : x) {
std::cout << value << " ";
}
std::cout << "\n";
}
int main() {
int n = 3;
double** a = {{4, -1, 0}, {-1, 5, -1}, {0, -1, 2}};
double* b = {6, 8, 10};
std::vector<double> initial_guess(n, 0); // 初始猜测设为零
double tolerance = 1e-6;
int max_iterations = 100;
gauss_seidel(initial_guess, a, b, tolerance, max_iterations);
return 0;
}
```
这个程序首先定义了矩阵和向量的生成函数,然后实现了一个`gauss_seidel`函数,该函数通过循环计算每个变量的值并更新。当迭代满足给定的容忍度或者达到最大迭代次数时,停止迭代并输出结果。
阅读全文