用gauss-seidel迭代法生成C语言代码
时间: 2023-07-16 22:13:22 浏览: 88
以下是使用 Gauss-Seidel 迭代法求解线性方程组的 C 语言代码示例:
```c
#include <stdio.h>
#include <math.h>
#define N 3 // 系数矩阵的阶数
void gauss_seidel(double a[N][N], double b[N], double x[N], double tol, int max_iter);
int main() {
double a[N][N] = {{4.0, 1.0, -1.0}, {2.0, 7.0, 1.0}, {1.0, -3.0, 12.0}}; // 系数矩阵
double b[N] = {7.0, -8.0, 14.0}; // 常数向量
double x[N] = {0.0, 0.0, 0.0}; // 初始解向量
double tol = 1e-6; // 相对误差容许值
int max_iter = 100; // 最大迭代次数
gauss_seidel(a, b, x, tol, max_iter);
printf("解向量:\n");
for (int i = 0; i < N; i++) {
printf("x[%d] = %f\n", i, x[i]);
}
return 0;
}
void gauss_seidel(double a[N][N], double b[N], double x[N], double tol, int max_iter) {
double x_new[N]; // 存储新的解向量
double err; // 每次迭代的相对误差
int iter; // 迭代次数
for (iter = 1; iter <= max_iter; iter++) {
for (int i = 0; i < N; i++) {
x_new[i] = b[i];
for (int j = 0; j < N; j++) {
if (j < i) {
x_new[i] -= a[i][j] * x_new[j];
} else if (j > i) {
x_new[i] -= a[i][j] * x[j];
}
}
x_new[i] /= a[i][i];
}
err = 0.0;
for (int i = 0; i < N; i++) {
err += fabs((x_new[i] - x[i]) / x_new[i]);
x[i] = x_new[i];
}
if (err < tol) {
printf("迭代次数:%d\n", iter);
return;
}
}
printf("迭代次数已达到最大值:%d\n", max_iter);
}
```
代码中使用了一个 `gauss_seidel` 函数来实现 Gauss-Seidel 迭代法求解线性方程组,该函数接受系数矩阵、常数向量、初始解向量、相对误差容许值和最大迭代次数等参数。
在函数中,首先使用一个 `x_new` 数组来存储每次迭代得到的新的解向量。然后,对于每个未知量 $x_i$,根据 Gauss-Seidel 迭代公式计算出新的解 $x_{i,new}$。计算新的解时,需要用到当前迭代中已经得到的其他未知量的新的解 $x_{j,new}$ 和上一次迭代中的 $x_j$。当所有未知量的新的解都计算出来后,计算每个未知量的相对误差,并将新的解向量赋值给原来的解向量。迭代过程中,如果相对误差已经小于相对误差容许值,则停止迭代并输出迭代次数;如果迭代次数已经达到最大值,则停止迭代并输出相应提示。
阅读全文