📄 zhidaozhadan.c
字号:
//本程序求解某制导炸弹的未扰动弹道(控制其攻角始终为0)
#include"math.h"
#include"stdio.h"
#include"enlgr.c"//一元不等距插值子函数
#define rad 57.3//将“度”转化为“弧度”
#define g0 9.81 //重力加速度取常数
//定义参数如下:
//弹体参数
double m=230.0;
double Jx=2.9698;
double Jy=51.255;
double Jz=51.255;
double S=0.07022;
double L=2.11;
//气动参数
double Cx,Cx0,Cxalpha,Cxdelta;
double yMa[6]={0.4,0.6,0.8,0.9,1.0,1.1};
double yCx0[6]={0.1631,0.1748,0.1796,0.2035,0.3214,0.4672};
double yCxalpha[6]={6.073,4.745,9.395,8.931,9.072,8.617};
double yCxdelta[6]={1.192,0.913,1.220,0.911,1.168,0.690};
double Cy;
double Cyalpha=0.0798;
double Cydelta=0.03291;
double mz;
double mzalpha=-0.0147;
double mzdelta=-0.01845;
double mzw_=-1.83;
double mzdalpha_=-0.0175;
double Ma,wz_,dalpha_,dalpha,deltaz,alpha;
//其他
double rho,sonic,Hy;
double k=1.40;
double R1=287.0;
double G=6.0e-3;
double taoon=289.4;
double rhoon=1.220;
double Vmax,Vmin,Vmax_Y[9],Vmin_Y[9];
double yy[50];//用于存放H(y)-y表中的y值(主要用来算随高度变化的空气密度)
double yHy[50];
int int_yHy[5][10];//用于存放H(y)-y表中的H(y)值
double Y[7];//存放未知量
double Vmin_Hy,Vmin_Cx0,Vmin_Cxalpha,Vmin_Cxdelta,Vmin_sonic;
double Vmax_Hy,Vmax_Cx0,Vmax_Cxalpha,Vmax_Cxdelta,Vmax_sonic;
//读取H(y)-y的值(Hy.txt文件必须存在于指定路径下)
void Read_Hy()
{
FILE *filedata=NULL;
int i,j;
if((filedata=fopen("c:\\Hy.txt","r"))==NULL)
{
printf("文件不存在,无法读取!");
exit(0);
}
for(i=0;i<5;i++)
for(j=0;j<10;j++)
fscanf(filedata,"%d",&int_yHy[i][j]);
for(i=0;i<5;i++)
for(j=0;j<10;j++)
yHy[i*10+j]=int_yHy[i][j]/10000.0;
for(i=0;i<50;i++)
yy[i]=i*100;
return;
}
//右端函数
void dery(n,dy,Y)
int n;
double dy[],Y[];
{
alpha=Y[6]-Y[2];
deltaz=-1.0*mzalpha*alpha/mzdelta;
if(Y[5]<0.0)
{
Y[5]=0.0;
}
Hy=enlgr(yy,yHy,50,Y[5]);
rho=rhoon*Hy;
sonic=sqrt(k*R1*(taoon-G*Y[5]));
Ma=Y[1]/sonic;
Cx0=enlgr(yMa,yCx0,6,Ma);
Cxalpha=enlgr(yMa,yCxalpha,6,Ma);
Cxdelta=enlgr(yMa,yCxdelta,6,Ma);
Cx=Cx0+Cxalpha*alpha*alpha/rad/rad+Cxdelta*deltaz*deltaz/rad/rad;///////
Cy=Cyalpha*alpha+Cydelta*deltaz;/////////
wz_=Y[3]*L/Y[1];
dalpha_=(Y[3]-(0.5*rho*Y[1]*Y[1]*Cy*S-m*g0*cos(Y[2]))/(m*Y[1]))*L/Y[1];
mz=mzalpha*alpha+mzdelta*deltaz+mzw_*wz_+mzdalpha_*dalpha_;////////
dy[0]=1;//表示dt/dt=1
dy[1]=(-0.5*rho*Y[1]*Y[1]*Cx*S-m*g0*sin(Y[2]))/m;
dy[2]=(0.5*rho*Y[1]*Y[1]*Cy*S-m*g0*cos(Y[2]))/(m*Y[1]);
dy[3]=(0.5*rho*Y[1]*Y[1]*mz*S*L)/Jz;
dy[4]=Y[1]*cos(Y[2]);
dy[5]=Y[1]*sin(Y[2]);
dy[6]=Y[3];
return;
}
//四阶龙格库塔子程序
void rk(n,h)
int n;
double h;
{
extern void dery();
double a[4],old_y[8],Y1[8],*dy;
int i,j;
dy=calloc(n,sizeof(double));
a[0]=a[1]=h/2.0;
a[2]=a[3]=h;
dery(n,dy,Y);
for(i=0;i<n;i++)
old_y[i]=Y[i];
for(j=0;j<3;j++)
{
for(i=0;i<n;i++)
{
Y1[i]=old_y[i]+a[j]*dy[i];
Y[i]=Y[i]+a[j+1]*dy[i]/3.0;
}
dery(n,dy,Y1);
}
for(i=0;i<n;i++)
Y[i]=Y[i]+a[0]*dy[i]/3.0;
free(dy);
return;
}
//主函数
main()
{
double step;
int nn,ii;
FILE *ftxtfile=NULL;
Read_Hy();
if((ftxtfile=fopen("d:\\某制导炸弹未扰动弹道求解数据(段笑菊).txt","w"))==NULL)
{
printf("Can't open the file\n");
exit(0);
}
Vmax=0.0;
Vmin=100000.0;
step=0.0005;
nn=7;
Y[0]=0.0; //时间t
Y[1]=208.3; //速度V
Y[2]=-1.1/rad; //弹道倾角θ
Y[3]=0.0; //绕z轴的角速度ωz
Y[4]=0.0; //射程X
Y[5]=4000.0; //高度Y
Y[6]=-1.1/rad; //俯仰角Θ
//Y[7]=0.0; //攻角α
fprintf(ftxtfile,"%f %f %f %f %f %f %f %f %f\n",Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],alpha,deltaz);
rk(nn,step);
alpha=0.0;//取方案攻角α*为0
fprintf(ftxtfile,"%f %f %f %f %f %f %f %f %f\n",Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],alpha,deltaz);
for(ii=0;;ii++)
//do
{
rk(nn,step);
alpha=0.0;//取方案攻角α*为0
fprintf(ftxtfile,"%f %f %f %f %f %f %f %f %f\n",Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],alpha,deltaz);
printf("%f %f %f %f %f %f %f %f %f\n",Y[0],Y[1],Y[2],Y[3],Y[4],Y[5],Y[6],alpha,deltaz);
//rk(nn,step);
//alpha=0.0;//取方案攻角α*为0
if(Y[1]>=Vmax)
{
Vmax=Y[1];
Vmax_Y[0]=Y[0];
Vmax_Y[2]=Y[2];
Vmax_Y[3]=Y[3];
Vmax_Y[4]=Y[4];
Vmax_Y[5]=Y[5];
Vmax_Y[6]=Y[6];
Vmax_Y[7]=alpha;
Vmax_Y[8]=deltaz;
Vmax_Hy=Hy;
Vmax_Cx0=Cx0;
Vmax_Cxalpha=Cxalpha;
Vmax_Cxdelta=Cxdelta;
Vmax_sonic=sonic;
}
if(Y[1]<=Vmin)
{
Vmin=Y[1];
Vmin_Y[0]=Y[0];
Vmin_Y[2]=Y[2];
Vmin_Y[3]=Y[3];
Vmin_Y[4]=Y[4];
Vmin_Y[5]=Y[5];
Vmin_Y[6]=Y[6];
Vmin_Y[7]=alpha;
Vmin_Y[8]=deltaz;
Vmin_Hy=Hy;
Vmin_Cx0=Cx0;
Vmin_Cxalpha=Cxalpha;
Vmin_Cxdelta=Cxdelta;
Vmin_sonic=sonic;
}
if(Y[5]<=0.0)
{
break;
}
}
//rk(nn,step*(-0.12));
// Vmax=Y[1];
// Vmax_Y[0]=Y[0];
// Vmax_Y[2]=Y[2];
// Vmax_Y[3]=Y[3];
// Vmax_Y[4]=Y[4];
// Vmax_Y[5]=Y[5];
// Vmax_Y[6]=Y[6];
// Vmax_Y[7]=alpha;
// Vmax_Y[8]=deltaz;
// Vmax_Hy=Hy;
// Vmax_Cx0=Cx0;
// Vmax_Cxalpha=Cxalpha;
// Vmax_Cxdelta=Cxdelta;
// Vmax_sonic=sonic;
//while(Y[5]>0.0);
printf("计算数据保存在D盘根目录下!\n");
printf("\n");
printf("最大速度点时刻的弹道诸元:\n");
printf("时间=%f 速度=%f 弹道倾角=%f 角速度=%f\n射程=%f 高度=%f 俯仰角=%f 攻角=%f 舵偏角=%f\n",Vmax_Y[0],Vmax,Vmax_Y[2],Vmax_Y[3],Vmax_Y[4],Vmax_Y[5],Vmax_Y[6],Vmax_Y[7],Vmax_Y[8]);
printf("\n");
//fprintf(ftxtfile,"最大速度点时刻的弹道诸元:\n");
//fprintf(ftxtfile,"%f %f %f %f %f %f %f %f %f\n",Vmax_Y[0],Vmax,Vmax_Y[2],Vmax_Y[3],Vmax_Y[4],Vmax_Y[5],Vmax_Y[6],Vmax_Y[7],Vmax_Y[8]);
printf("最小速度点时刻的弹道诸元:\n");
printf("时间=%f 速度=%f 弹道倾角=%f 角速度=%f\n射程=%f 高度=%f 俯仰角=%f 攻角=%f 舵偏角=%f\n",Vmin_Y[0],Vmin,Vmin_Y[2],Vmin_Y[3],Vmin_Y[4],Vmin_Y[5],Vmin_Y[6],Vmin_Y[7],Vmin_Y[8]);
//fprintf(ftxtfile,"最小速度点时刻的弹道诸元:\n");
//fprintf(ftxtfile,"%f %f %f %f %f %f %f %f %f\n",Vmin_Y[0],Vmin,Vmin_Y[2],Vmin_Y[3],Vmin_Y[4],Vmin_Y[5],Vmin_Y[6],Vmin_Y[7],Vmin_Y[8]);
printf("\n");
printf("最大速度点时刻的辅助弹道参量:\n");
printf("rho=%f Cx0=%f Cxa=%f\nCxdelta=%f Cs=%f Ma=%f\n",rhoon*Vmax_Hy,Vmax_Cx0,Vmax_Cxalpha,Vmax_Cxdelta,Vmax_sonic,Vmax/Vmax_sonic);
printf("\n");
printf("最小速度点时刻的辅助弹道参量:\n");
printf("rho=%f Cx0=%f Cxa=%f\nCxdelta=%f Cs=%f Ma=%f\n",rhoon*Vmin_Hy,Vmin_Cx0,Vmin_Cxalpha,Vmin_Cxdelta,Vmin_sonic,Vmin/Vmin_sonic);
printf("\n");
fclose(ftxtfile);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -