阅读背景:

分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组

来源:互联网 

算法介绍(迭代法介绍):

代码C语言实现;

# include<stdio.h>
# include<math.h>
# define N 6

/*
*使用雅可比迭代法和高斯-赛德尔迭代法 求解线性方程组 
*/ 
main(){
	float NF2(float *x,float *y);
	float A[N][N],b[N],sum=0;
	float x[N],y[N]={0},x0[N];
	int i,j,n=0;
	
	//输入系数矩阵 
	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			scanf("%f",&A[i][j]);
		}
	}
	
	//输入常数矩阵
	for(i=0;i<N;i++){
 		scanf("%f",&b[i]);
	} 
	
	//输入解的初值
	 for(i=0;i<N;i++){
 		scanf("%f",&x0[i]);
 	} 
	
	//输出系数矩阵
	printf("输出该方程组的系数矩阵:\n");
	 for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			printf("%3.1f    ",A[i][j]);
		}
		printf("\n");
	} 
	
	//输出成数矩阵
	printf("输出该方程组的常数矩阵:\n");
	for(i=0;i<N;i++){
		printf("%3.1f\n",b[i]);
	} 
	
	//输出解的迭代初值
	printf("解该方程组的的迭代初值是:\n");
	for(i=0;i<N;i++) 
	{
				printf("%3.1f\n",x0[i]);
	}
	/*
	*利用雅可比迭代法求解线性方程组 
	*/
	for(i=0;i<N;i++)
	{
		x[i]=x0[i];
	}
	for(n=0;;n++){
				//计算下一个值 
	for(i=0;i<N;i++){
		sum=0;
		for(j=0;j<N;j++){
			if(j!=i){
				sum=sum+A[i][j]*x[j];
			}
		}
		y[i]=(1/A[i][i])*(b[i]-sum);
		//sum=0;
	}
	//判断误差大小 
		if(NF2(x,y)>0.01){
				for(i=0;i<N;i++){
		x[i]=y[i];
	}
	} 
			else
			break;
	} 
	printf("经过%d次雅可比迭代解出方程组的解:\n",n+1);
	for(i=0;i<N;i++){
		printf("%f      ",y[i]);
	}
	/*
	*利用高斯-赛德尔迭代法求解线性方程组 
	*/
	for(i=0;i<N;i++)
	{
		x[i]=x0[i];
		y[i]=0;
	}
		for(n=0;;n++){
				//计算下一个值 
	for(i=0;i<N;i++){
		sum=0;
		for(j=0;j<i;j++){
				sum=sum+A[i][j]*y[j];
		}
		for(j=i+1;j<N;j++){
				sum=sum+A[i][j]*x[j];
		}
		y[i]=(1/A[i][i])*(b[i]-sum);
		//sum=0;
	}
	//判断误差大小 
		if(NF2(x,y)>0.01){
				for(i=0;i<N;i++){
		x[i]=y[i];
	}
	} 
			else
			break;
	} 
	printf("\n经过%d次高斯-赛德尔迭代解出方程组的解:\n",n+1);
	for(i=0;i<N;i++){
		printf("%f      ",y[i]);
	}
}
//求两个向量差的二范数函数 
float NF2(float *x,float *y){
int i;
float z,sum1=0;
for(i=0;i<N;i++){
	sum1=sum1+pow(y[i]-x[i],2);
}
z=sqrt(sum1);	
return z;
}# include<st



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: