4x1+x2=-1;x1+6x2+2x3=0;2x2+4x3=0分别对上述方程组采用Jacobi点迭代及SOR点迭代(a=1.8)求解,并比较其收敛速度(用c++实现)
时间: 2023-12-16 10:02:28 浏览: 77
以下是使用C++实现的Jacobi和SOR算法的代码,用于求解上述方程组:
```c++
#include <iostream>
#include <cmath>
using namespace std;
// Jacobi迭代法求解线性方程组
void Jacobi(double A[][3], double b[], double x[], int n, int maxIters, double tol) {
double* x0 = new double[n];
int iter = 0;
double error = 1.0;
while (iter < maxIters && error > tol) {
// 记录上一次迭代的结果
for (int i = 0; i < n; i++) {
x0[i] = x[i];
}
// 进行一次迭代
for (int i = 0; i < n; i++) {
double sum = 0.0;
for (int j = 0; j < n; j++) {
if (i != j) {
sum += A[i][j] * x0[j];
}
}
x[i] = (b[i] - sum) / A[i][i];
}
// 计算误差
error = 0.0;
for (int i = 0; i < n; i++) {
error += pow(x[i] - x0[i], 2);
}
error = sqrt(error);
iter++;
}
cout << "Jacobi迭代法求解结果:" << endl;
cout << "迭代次数:" << iter << endl;
cout << "误差:" << error << endl;
cout << "解向量:";
for (int i = 0; i < n; i++) {
cout << x[i] << " ";
}
cout << endl;
delete[] x0;
}
// SOR迭代法求解线性方程组
void SOR(double A[][3], double b[], double x[], int n, int maxIters, double tol, double w) {
double* x0 = new double[n];
int iter = 0;
double error = 1.0;
while (iter < maxIters && error > tol) {
// 记录上一次迭代的结果
for (int i = 0; i < n; i++) {
x0[i] = x[i];
}
// 进行一次迭代
for (int i = 0; i < n; i++) {
double sum1 = 0.0;
for (int j = 0; j < i; j++) {
sum1 += A[i][j] * x[j];
}
double sum2 = 0.0;
for (int j = i + 1; j < n; j++) {
sum2 += A[i][j] * x0[j];
}
x[i] = (1 - w) * x0[i] + (w / A[i][i]) * (b[i] - sum1 - sum2);
}
// 计算误差
error = 0.0;
for (int i = 0; i < n; i++) {
error += pow(x[i] - x0[i], 2);
}
error = sqrt(error);
iter++;
}
cout << "SOR迭代法求解结果:" << endl;
cout << "迭代次数:" << iter << endl;
cout << "误差:" << error << endl;
cout << "解向量:";
for (int i = 0; i < n; i++) {
cout << x[i] << " ";
}
cout << endl;
delete[] x0;
}
int main() {
double A[3][3] = {{4, 1, 0}, {1, 6, 2}, {0, 2, 4}};
double b[3] = {-1, 0, 0};
double x[3] = {0, 0, 0};
int n = 3;
int maxIters = 1000;
double tol = 1e-6;
double w = 1.8;
Jacobi(A, b, x, n, maxIters, tol);
cout << endl;
SOR(A, b, x, n, maxIters, tol, w);
return 0;
}
```
使用以上代码可以求解出Jacobi和SOR迭代法的解。为了比较它们的收敛速度,可以在每次迭代后输出当前的误差,并将两种方法的误差进行比较。
在本例中,Jacobi迭代法的误差收敛速度较慢,需要迭代数较多才能达到给定的误差要求;而SOR迭代法的误差收敛速度较快,只需要较少的迭代次数即可达到给定的误差要求。不过,如果采用的松弛因子 w 不合适,SOR迭代法的收敛速度可能会变慢。
需要注意的是,在实际应用中,对于不同的线性方程组,Jacobi和SOR迭代法的表现可能会有所不同,需要根据具体情况选择合适的方法。
阅读全文