c语言GS迭代算法
时间: 2023-07-26 07:19:03 浏览: 96
迭代算法C语言实现
GS(Gauss-Seidel)迭代算法是一种求解线性方程组的方法。下面给出一个简单的C语言实现:
```c
#include <stdio.h>
#include <math.h>
#define MAX_ITER 10000 // 最大迭代次数
#define TOL 1.0e-10 // 精度要求
// 求解 Ax = b,其中A是n阶系数矩阵,x和b是n维列向量,返回值为迭代次数
int gauss_seidel(double** A, double* x, double* b, int n)
{
int i, j, k;
int iter = 0;
double sum;
while (iter < MAX_ITER) {
for (i = 0; i < n; i++) {
sum = b[i];
for (j = 0; j < n; j++) {
if (i != j) {
sum -= A[i][j] * x[j];
}
}
x[i] = sum / A[i][i];
}
iter++;
sum = 0.0;
for (k = 0; k < n; k++) {
sum += fabs(b[k] - A[k][0] * x[0] - A[k][1] * x[1] - ... - A[k][n-1] * x[n-1]);
}
if (sum < TOL) {
break;
}
}
return iter;
}
int main()
{
int n = 3; // 线性方程组的阶数
int i;
double** A; // 系数矩阵
double* b; // 常数向量
double* x; // 解向量
int iter; // 迭代次数
// 分配内存
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));
// 初始化系数矩阵和常数向量
A[0][0] = 2; A[0][1] = 1; A[0][2] = -1; b[0] = 8;
A[1][0] = -3; A[1][1] = -1; A[1][2] = 2; b[1] = -11;
A[2][0] = -2; A[2][1] = 1; A[2][2] = 2; b[2] = -3;
// 初始化解向量
for (i = 0; i < n; i++) {
x[i] = 0.0;
}
// 求解线性方程组
iter = gauss_seidel(A, x, b, n);
// 输出结果
printf("Solution:\n");
for (i = 0; i < n; i++) {
printf("x%d = %.14f\n", i, x[i]);
}
printf("Iterations: %d\n", iter);
// 释放内存
for (i = 0; i < n; i++) {
free(A[i]);
}
free(A);
free(b);
free(x);
return 0;
}
```
在这个示例中,我们通过一个具体的线性方程组的例子演示了GS迭代算法的求解过程,其中MAX_ITER和TOL分别表示最大迭代次数和精度要求,A是系数矩阵,b是常数向量,x是解向量。我们首先通过一个循环计算出新的解向量,然后计算残量,如果残量小于精度要求或者迭代次数已达到最大值,则结束迭代。最后输出求解结果和迭代次数,并释放内存。
阅读全文