赛德尔迭代法

#include<stdio.h>
#include<math.h>

int main()
{
    double A[3][3] = {10,-1,-2,-1,10,-2,-1,-1,5};
                     double b[3] = {7.2,8.3,4.2};
    double x[3] = {0,0,0};
    //第k+1次迭代的结果
    double xx[3] = {0,0,0};
    //第k次迭代的结果
    int size = 3;
    int Max = 100;
    //最大迭代次数
    double residual = 0.0;

    double sum = 0.0;
    double dis = 0.0;
    double dif = 1.0;
//相邻迭代的结果差
    double eps = 1.0e-5;
//迭代精度
    for(int k=1; (k<Max)&&(dif>eps); k++)
    {
        dif = 0.0;

        for(int i=0; i<size; i++)
        {
            for(int j=0; j<size; j++)
            {
//与Jacobi迭代法唯一的区别就是sum的求法
                if(j<i)
                {
                    sum +=A[i][j]*x[j];
                }
                if(j>i)
                {
                    sum +=A[i][j]*xx[j];//上一次的x[j]
                }
            }
            x[i] = (b[i]-sum)/A[i][i];
            sum=0.0;
        }
        residual=0.0;
        for(int m=0; m<size; m++)
        {
            dis=fabs(x[m]-xx[m]);
            if(dis>residual)
                residual=dis;
        }
        dif=residual;
        printf("\n第%d次迭代的结果:\n",k);
        for(int i=0; i<size; i++)
        {
            printf("%12.6f ",x[i]);
            xx[i]=x[i];
        }
        printf("\n与上次计算结果的距离:%12.8f \n",dif);
    }
    printf("\n迭代计算的结果为:\n");
    for(int k=0; k<size; k++)
    {
        printf("%12.6f ",xx[k]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51281306/article/details/117442459