C语言高斯赛德尔解方程组Ax=b

该代码示例展示了如何使用C语言实现Gauss-Seidel迭代法来求解线性方程组Ax=b。程序首先从用户那里获取矩阵A、向量b和最大迭代次数,然后进行迭代计算,直到达到预设的精度阈值或达到最大迭代次数。
摘要由CSDN通过智能技术生成

直接上代码

/*  
	用迭代法求解方程组Ax=b 
	Gauss-Seidel法 
*/
#include<stdio.h>
#include<math.h>
#define EPS 0.5e-6
double a[10][10], b[10], x[10], y[10];//分别表示A,b,x,y 
double sum=0;
int N0, n;//最大迭代次数N0,  n*n的数组A 

void input(){
	printf("输入n:");
	scanf("%d", &n);
	printf("输入二维数组A:\n");
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			scanf("%lf", &a[i][j]);
		}
	} 
	printf("输入一维数组b:\n");
	for(int i = 1;i <= n;i++){
		scanf("%lf", &b[i]);
	}
	
	printf("输入最大迭代次数N0:\n");
	scanf("%d", &N0); 
	
	for(int i = 1;i <= n;i++){
		x[i] = 0;
	}
}

//计算yi-xi的绝对值的最大值 
double G_max(double x[], double y[]){
	double max=0;
	for(int i = 1; i <= n; i++){
		if(fabs(y[i] - x[i]) > max){
			max=fabs(y[i] - x[i]);
		}
	}
	return max;
}

void Gauss_Seidel(){
	printf("k   x[1]   x[2]   x[3]\n"); 
	for(int k=1 ; k<=N0; k++){
		printf("%d   %lf   %lf   %lf\n", k, x[1], x[2], x[3]);
		for(int i=1; i<=n ;i++){
			sum = 0;
			for(int j=1; j<=n; j++){
				for(int t = 1; t < j; t++){
					x[t] = y[t];
				}
				if (i != j){
					sum+= a[i][j] * x[j];
				}
			}
			y[i] = (-1 * sum + b[i]) / a[i][i];
		}
		if (G_max(x,y) > EPS){
			for (int i=1; i<=n; i++){
				x[i] = y[i];//继续迭代 
			}
		}
		else {
			printf("\n迭代次数为 %d\n",k);
			printf("最终迭代结果如下(xi):\n");
			for(int i=1; i<=n; i++){
				printf("x%d = %lf\n", i, y[i]);
			}
			return;
		}
	}
	printf("\n迭代次数超过N0!计算失败!\n");
	return;
	
}
int main(){
	input();
	Gauss_Seidel();
	return 0;
}

高斯德尔迭代法是一种迭代法,用于求线性方程组。其基本思想是在每一次迭代中,先用已知的更新未知量的值,然后再用新的未知量值更新的值。 以下是使用高斯德尔迭代法线性方程组C语言程序: ```c #include <stdio.h> #include <math.h> #define N 3 // 矩阵维数 int main() { int i, j, k, flag; double eps = 1e-5; // 精度控制 double x[N] = {0}, x0[N] = {0}; // x为当前迭代,x0为上一次迭代 double a[N][N] = {{4, 1, 2}, {3, 5, 1}, {1, 1, 3}}; // 系数矩阵 double b[N] = {4, 7, 3}; // 常数向量 for (i = 0; i < N; i++) { x[i] = b[i] / a[i][i]; // 初始化 } do { flag = 1; // 标志位,记录是否满足精度要求 for (i = 0; i < N; i++) { x0[i] = x[i]; // 保存上一次迭代 x[i] = b[i]; // 计算当前迭代 for (j = 0; j < N; j++) { if (j != i) { x[i] -= a[i][j] * x[j]; } } x[i] /= a[i][i]; // 更新当前迭代 if (fabs(x[i] - x0[i]) > eps) { flag = 0; // 如果有一个未知量的误差超过eps,说明精度不满足要求 } } } while (!flag); printf("The solution is:\n"); for (i = 0; i < N; i++) { printf("x[%d] = %f\n", i, x[i]); } return 0; } ``` 上述程序中,系数矩阵和常数向量分别定义为数组a和b,精度控制用eps表示。在初始化时,假设每个未知量的值都为0。在每次迭代中,先用已知的更新未知量的值,然后再用新的未知量值更新的值。迭代直到所有未知量的误差都小于eps。最后输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值