⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 标准弹道.cpp

📁 在无投弹误差条件下
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************/
/*                       三自由度包络计算模块                                 */
/*                                                                            */
/*                           作者:胡锐                                       */ 
/*                                                                            */
/*                        时间:2006年5月22日                                  */
/******************************************************************************/

#include <math.h>
#include <stdio.h>
#include <malloc.h>
#include <fstream.h>                                              //输入输出流

double ACX[7][5]={{0.1659  ,  0.1725  ,  0.1963  ,  0.3507 ,   0.5381},  //0
    {0.1809  ,  0.1859  ,  0.2092  ,  0.3674 ,   0.5486},              //2
    {0.2066  ,  0.2141  ,  0.2375  ,  0.4014 ,   0.5841},              //4
    {0.2525  ,  0.2641  ,  0.2902  ,  0.4536 ,   0.6408},              //6
    {0.3140  ,  0.3296  ,  0.3636  ,  0.5310 ,   0.7293},              //8
    {0.4661  ,  0.4943  ,  0.5395  ,  0.7143 ,   0.9184},              //11
    {0.6846  ,  0.7332  ,  0.7911  ,  0.9770 ,   1.1594}};             //14   阻力系数CX
  
double ACY0[2][5]={{  0.6,    0.8,    0.9,    1.0,    1.15},
{ 0.08028,	0.08316,0.08506	,0.08767	,	0.09362 }};    //升力系数CY0

double ACY1[2][5]={{  0.6,    0.8,    0.9,    1.0,    1.15},
                  { 2.24162e-4, 2.39065e-4, 2.47800e-4, 2.36159e-4, 1.81134e-4}};    //升力系数CY1

double Mzdetla1[2][5]={{  0.6,    0.8,    0.9,    1.0,    1.1},       //俯仰诱导系数                  
                  {0.1306,0.1347,0.1379,0.1560,0.1421}};

double Mzalpha[7][5]={{-0.0484,-0.0486,-0.0498,-0.0579,-0.0665},      //攻角0度
{-0.06357,-0.06277,-0.06462,-0.07577,-0.08510},                   //2
{-0.08634,-0.09101,-0.08981,-0.10069,-0.1172},                    //4
{-0.11237,-0.11807,-0.11624,-0.12293,-0.14747},                   //6
{-0.13840,-0.13884,-0.13876,-0.13802,-0.16468},                   //8    
{-0.15742,-0.15094,-0.15642,-0.14492,-0.17674},                   //10
{-0.16331,-0.16147,-0.16290,-0.15236,-0.18441}};                  //12

double Mzdetla[7][5]={{-0.1306,-0.1347,-0.1379,-0.156,-0.1421},       //攻角0
{-0.12911,-0.13781,-0.14806,-0.16250,-0.14855},                   //2
{-0.13314,-0.14157,-0.15050,-0.16712,-0.15432},                   //4
{-0.13457,-0.14461,-0.15454,-0.17047,-0.15807},                   //6
{-0.13870,-0.14912,-0.15816,-0.17657,-0.16393},                   //8
{-0.14348,-0.15382,-0.16144,-0.18164,-0.17088},                   //10
{-0.14996,-0.15897,-0.16849,-0.18717,-0.17770}};                  //12                   


double Y[6],SONIC,RHO;
double GJ[7]={0.000,2.000,4.000,6.000,8.000,10.000,12.000};                    //alpha攻角
double MHS[5]={0.6,0.8,0.9,1.0,1.15};                                             //Ma值
double MA,ABC_ALPHA,CX,CY0,CY1,ALPHA;
double dX=0, dY=0, dTheta=0,guozai=0;
double deta_X,deta_Y,deta_V;                                                     //投弹时的误差
FILE *fo;

