请用c语言写出Jacobi迭代法和Gauss-Seidel迭代法求解方程组的解
时间: 2024-05-16 11:12:41 浏览: 28
Jacobi迭代法:
```c
#include <stdio.h>
#include <math.h>
#define N 3
int main()
{
double A[N][N] = {{-4, 1, 0}, {1, -4, 1}, {0, 1, -4}}; // 方程组系数矩阵
double b[N] = {-10, 0, 10}; // 方程组右端向量
double x[N] = {0, 0, 0}; // 迭代初值
double eps = 1e-6; // 精度要求
int k = 0, maxit = 100; // 迭代次数和最大迭代次数
while (k < maxit)
{
k++;
double x_new[N] = {0, 0, 0}; // 存放迭代新解
for (int i = 0; i < N; i++)
{
double sum = 0;
for (int j = 0; j < N; j++)
{
if (j != i) sum += A[i][j] * x[j];
}
x_new[i] = (b[i] - sum) / A[i][i];
}
double err = 0; // 计算误差
for (int i = 0; i < N; i++)
{
err += pow(x_new[i] - x[i], 2);
}
if (sqrt(err) < eps) // 满足精度要求
{
printf("Jacobi迭代法迭代次数: %d\n", k);
for (int i = 0; i < N; i++)
{
printf("x[%d] = %.6f\n", i, x_new[i]);
}
break;
}
for (int i = 0; i < N; i++) x[i] = x_new[i]; // 更新迭代初值
}
if (k >= maxit)
{
printf("Jacobi迭代法未收敛!\n");
}
return 0;
}
```
Gauss-Seidel迭代法:
```c
#include <stdio.h>
#include <math.h>
#define N 3
int main()
{
double A[N][N] = {{-4, 1, 0}, {1, -4, 1}, {0, 1, -4}}; // 方程组系数矩阵
double b[N] = {-10, 0, 10}; // 方程组右端向量
double x[N] = {0, 0, 0}; // 迭代初值
double eps = 1e-6; // 精度要求
int k = 0, maxit = 100; // 迭代次数和最大迭代次数
while (k < maxit)
{
k++;
double x_new[N] = {0, 0, 0}; // 存放迭代新解
for (int i = 0; i < N; i++)
{
double sum = 0;
for (int j = 0; j < N; j++)
{
if (j < i) sum += A[i][j] * x_new[j];
if (j > i) sum += A[i][j] * x[j];
}
x_new[i] = (b[i] - sum) / A[i][i];
}
double err = 0; // 计算误差
for (int i = 0; i < N; i++)
{
err += pow(x_new[i] - x[i], 2);
}
if (sqrt(err) < eps) // 满足精度要求
{
printf("Gauss-Seidel迭代法迭代次数: %d\n", k);
for (int i = 0; i < N; i++)
{
printf("x[%d] = %.6f\n", i, x_new[i]);
}
break;
}
for (int i = 0; i < N; i++) x[i] = x_new[i]; // 更新迭代初值
}
if (k >= maxit)
{
printf("Gauss-Seidel迭代法未收敛!\n");
}
return 0;
}
```
这里给出的是求解一个3元线性方程组的Jacobi迭代法和Gauss-Seidel迭代法的代码,可以根据需要进行修改。需要注意的是,这两种迭代法的收敛性与系数矩阵的特性有关,不是所有的线性方程组都可以用这两种方法求解。