/*************************************************************************
* 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;
}