void rk(int ,double,double );                                                    //四阶龙格库塔法子程序
void dery(double* ,double*,double );                                             //计算微分方程组右端函数值
void interp();                                                                   //调用插值函数
double int32(double ,double ,int ,int ,double GJ[],double MHS[],double AC[][5]); //双变元不等距线性插值
double int31(double A[],double XS[][5],int N1,int N2,int ,double );              //单变元不等距抛物线插值
double int11(double yy[][5],int n, double x);
void solve(double V, double H, double ALPHA, double deta_x, double deta_y, double deta_v);
void result(double);
/*************************************************************************************/
/*                             主函数设置参数计算弹道                                */
/*                                  main()                                           */
/*************************************************************************************/
void main(void)
{
	/*打开文件输出结果的目录*/

	fo=fopen("标准弹道计算.txt","w");
/*	fprintf(fo,"%s","  Time	   Ma    ALPHA         X         dX           Y          dY         V          THETA     dTHETA    guozai");
	fprintf(fo,"\n");
	fprintf(fo,"%s","    s	           。          m         m/s          m          m/s        m/s        rad	    rad/s     ");
	fprintf(fo,"\n");
	fprintf(fo,"\n");
	fprintf(f1,"%s","  攻角           时间	        射程        垂直速度         过载        合速度");
	fprintf(f1,"\n");
	fprintf(f1,"%s","    。             s             m            m/s               ");
	fprintf(f1,"\n");
*/
    solve(800,4000, 0, 0, 0, 0); 	

    fclose(fo);
}
/*************************************************************************************/
/*                             调用进行弹道计算                                      */
/*                                 solve()                                           */
/*                                无返回值                                           */
/*************************************************************************************/
void solve(double V,double H, double ALPHA, double deta_x, double deta_y, double deta_v)
{	
	double h=0.02,t2000,t75;
	double alpha1[4]={0,-6.0,0,0};
	Y[0]=0;                                                        //时间     *
	Y[1]=sqrt(((V+deta_v)/3.6)*((V+deta_v)/3.6)+16);               //合成速度 *
	Y[2]=-atan(14.4/(V+deta_v));                                   //弹道倾角 ***置初始值
	Y[3]=deta_x;                                                   //射程     *
	Y[4]=H+deta_y;                                                 //高度     *
	
	while(Y[4]>=2000)
	{             
//    	for(int i=0;i<=10000;i++)                                  //可进行不同步长时的定时间值取出
//		{
//			if(fabs(Y[0]-0.02*i)<=0.00000001)  
//			result(ALPHA);
//		}
        rk(5,h,ALPHA);                                             //调用龙格库塔法
		result(ALPHA);
//		ALPHA=ALPHA0;        
	}
	
	t2000=Y[0];
	while(Y[2]>=-1.1&& Y[4]>=0.0)
	{
		ALPHA=alpha1[1]+(alpha1[0]-alpha1[1])*exp(-2.0*(Y[0]-t2000));
		
		rk(5,h,ALPHA);
		result(ALPHA);
	}
	
	t75=Y[0];
	alpha1[2]=ALPHA;	
	
	while(Y[4]>=0)
	{
		ALPHA=alpha1[3]+(alpha1[2]-alpha1[3])*exp(-2.0*(Y[0]-t75));
		
		rk(5,h,ALPHA);
        result(ALPHA);
	}
}
/*************************************************************************************/
/*                             四阶龙格库塔法子程序                                  */
/*                                    rk()                                           */
/*                                  无返回值                                         */
/*************************************************************************************/
void rk(int n,double h,double ALPHA)
{
	double a[4],old_y[5],Y1[5],*dy;
	int i,j;
	dy=(double*)calloc(n,sizeof(double));                         //定义一个n长的空间
	a[0]=a[1]=h/2;
	a[2]=a[3]=h;
	dery(dy,Y,ALPHA);                                             
	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;
		}
		dery(dy,Y1,ALPHA);
	}
	for(i=0;i<n;i++)
	Y[i]=Y[i]+a[0]*dy[i]/3;
	free(dy);
	return;	
}
/*************************************************************************************/
/*                         计算微分方程组右端函数值                                  */
/*                                dery()                                             */
/*                    无返回值,用于获取龙格库塔法中的K1-K4                          */
/*************************************************************************************/
void dery(double dy[],double Y[],double ALPHA)
{
	double q,a[2],XF,YF,g,S,L;
	L=2.2;                                                     //弹长

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -