【計算方法】雅可比迭代法和高斯-賽德爾迭代法求線性方程根
阿新 • • 發佈:2019-01-10
雅可比迭代法:
//雅可比迭代法
void jacobi(float *a,int n,float x[])
{
int i,j,k=0;
float epsilon,s;
float *y=new float[n];
for(i=0;i<n;i++)x[i]=0;
while(1)
{
epsilon=0;
k++;
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
if (j==i)continue;
s+=*(a+i*(n+1)+j)*x[j];
}
y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i));
epsilon+=fabs(y[i]-x[i]);
}
for(i=0;i<n;i++)x[i]=y[i];
if(epsilon<eps)
{
printf("%d\n",k);return;}
if(k>=max)
{printf ("發散");return;}
}
delete y;
}
高斯-賽德爾迭代法
//高斯塞德爾
void gauss(float *a,int n,float x[])
{
int i,j,k=1;
float d,dx,eps;
for(i=0;i<=n-1;i++)x[i]=0.0;
while(1)
{
eps=0;
for(i=0;i<=n-1;i++)
{
d=0;
for(j=0;j<=n-1;j++)
{
if (j==i)continue;
d+=*(a+i*(n+1)+j)*x[j];
}
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
eps+=fabs(dx-x[i]);
x[i]=dx;
}
if(eps<1e-6)
{printf("%d\n",k);return;}
if(k>N)
{
printf("發散\n");
return;
}
k++;
}
}