C++实现sor迭代法
时间: 2024-05-05 22:22:06 浏览: 33
SOR(Successive Over-Relaxation)迭代法是一种求解线性方程组的方法,它是Jacobi迭代法的改进。相比于Jacobi迭代法,SOR迭代法收敛速度更快。以下是C++实现SOR迭代法的代码:
```c++
#include<iostream>
#include<cmath>
using namespace std;
const int N = 100;
const double eps = 1e-6;
double a[N][N], b[N], x[N], y[N];
int n;
void SOR(double w)
{
int k = 0;
double norm = 0, sum = 0;
do
{
for(int i = 0; i < n; i++)
{
sum = 0;
for(int j = 0; j < n; j++)
{
if(i != j) sum += a[i][j] * x[j];
}
y[i] = (1 - w) * x[i] + w * (b[i] - sum) / a[i][i];
}
norm = fabs(x[0] - y[0]);
for(int i = 0; i < n; i++)
{
if(fabs(x[i] - y[i]) > norm) norm = fabs(x[i] - y[i]);
x[i] = y[i];
}
k++;
}while(norm > eps && k < 1000);
}
int main()
{
cout << "请输入方程组的个数:";
cin >> n;
cout << "请依次输入方程组的系数矩阵和常数向量:" << endl;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> a[i][j];
}
cin >> b[i];
}
cout << "请输入松弛因子w:";
double w;
cin >> w;
for(int i = 0; i < n; i++) x[i] = 0;// 初始化x向量
SOR(w);
cout << "方程组的解为:" << endl;
for(int i = 0; i < n; i++)
{
cout << "x" << i + 1 << " = " << x[i] << endl;
}
return 0;
}
```
这里的输入包括方程组的个数、系数矩阵和常数向量,以及松弛因子w。其中,松弛因子w的选择对SOR方法的收敛速度有影响,通常情况下,选择w=1.25左右可以取得较好的效果。