#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int
cond(float *x,float *temp,int size,float cur);
float*
seidel(float* x,float *a,float *b,int size);
int
main()
{
float x[3]={0};
float a[3][3]={{1,1,0},{0,2,0},{1,0,1}};
float b[3]={3,4,5};
int i;
seidel(x,(float*)a,b,3);
for(i=0;i<3;i++)
printf("%f ",x[i]);
getch();
return 0;
}
int
cond(float *x,float *temp,int size,float cur)
{
int i;
int result=0;
for(i=0;i<size;i++)
result=result || fabs(*(x+i)-*(temp+i))>cur;
return result;
}
float*
seidel(float* x,float *a,float *b,int size)
{
int i,j;
float *temp=malloc(size*sizeof(float));
*(temp)=1.0;
while(cond(x,temp,size,0.0001))
{
for(i=0;i<size;i++)
*(temp+i)=*(x+i);
for(i=0;i<size;i++)
{
*(x+i)=*(b+i);
for(j=0;j<size;j++)
if(j!=i)
*(x+i)-=(*(a+i*size+j))*(*(x+j));
(*(x+i))*=(1.0/(*(a+i*size+i)));
}
}
return x;
}
高斯赛德尔迭代