给我一个高斯塞德尔迭代法C程序求解三元一次方程组要求精度小于10的-5次方
以下是使用高斯塞德尔迭代法求解三元一次方程组的C程序:
#include <stdio.h>
#include <math.h>
#define N 3 // 方程组的未知数个数
#define MAX_ITER 1000 // 最大迭代次数
#define EPSILON 1e-5 // 精度要求
int main()
{
double A[N][N+1] = {{2, -1, 0, 1},
{-1, 2, -1, 0},
{0, -1, 2, 1}}; // 系数矩阵
double x[N] = {0}; // 初始解
double x_new[N] = {0}; // 新解
int iter = 0; // 迭代次数
// 进行迭代计算
while (iter < MAX_ITER)
{
double max_error = 0; // 最大误差
for (int i = 0; i < N; i++)
{
x_new[i] = A[i][N]; // 先赋值为常数项
for (int j = 0; j < N; j++)
{
if (i != j)
{
x_new[i] -= A[i][j] * x[j]; // 减去其他未知数的系数乘以当前未知数的值
}
}
x_new[i] /= A[i][i]; // 除以当前未知数的系数
double error = fabs(x_new[i] - x[i]); // 计算误差
if (error > max_error)
{
max_error = error; // 更新最大误差
}
x[i] = x_new[i]; // 更新解
}
iter++; // 迭代次数加1
if (max_error < EPSILON)
{
break; // 达到精度要求,停止迭代
}
}
// 输出结果
if (iter < MAX_ITER)
{
printf("Solution:\n");
for (int i = 0; i < N; i++)
{
printf("x[%d] = %.6f\n", i, x[i]);
}
printf("Number of iterations: %d\n", iter);
}
else
{
printf("Failed to converge within %d iterations.\n", MAX_ITER);
}
return 0;
}
程序中使用了一个while循环进行迭代计算,每次循环都计算新的解,并判断误差是否达到精度要求。如果达到了精度要求,就停止迭代并输出结果;如果迭代次数达到了最大次数但还没有达到精度要求,就认为迭代失败。
在程序中,我们通过一个N×(N+1)的矩阵A来表示三元一次方程组的系数矩阵和常数项。在每次迭代中,我们都遍历矩阵A的每一行,计算新的解,并更新当前解。在计算新的解时,我们先将当前未知数的系数乘以当前解,然后减去其他未知数的系数乘以它们的解,最后除以当前未知数的系数,得到新的解。计算误差时,我们使用fabs函数计算绝对值
原文地址: https://www.cveoy.top/t/topic/dT36 著作权归作者所有。请勿转载和采集!