数值分析与多项式研究-Jacobi迭代法

Jacobi迭代法

#include <stdio.h>
#include <math.h>
#define N 1000
double a[N][N];
double x[2][N];
double he(int i,int k,int n)
{
    double sum=0;
    int j;
    for(j=0;j<n;++j)
    {
        if(j==i)
            continue;
        sum+=a[i][j]*x[k][j];
    }
    return sum;
}
int main()
{
    int n,i,j,k;
    int cycle;
    int count;
    double e;
    double maxe;
    int flag;
    while(scanf("%d",&n),n)
    {
        flag=0;
        scanf("%lf%d",&e,&cycle);
        for(i=0;i<n;++i)
            for(j=0;j<n;++j)
                scanf("%lf",&a[i][j]);
        for(k=0;k<n;++k)
            scanf("%lf",&a[k][n]);
        for(i=0;i<n;++i)
            x[0][i]=0;
        i=0;
        count=0;
        while(true)
        {
            k=(i+1)%2;
            for(j=0;j<n;++j)
                x[k][j]=(a[j][n]-he(j,i,n))/a[j][j];
            maxe=0;
            for(j=0;j<n;++j)
                maxe=fabs(x[k][j]-x[i][j])>maxe ? fabs(x[k][j]-x[i][j]) : maxe;
            if(maxe<=e)
            {
                flag=1;
                break;
            }
            if((++count)>=cycle)
                break;
            i=k;
        }
        if(flag)
            printf("当迭代次数为%d时达到精度要求,解如下:\n",count+1);
        else
            printf("已达到最大迭代次数%d,未达到精度要求,解如下:\n",cycle);
        for(i=0;i<n;++i)
            printf("%lf ",x[k][i]);
        printf("\n");
    }
    return 0;
}