高斯赛德尔迭代法c语言
时间: 2023-07-03 21:25:19 浏览: 96
高斯赛德尔迭代法是一种求解线性方程组的迭代方法,可以用于求解大型稀疏矩阵的线性方程组。下面是一个用 C 语言实现的高斯赛德尔迭代法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 1000 // 最大迭代次数
#define TOLERANCE 0.0001 // 迭代精度
int main()
{
int n; // 矩阵维数
double **A; // 系数矩阵
double *b; // 常数向量
double *x; // 解向量
double *x0; // 初始解向量
double *r; // 残量向量
double norm_r; // 残量的模
int iter; // 迭代次数
int i, j;
// 输入矩阵维数
printf("Enter the matrix dimension n: ");
scanf("%d", &n);
// 分配内存
A = (double **)malloc(n * sizeof(double *));
for (i = 0; i < n; i++) {
A[i] = (double *)malloc(n * sizeof(double));
}
b = (double *)malloc(n * sizeof(double));
x = (double *)malloc(n * sizeof(double));
x0 = (double *)malloc(n * sizeof(double));
r = (double *)malloc(n * sizeof(double));
// 输入矩阵
printf("Enter the matrix A:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%lf", &A[i][j]);
}
}
// 输入常数向量
printf("Enter the vector b:\n");
for (i = 0; i < n; i++) {
scanf("%lf", &b[i]);
}
// 输入初始解向量
printf("Enter the initial vector x0:\n");
for (i = 0; i < n; i++) {
scanf("%lf", &x0[i]);
}
// 迭代求解
iter = 0;
do {
// 更新解向量
for (i = 0; i < n; i++) {
x[i] = b[i];
for (j = 0; j < n; j++) {
if (i != j) {
x[i] -= A[i][j] * x0[j];
}
}
x[i] /= A[i][i];
}
// 计算残量
norm_r = 0;
for (i = 0; i < n; i++) {
r[i] = b[i];
for (j = 0; j < n; j++) {
r[i] -= A[i][j] * x[j];
}
norm_r += r[i] * r[i];
}
norm_r = sqrt(norm_r);
// 更新初始解向量
for (i = 0; i < n; i++) {
x0[i] = x[i];
}
// 增加迭代次数
iter++;
// 检查迭代精度和迭代次数
} while (norm_r > TOLERANCE && iter < MAX_ITER);
// 输出解向量和迭代次数
printf("The solution is:\n");
for (i = 0; i < n; i++) {
printf("%lf\n", x[i]);
}
printf("Number of iterations: %d\n", iter);
// 释放内存
for (i = 0; i < n; i++) {
free(A[i]);
}
free(A);
free(b);
free(x);
free(x0);
free(r);
return 0;
}
```
注意,这只是一个简单的示例代码,可能不能处理所有可能的情况。在实际使用中,您需要根据具体情况进行适当的修改和优化。
阅读全文