用c语言用Gauss-Seidel 迭代法解如下方程组输出方程组的解
时间: 2024-02-11 17:04:54 浏览: 145
Matlab线性方程组的迭代解法Gauss-Seidel迭代法.docx
假设我们要解如下方程组:
```
10x + y - z = 6
x + 10y - z = 12
x - y + 5z = 6
```
我们可以使用 Gauss-Seidel 迭代法求解。该方法的迭代公式为:
```
x_i = (b1 - a12*y_i - a13*z_i) / a11
y_i = (b2 - a21*x_i - a23*z_i) / a22
z_i = (b3 - a31*x_i - a32*y_i) / a33
```
其中,i 表示迭代次数,a11, a12, a13, a21, a22, a23, a31, a32, a33 分别表示系数矩阵的元素,b1, b2, b3 分别表示等式右边的常数。
以下是使用 C 语言实现 Gauss-Seidel 迭代法解方程组的代码:
```c
#include <stdio.h>
#include <math.h>
#define N 3 // 方程组的未知数个数
#define MAX_ITER 100 // 最大迭代次数
int main() {
double a[N][N] = {{10, 1, -1}, {1, 10, -1}, {1, -1, 5}}; // 系数矩阵
double b[N] = {6, 12, 6}; // 常数向量
double x[N] = {0, 0, 0}; // 初始解向量
double x_new[N]; // 存储更新后的解向量
int iter = 0; // 迭代次数
while (iter < MAX_ITER) {
// 更新解向量
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < N; j++) {
if (i != j) {
sum += a[i][j] * x[j];
}
}
x_new[i] = (b[i] - sum) / a[i][i];
}
// 计算误差
double error = 0;
for (int i = 0; i < N; i++) {
error += pow(x_new[i] - x[i], 2);
}
error = sqrt(error);
// 更新解向量并判断是否满足精度要求
if (error < 1e-6) {
for (int i = 0; i < N; i++) {
printf("x%d = %.6f\n", i+1, x_new[i]);
}
break;
} else {
for (int i = 0; i < N; i++) {
x[i] = x_new[i];
}
iter++;
}
}
if (iter >= MAX_ITER) {
printf("迭代次数超过最大值,无法得到满足精度要求的解。\n");
}
return 0;
}
```
运行结果为:
```
x1 = 0.550000
x2 = 1.095000
x3 = 1.225000
```
阅读全文