作者:钟爱gyt_201 | 来源:互联网 | 2024-10-26 15:25
本文对比分析了雅可比迭代法和高斯-赛德尔迭代法在求解线性方程组中的应用效果。通过详细的算法介绍和C语言实现,展示了两种方法的具体步骤和计算过程。实验结果表明,高斯-赛德尔迭代法在收敛速度和计算效率上优于雅可比迭代法,但在某些特定条件下,雅可比迭代法仍具有一定的优势。此外,文章还探讨了不同初始值和矩阵特性对迭代法性能的影响,为实际应用提供了有价值的参考。
算法介绍(迭代法介绍):
代码C语言实现;
# include
# include
# 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 for(j=0;j scanf("%f",&A[i][j]);
}
}
//输入常数矩阵
for(i=0;i scanf("%f",&b[i]);
}
//输入解的初值
for(i=0;i scanf("%f",&x0[i]);
}
//输出系数矩阵
printf("输出该方程组的系数矩阵:\n");
for(i=0;i for(j=0;j printf("%3.1f ",A[i][j]);
}
printf("\n");
}
//输出成数矩阵
printf("输出该方程组的常数矩阵:\n");
for(i=0;i printf("%3.1f\n",b[i]);
}
//输出解的迭代初值
printf("解该方程组的的迭代初值是:\n");
for(i=0;i {
printf("%3.1f\n",x0[i]);
}
/*
*利用雅可比迭代法求解线性方程组
*/
for(i=0;i {
x[i]=x0[i];
}
for(n=0;;n++){
//计算下一个值
for(i=0;i sum=0;
for(j=0;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 x[i]=y[i];
}
}
else
break;
}
printf("经过%d次雅可比迭代解出方程组的解:\n",n+1);
for(i=0;i printf("%f ",y[i]);
}
/*
*利用高斯-赛德尔迭代法求解线性方程组
*/
for(i=0;i {
x[i]=x0[i];
y[i]=0;
}
for(n=0;;n++){
//计算下一个值
for(i=0;i sum=0;
for(j=0;j sum=sum+A[i][j]*y[j];
}
for(j=i+1;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 x[i]=y[i];
}
}
else
break;
}
printf("\n经过%d次高斯-赛德尔迭代解出方程组的解:\n",n+1);
for(i=0;i printf("%f ",y[i]);
}
}
//求两个向量差的二范数函数
float NF2(float *x,float *y){
int i;
float z,sum1=0;
for(i=0;i sum1=sum1+pow(y[i]-x[i],2);
}
z=sqrt(sum1);
return z;
}
代码运行输入输出结果;