C++实现sor迭代法
时间: 2024-05-07 15:20:22 浏览: 97
SOR.zip_SOR迭代法c++
SOR迭代法(Successive Over-Relaxation Method)是求解线性方程组的一种迭代法,适用于系数矩阵为对称正定的情况。下面是使用C++实现SOR迭代法的示例代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 100; // 矩阵维度的最大值
const double TOL = 1e-6; // 精度要求
const double OMEGA = 1.5; // 松弛因子
int n; // 矩阵维度
double a[MAXN][MAXN]; // 系数矩阵
double b[MAXN]; // 右端向量
double x[MAXN]; // 解向量
// SOR迭代法求解线性方程组
void SOR(double omega)
{
int k = 0; // 迭代次数
double norm; // 两次迭代解的差的范数
do {
norm = 0;
for (int i = 1; i <= n; i++) {
double sum = 0;
for (int j = 1; j <= n; j++) {
if (j != i) {
sum += a[i][j] * x[j];
}
}
double tmp = (b[i] - sum) / a[i][i];
x[i] = (1 - omega) * x[i] + omega * tmp;
norm += pow(tmp, 2);
}
k++;
} while (sqrt(norm) >= TOL && k < 10000);
cout << "迭代次数:" << k << endl;
}
int main()
{
// 输入矩阵维度和系数矩阵、右端向量
cout << "请输入矩阵维度:";
cin >> n;
cout << "请输入系数矩阵:" << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
cout << "请输入右端向量:" << endl;
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
// 调用SOR迭代法求解线性方程组
SOR(OMEGA);
// 输出解向量
cout << "解向量为:" << endl;
for (int i = 1; i <= n; i++) {
cout << x[i] << " ";
}
cout << endl;
return 0;
}
```
在这个示例代码中,我们可以输入矩阵维度、系数矩阵和右端向量,然后调用SOR函数求解线性方程组。SOR函数中,我们使用了一个do-while循环,每次迭代计算更新解向量,并计算两次迭代解的差的范数,如果满足精度要求或者迭代次数达到一定值,则停止迭代。在每次迭代中,我们使用了松弛因子来加速收敛。最后,我们输出求解结果。
需要注意的是,SOR迭代法需要系数矩阵为对称正定矩阵,否则可能会出现不收敛的情况。此外,在实际应用中,还需要对松弛因子进行一定的调整,以获得更好的收敛效果。
阅读全文