雅可比迭代
#include
#include
#include
void input_output(float **a,float *b,int n)
{
int i,j;
printf("请输入系数矩阵\n",n);
for(i=0;i
for(j=0;j
scanf("%f",*(a+i)+j);
printf("请输入b常数,共%d项:\n",n);
for(j=0;j
scanf("%f",b+j);
printf("您输入方程组的增广矩阵为:\n");
for(i=0;i
{
for(j=0;j
printf("%f ",*(*(a+i)+j));
printf("%f\n",*(b+i));
}
printf("\n");
}
/*雅可比函数*/
void Yakebi(float **a,float *b,float *y,float *x,int n)
{
int i,j;
float sum1=0,sum2=0;
for(i=0;i
{
for(j=0;j
sum1=sum1+a[i][j]*x[j];
for(j=i+1;j
sum2=sum2+a[i][j]*x[j];
*(y+i)=(b[i]-sum1-sum2)/a[i][i];
sum1=0;sum2=0;
}
}
float Max(float *x,float *y,int n) /*求(x[i]-y[i])的最大值函数*/
{
int i;
float max;
max=(float)fabs(x[0]-y[0]);
for(i=1;i
if(fabs(x[i]-y[i])>max)
max=(float)fabs(x[i]-y[i]);
return (max);
}
/*主函数*/
void main()
{
int n,k,i;
float **a,*b ,*y,*x,e,max,num;
e=0.001;
printf("请输入方程组的阶数:n=");
scanf("%d",&n);
printf("请输入你所要求的最大迭代次数:m=";
scanf("%d",&m);
/*动态开辟数组a,b,y,x的空间*/
a=(float **)malloc(sizeof(float *)*n);
b=(float *)malloc(sizeof(float)*n);
x=(float *)malloc(sizeof(float)*n);
y=(float *)malloc(sizeof(float)*n);
for(i=0;i
*(a+i)=(float *)malloc(sizeof(float)*n);
input_output(a,b,n); /*对a,b数组进行赋值*/
for(i=0;i
*(x+i)=0;
/*检测对角线上是否有0*/
for(i=0;i
{
if(a[i][i]==0)
num=0;
break;
}
/*如果对角线上没有0*/
if(num!=0)
{
/*迭代过程*/
for(k=1;k
{
Yakebi(a,b,y,x,n);
max=Max(x,y,n);
if(max
{
for(i=0;i
printf("y[%d]=%f\n",i+1,y[i]);
break;
}
else
{
printf("第%d次迭代结果:",k);
for(i=0;i
{
printf("x[%d]=%f",i,y[i]);
x[i]=y[i];
}
printf("\n");
}
}
}
/*释放内存空间*/
free(a);
free(b);
free(x);
free(y);
}