SOR迭代解线性方程C语言
时间: 2023-12-05 09:41:50 浏览: 69
以下是使用C语言实现SOR迭代解线性方程的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 1000 // 最大迭代次数
#define TOL 1e-6 // 迭代精度
void sor(double **A, double *b, double *x, int n, double w) {
int i, j, k;
double sum;
for (k = 0; k < MAX_ITER; k++) {
for (i = 0; i < n; i++) {
sum = 0.0;
for (j = 0; j < n; j++) {
if (j != i) {
sum += A[i][j] * x[j];
}
}
x[i] = (1 - w) * x[i] + w * (b[i] - sum) / A[i][i];
}
// 判断迭代是否收敛
double err = 0.0;
for (i = 0; i < n; i++) {
sum = 0.0;
for (j = 0; j < n; j++) {
sum += A[i][j] * x[j];
}
err += fabs(sum - b[i]);
}
if (err < TOL) {
printf("Converged after %d iterations.\n", k + 1);
return; }
}
printf("Failed to converge after %d iterations.\n", MAX_ITER);
}
int main() {
int n = 3; // 矩阵维数
double **A = (double **)malloc(n * sizeof(double *));
for (int i = 0; i < n; i++) {
A[i] = (double *)malloc(n * sizeof(double));
}
double *b = (double *)malloc(n * sizeof(double));
double *x = (double *)malloc(n * sizeof(double));
// 初始化矩阵和向量
A[0][0] = 4.0; A[0][1] = -1.0; A[0][2] = 0.0;
A[1][0] = -1.0; A[1][1] = 4.0; A[1][2] = -1.0;
A[2][0] = 0.0; A[2][1] = -1.0; A[2][2] = 4.0;
b[0] = 15.0; b[1] = 10.0; b[2] = 10.0;
for (int i = 0; i < n; i++) {
x[i] = 0.0;
}
double w = 1.25; // 松弛因子
sor(A, b, x, n, w);
// 输出结果
printf("Solution:\n");
for (int i = 0; i < n; i++) {
printf("%f\n", x[i]);
}
// 释放内存
for (int i = 0; i < n; i++) {
free(A[i]);
}
free(A);
free(b);
free(x);
return 0;
}
```