复数矩阵 逐次超松弛(SOR)迭代法 C代码
时间: 2023-08-06 10:24:42 浏览: 86
以下是使用SOR方法求解复数矩阵的线性方程组的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100
void SOR_method(double A[][MAX], double b[], double x[], int n, double omega, double tol, int max_iter)
{
int i, j, k, iter;
double sum, diff, norm_b, norm_diff, w;
double x_old[MAX];
norm_b = 0.0;
for (i = 0; i < n; i++) {
norm_b += b[i] * b[i];
x[i] = 0.0;
}
norm_b = sqrt(norm_b);
for (iter = 1; iter <= max_iter; iter++) {
norm_diff = 0.0;
for (i = 0; i < n; i++) {
x_old[i] = x[i];
sum = 0.0;
for (j = 0; j < n; j++) {
if (j != i) {
sum += A[i][j] * x[j];
}
}
x[i] = (1 - omega) * x_old[i] + omega / A[i][i] * (b[i] - sum);
diff = fabs(x[i] - x_old[i]);
if (diff > norm_diff) {
norm_diff = diff;
}
}
if (norm_diff / norm_b < tol) {
printf("The SOR method converges after %d iterations.\n", iter);
return;
}
}
printf("The SOR method does not converge within %d iterations.\n", max_iter);
}
int main()
{
double A[MAX][MAX], b[MAX], x[MAX];
int n, i, j;
double omega, tol;
int max_iter;
printf("Enter the order of the matrix: ");
scanf("%d", &n);
printf("Enter the matrix A:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("A[%d][%d] = ", i, j);
scanf("%lf", &A[i][j]);
}
}
printf("Enter the vector b:\n");
for (i = 0; i < n; i++) {
printf("b[%d] = ", i);
scanf("%lf", &b[i]);
}
printf("Enter the initial guess x:\n");
for (i = 0; i < n; i++) {
printf("x[%d] = ", i);
scanf("%lf", &x[i]);
}
printf("Enter the relaxation parameter omega: ");
scanf("%lf", &omega);
printf("Enter the tolerance: ");
scanf("%lf", &tol);
printf("Enter the maximum number of iterations: ");
scanf("%d", &max_iter);
SOR_method(A, b, x, n, omega, tol, max_iter);
printf("The solution is:\n");
for (i = 0; i < n; i++) {
printf("x[%d] = %lf\n", i, x[i]);
}
return 0;
}
```
其中,`A`为复数系数矩阵,`b`为复数常数向量,`x`为复数未知向量,`n`为矩阵的阶数,`omega`为松弛因子,`tol`为允许误差,`max_iter`为最大迭代次数。