赛德尔迭代法求解线性方程组 c语言代码
时间: 2023-07-29 07:07:31 浏览: 94
下面是使用赛德尔迭代法求解线性方程组的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 1000 // 最大迭代次数
#define TOLERANCE 1e-6 // 精度要求
void gauss_seidel(double **A, double *b, double *x, int n) {
int iter = 0;
double *x_new = (double*) malloc(n * sizeof(double)); // 新的解向量
double error = TOLERANCE + 1; // 初始误差
while (iter < MAX_ITER && error > TOLERANCE) {
error = 0.0;
for (int i = 0; i < n; i++) {
double sum = 0.0;
for (int j = 0; j < i; j++) {
sum += A[i][j] * x_new[j];
}
for (int j = i + 1; j < n; j++) {
sum += A[i][j] * x[j];
}
x_new[i] = (b[i] - sum) / A[i][i];
error += fabs(x_new[i] - x[i]); // 计算误差
x[i] = x_new[i]; // 更新解向量
}
iter++;
}
free(x_new);
if (error > TOLERANCE) {
printf("无法收敛!\n");
} else {
printf("迭代次数:%d\n", iter);
printf("解向量:");
for (int i = 0; i < n; i++) {
printf("%.4f ", x[i]);
}
printf("\n");
}
}
int main() {
int n;
printf("请输入线性方程组的阶数:");
scanf("%d", &n);
double **A = (double**) malloc(n * sizeof(double*));
double *b = (double*) malloc(n * sizeof(double));
double *x = (double*) malloc(n * sizeof(double));
printf("请输入系数矩阵A:\n");
for (int i = 0; i < n; i++) {
A[i] = (double*) malloc(n * sizeof(double));
for (int j = 0; j < n; j++) {
scanf("%lf", &A[i][j]);
}
}
printf("请输入常数向量b:\n");
for (int i = 0; i < n; i++) {
scanf("%lf", &b[i]);
}
printf("请输入初始解向量x(0):\n");
for (int i = 0; i < n; i++) {
scanf("%lf", &x[i]);
}
gauss_seidel(A, b, x, n);
free(x);
free(b);
for (int i = 0; i < n; i++) {
free(A[i]);
}
free(A);
return 0;
}
```
在上面的代码中,我们使用了动态内存分配来定义系数矩阵A、常数向量b和解向量x。在求解过程中,我们通过循环迭代来逼近方程组的解,直到满足一定的精度要求或者达到最大迭代次数为止。最后,我们释放了动态分配的内存,避免了内存泄漏的问题。
阅读全文