155榴弹外弹道仿真实验:
#ifndef BALLISTIC_3DOF_H
#define BALLISTIC_3DOF_H
#include <QVector>
#include <cmath>
#include "us76_stdair.h"
class Ballistic_3Dof
{
public:
Ballistic_3Dof();
stdAir air;
const double PI = 3.1415926;
const double G0 = 9.7803253359; // 地球表面重力加速度(m/s2)
const double rho0 = 1.205; // 地面大气密度(kg/m3)
const double T0 = 288.15; // 地面温度(K)
const double tatal0 = 289.1; // 地面虚温(K)
const double P0 = 0.1e6; // 地面气压(MPa)
const double R1 = 287; // 空气常数 J/KG/K
const double k = 1.4;
double i = 0.85; // 榴弹弹形系数
double G = 6.328e-3;
double Mass = 45.54; // 弹丸重量(kg)
double D = 0.15494; // 弹丸口径(m)
double C = i*D*D * 1000 / Mass; // 弹道系数
std::vector<double> t_s; // 时间
std::vector<double> vx_s; // 速度在x轴上的分量
std::vector<double> vy_s; // 速度在y轴上的分量
std::vector<double> vz_s; // 速度在z轴上的分量
std::vector<double> y_s; // 射高
std::vector<double> x_s; // 射程
std::vector<double> z_s; // 横偏
std::vector<double> v_s; // 速度
std::vector<double> theat_s; // 弹道倾角
double wx = 0.0; // 纵风(m/s)
double wz = 10.0; // 横风(m/s)
double wy = 0.0;
double v = 864; // 初速(m/s)
double theat = 40 * PI / 180; // 初始弹道倾角(deg)
double x = 0; // 水平距离(m)
double y = 0; // 垂直距离(m)
double z = 0; // 横偏距离(m)
double P = P0; // 压强(MPa)
double vx = v * cos(theat); // 速度在x轴上的分量
double vy = v * sin(theat); // 速度在y轴上的分量
double vz = 0; // 速度在z轴上的分量
double dt = 0.01; // 步长(s)
double ct = 0; // 初始时间(s)
double vr;
const static int NumbVars = 9; // 参数变量个数
// 将参数初始值放入Y数组
double Y[NumbVars] = { 0,vx,vy,vz,x,y,z,P0,theat };
// 弧度转角度
double RadToDeg(double rad);
// 角度转弧度
double DegToRad(double deg);
// 弹道微分方程组函数
void dery(int n, double dy[], double Y[]);
// 龙格库塔函数
void RK4(double rk_step);
// 虚温随高度变化函数
double tatal(double y);
// 空气密度函数
double rho(double P, double y);
// 声速
double Cs(double y);
// 阻力函数
double Gvcs(double y, double v, double vr);
// 相对速度
double Vr(double vx, double vy, double vz, double wx, double wz);
// 绝对速度
double Velocity(double vx, double vy, double vz);
// 仿真计算程序函数
void calculateReentry();
// 输出结果文件
void outData();
double int11(double YY[][2],int n,double x);
};
#endif // BALLISTIC_3DOF_H
/*弹丸质心运动微分方程组*/
void Ballistic_3Dof::dery(int n, double dy[], double Y[])
{
v = Velocity(Y[1], Y[2], Y[3]);
vr = Vr(Y[1], Y[2], Y[3], wx, wz);
double H = rho(Y[7], Y[5]) / rho0;
double G = Gvcs(Y[5], v, vr);
// 微分方程组
dy[0] = 1.0; //t
dy[1] = -C * H * G * (Y[1] - wx); //vx
dy[2] = -C * H * G * Y[2] - G0; //vy
dy[3] = -C * H * G * (Y[3] - wz); //vz
dy[4] = Y[1]; //x
dy[5] = Y[2]; //y
dy[6] = Y[3]; //z
dy[7] = -rho(Y[7], Y[5])*G0*Y[2]; //压强
dy[8] = -G0 * cos(Y[8]) / v; //弹道倾角
}
实验结果: