福莱特法计算程序(c语言)

/*************************************************************************

 *  function:   void Fratar()

 *  brief:      福莱特法计算程序

 *  param:      无

 *  return:     无

 *  created on: 2022-10-23

 *  author:     Zhao

 *************************************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define E 0.03

#define M 100

#define N 100

#define MaxSize 20

struct Stu_2

{

    double q[M][N];

    double F_O[M];

    double F_D[M];

    double L_i[M];

    double L_j[M];

    double sum1[M];

    double sum2[M];

    double O[M] ;

    double D[M] ;

};

struct Stu_1

{

    struct Stu_2 arr_2[MaxSize];

};

void Fratar()

{

    int n1=0,k=0,i=0,j=0,k1=0,flag=0;

    struct Stu_1 st_a1;

    double U[M]={0};

    double V[M]={0};

//*********************************************

    printf(“请输入O或D的个数:”);

    scanf(“%d”,&n1);

    for(k=0;k<n1;k++)

    {

        printf(“请输入O%d_%d的值:”,k1,k+1);

        scanf(“%lf”,&st_a1.arr_2[k1].O[k]);

    }

    for(k=0;k<n1;k++)

    {

        printf(“请输入D%d_%d的值:”,k1,k+1);

        scanf(“%lf”,&st_a1.arr_2[k1].D[k]);

    }

    for(k=0;k<n1;k++)

    {

        printf(“请输入U%d的值:”,k+1);

        scanf(“%lf”,&U[k]);

    }

    for(k=0;k<n1;k++)

    {

        printf(“请输入V%d的值:”,k+1);

        scanf(“%lf”,&V[k]);

    }

//**********************************************

    for(i=0;i<n1;i++)

    {

        for(j=0;j<n1;j++)

        {

            printf(“请输入q%d[%d][%d]的值:”,k1,i+1,j+1);

            scanf(“%lf”,&st_a1.arr_2[k1].q[i][j]);

        }

    }

    printf(“*********************\n”);

//*************(1)求F_O[i]和F_D[j]**************

    for(k=0;k<n1;k++)

    {

        st_a1.arr_2[k1].F_O[k]=((int)((U[k]/st_a1.arr_2[k1].O[k])*10000+0.5))/10000.0;

        printf(“F%d_O%d的值为:%.4lf\n”,k1,k+1,st_a1.arr_2[k1].F_O[k]);

    }

    for(k=0;k<n1;k++)

    {

        st_a1.arr_2[k1].F_D[k]=((int)((V[k]/st_a1.arr_2[k1].D[k])*10000+0.5))/10000.0;

        printf(“F%d_D%d的值为:%.4lf\n”,k1,k+1,st_a1.arr_2[k1].F_D[k]);

    }

    printf(“*********************\n”);

//*****************(2)求L_i[i]***************************************

    for(i=0;i<n1;i++)

    {

        for(j=0;j<n1;j++)

        {

            st_a1.arr_2[k1].sum1[i]+=st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_D[j];

        }

        st_a1.arr_2[k1].L_i[i]=((int)((st_a1.arr_2[k1].O[i]/st_a1.arr_2[k1].sum1[i])*1000+0.5))/1000.0;

    }

    for(i=0;i<n1;i++)

    {

        printf(“L%d_i%d=%.3lf\n”,k1,i+1,st_a1.arr_2[k1].L_i[i]);

    }

//*****************(2)求L_j[j]***************************************

    for(j=0;j<n1;j++)

    {

        for(i=0;i<n1;i++)

        {

            st_a1.arr_2[k1].sum2[j]+=st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_O[i];

        }

        st_a1.arr_2[k1].L_j[j]=((int)((st_a1.arr_2[k1].D[j]/st_a1.arr_2[k1].sum2[j])*1000+0.5))/1000.0;

    }

    for(j=0;j<n1;j++)

    {

        printf(“L%d_j%d=%.3lf\n”,k1,j+1,st_a1.arr_2[k1].L_j[j]);

    }

    printf(“*********************\n”);

//***************(3)求q[i][j]*************************

    for(i=0;i<n1;i++)

    {

        for(j=0;j<n1;j++)

        {

            st_a1.arr_2[k1+1].q[i][j]=((int)((st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_O[i]*st_a1.arr_2[k1].F_D[j]*(st_a1.arr_2[k1].L_i[i]+st_a1.arr_2[k1].L_j[j])/2.0)*1000+0.5))/1000.0;

            printf(“q%d[%d][%d]=%.3lf\n”,k1+1,i+1,j+1,st_a1.arr_2[k1+1].q[i][j]);

        }

    }

    printf(“*********************\n”);

//***************(4)重新计算F_O[i]和F_D[j]*************************

    for(i=0;i<n1;i++)

    {

        for(j=0;j<n1;j++)

        {

            st_a1.arr_2[k1+1].O[i]+=st_a1.arr_2[k1+1].q[i][j];

            st_a1.arr_2[k1+1].D[i]+=st_a1.arr_2[k1+1].q[j][i];

        }

        st_a1.arr_2[k1+1].F_O[i]=((int)((U[i]/st_a1.arr_2[k1+1].O[i])*10000+0.5))/10000.0;

        st_a1.arr_2[k1+1].F_D[i]=((int)((V[i]/st_a1.arr_2[k1+1].D[i])*10000+0.5))/10000.0;

    }

    for(k=0;k<n1;k++)

    {

        printf(“F%d_O%d=%.4lf\n”,k1+1,k+1,st_a1.arr_2[k1+1].F_O[k]);

    }

    for(k=0;k<n1;k++)

    {

        printf(“F%d_D%d=%.4lf\n”,k1+1,k+1,st_a1.arr_2[k1+1].F_D[k]);

    }

    printf(“*********************\n”);

//***************(5)收敛判别*************************

    for(k=0;k<n1;k++)

    {

        if(fabs(1-E) < st_a1.arr_2[k1+1].F_O[k] && fabs(1-E) < st_a1.arr_2[k1+1].F_D[k])

        {

            if(k==n1-1)

            {

                printf(“F%d_O和F%d_D的值均在误差之内,计算完毕!\n”,k1+1,k1+1);

                printf(“q%d[i][j]的值即为最终的OD表!\n”,k1+1);

            }

        }

        else

        {

            flag=1;

            break;

        }

    }

    if(flag==1)

    {

        for(k=0;k<n1;k++)

        {

            while(!(fabs(1-E) < st_a1.arr_2[k1+1].F_O[k] && fabs(1-E) < st_a1.arr_2[k1+1].F_D[k]))

            {

                printf(“F%d_O和F%d_D部分系数大于%.2lf的误差,需要继续迭代计算!\n”,k1+1,k1+1,E);

                k1++;

                //*****************求L_i[i]***************************************

                for(i=0;i<n1;i++)

                {

                    for(j=0;j<n1;j++)

                    {

                        st_a1.arr_2[k1].sum1[i]+=st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_D[j];

                    }

                    st_a1.arr_2[k1].L_i[i]=((int)((st_a1.arr_2[k1].O[i]/st_a1.arr_2[k1].sum1[i])*1000+0.5))/1000.0;

                }

                for(i=0;i<n1;i++)

                {

                    printf(“L%d_i%d=%.3lf\n”,k1,i+1,st_a1.arr_2[k1].L_i[i]);

                }

            //*****************求L_j[j]***************************************

                for(j=0;j<n1;j++)

                {

                    for(i=0;i<n1;i++)

                    {

                        st_a1.arr_2[k1].sum2[j]+=st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_O[i];

                    }

                    st_a1.arr_2[k1].L_j[j]=((int)((st_a1.arr_2[k1].D[j]/st_a1.arr_2[k1].sum2[j])*1000+0.5))/1000.0;

                }

                for(j=0;j<n1;j++)

                {

                    printf(“L%d_j%d=%.3lf\n”,k1,j+1,st_a1.arr_2[k1].L_j[j]);

                }

                printf(“*********************\n”);

            //***************求q[i][j]*************************

                for(i=0;i<n1;i++)

                {

                    for(j=0;j<n1;j++)

                    {

                        st_a1.arr_2[k1+1].q[i][j]=((int)((st_a1.arr_2[k1].q[i][j]*st_a1.arr_2[k1].F_O[i]*st_a1.arr_2[k1].F_D[j]*(st_a1.arr_2[k1].L_i[i]+st_a1.arr_2[k1].L_j[j])/2.0)*1000+0.5))/1000.0;

                        printf(“q%d[%d][%d]=%.3lf\n”,k1+1,i+1,j+1,st_a1.arr_2[k1+1].q[i][j]);

                    }

                }

                printf(“*********************\n”);

            //***************重新计算F_O[i]和F_D[j]*************************

                for(i=0;i<n1;i++)

                {

                    for(j=0;j<n1;j++)

                    {

                        st_a1.arr_2[k1+1].O[i]+=st_a1.arr_2[k1+1].q[i][j];

                        st_a1.arr_2[k1+1].D[i]+=st_a1.arr_2[k1+1].q[j][i];

                    }

                    st_a1.arr_2[k1+1].F_O[i]=((int)((U[i]/st_a1.arr_2[k1+1].O[i])*10000+0.5))/10000.0;

                    st_a1.arr_2[k1+1].F_D[i]=((int)((V[i]/st_a1.arr_2[k1+1].D[i])*10000+0.5))/10000.0;

                }

                for(k=0;k<n1;k++)

                {

                    printf(“F%d_O%d=%.4lf\n”,k1+1,k+1,st_a1.arr_2[k1+1].F_O[k]);

                }

                for(k=0;k<n1;k++)

                {

                    printf(“F%d_D%d=%.4lf\n”,k1+1,k+1,st_a1.arr_2[k1+1].F_D[k]);

                }

                printf(“*********************\n\n”);

                if(k!=0)//让k置0,从第0组F_O和F_D开始判断

                {

                    k=0;

                }

            }

            if(k==n1-1)

            {

                printf(“F%d_O和F%d_D的值均在误差之内,计算完毕!\n”,k1+1,k1+1);

                printf(“q%d[i][j]的值即为最终的OD表!\n”,k1+1);

            }

        }

    }

}

int main()

{

    Fratar();

    return 0;

}