这以下是我们搞毕业设计时,老师要求我们编的一个优化程序。要求从取不同的船长L-length,船宽B-breadth,吃水T-draught,的组合,计算校核其性能(重量weight,稳性stability,船速velocity和经济性economy),将符合约束条件的输出。
这个程序编完后,编译时没有错误提示,可运行时却只显示了L、B、T的75种组合。
并提示:floating point error:doman 在此,请教一下各位高手,看看问题出在哪里,并指示一下如何解决问题。本人不甚感激
#include "math.h"
float L,B,T,Cb=0.6,D=1.1,Po=26.5,Go=1.13*0.198,Gm; 作为全局变量
float weight(float L, float B);
float stability(float B,float T);
float velocity(float L,float B,float T);
float economy(float disp);
main( )
{float length[5]={12.5,12.7,12.9,13.1,13.3},
breadth[3]={2.6,2.8,3.0},
draught[5]={0.53,0.55,0.57,0.59,0.61};
float disp,k=1.01,w=1.0,err,Pe,a,v1,v,t,index;
int i,j,n;
for(i=0;i<5;i++)
{for(j=0;j<3;j++)
{for(n=0;n<5;n++) 用三个for语句取数组中的个数构成一个组合
{L=length[i],B=breadth[j],T=draught[n];
disp=k*L*B*T*Cb*w; 计算排水量
err=(disp-weight(L,B))/disp; 计算重量与排水量的误差
if(abs(err)<0.01)Gm=stability(B,T); 约束条件1:误差要求小于1%,符合的L、B、T才继续往下算
if(Gm/B>0.2)Pe=velocity(L,B,T); 约束条件2,符合的L、B、T才继续往下算
if(Pe<Po) 约束条件3,符合的L、B、T才继续往下算
{a=pow(disp,0.667);
v1=pow(100*32.4/a,0.333);
v=1.852*v1; 计算速度
}
t=economy(disp); 计算投资回收期
index=0.5*t/0.5-0.2*v/20-0.3*Gm/2; 计算速度,投资回收期,稳性高度三者加权评价值
printf("While L=%f,B=%f,T=%f,its performance conforms to the requirement.\n",L,B,T); 输出L、B、T
printf("Here,its displacement=%f.\n",disp); 输出计算的排水量
printf("Its metacentric height is %f.\n",Gm); 输出稳性高度
printf("Its velocity is %f km/h.",v); 输出航速
printf("t=%f\n",t); 输出投资回收期
printf("index=%f\n",index); 输出加权评价值
}
}
}
}
float weight(float L, float B) 计算重量(排水量校核)
{int man=32;
float c=0.26,k=1.15;
float totalW,LW,DW,Wo,Wl,Ws,Wm;
LW=c*L*B*D;
Wo=0.001*Go*Po*10*k;
Wl=0.03*Wo;
Ws=0.005*LW;
Wm=man*65/1000;
DW=Wo+Wl+Ws+Wm;
totalW=LW+DW;
return(totalW); 返回总重量值
}
float stability(float B,float T) 计算稳性高度(稳性校核)
{float Zb,r,Zg,Cwp=0.77,e=1.0;
Zb=(0.85-0.372*Cb/Cwp)*T;
r=(0.1363*Cwp+0.0505)*B*B/Cb/T;
Zg=e*D;
Gm=Zb+r-Zg;
return(Gm); 返回稳性高度值
}
float velocity(float L,float B,float T) 计算主机功率(航速校核)
{float f=1.67,m=1.0,Cm=0.92,Am,S,e,g=9.81,v=14.5/3.6,Fn,R,Pe;
Am=Cm*B*T;
S=(1.2*T+Cb*B)*L;
e=17.36*m*pow(Cb,2.5)/(2+pow(L/6/B,3));
Fn=v/sqrt(g*L);
R=f*S*pow(v,1.83)+10*e*Cb*Am*pow(v,1.7+4*Fn);
Pe=R*v/1000;
return(Pe); 返回主机功率值
}
float economy(float disp) 计算投资回收期(经济性校核)
{float Qt,n=0.8,F=2143.0,R=0.15,K=0.8,S,S1,S2,S3,S4,S5,W,Pb=32.4,t=1.0,K1=1.2,
b,P,Y,A,T2,i=0.1;
int Wc=30,N=5*250;
Qt=n*Wc*N;
P=F*disp*pow(1+R,16)*K/10000;
S1=(1-0.1)*P/15;
S2=0.025*P;
S3=0.0055*P;
S4=2.0*1.0;
W=0.001*Go*Pb*N*t*K1;
S5=1.1*4640*W/10000;
S=(S1+S2+S3+S4+S5)/0.8;
b=Qt*P;
Y=S-S1;
A=b-Y;
T2=-log10(1-i*P/A)/log10(1+i);
return(T2); 返回投资回收期的值
}
[此贴子已经被作者于2006-3-26 19:18:36编辑过]