提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

弹箭三自由度质点弹道计算程序

作者在以前用c++写的三自由度弹道程序的基础上 模仿matlab内置的ode45函数、微分方程组写法,对c++版三自由度的弹道微分方程组和龙格库塔函数的写法进行了优化。

一、环境参数及结构特征参数

示例:
在这里选用的是155榴弹

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;        // 弹道系数

二、建立存放参数的 vector 数组及定义其它函数

2.1 存放参数的 vector 数组

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;   // 弹道倾角

2.2 声明函数

// 弹道微分方程组函数
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();

2.3 定义弹体飞行参数

double wx = 0.0;               // 纵风(m/s)
double wz = 0.0;               // 横风(m/s)
double v = 897;                // 初速(m/s)
double theat = 50 * 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)
const int NumbVars = 9;        // 参数变量个数
// 将参数初始值放入Y数组
double Y[NumbVars] = { 0,vx,vy,vz,x,y,z,P0,theat };

三、针对微分方程组函数和RK4函数展开介绍

3.1 微分方程组函数

这里的微分方程组写法模仿了matlab,大大缩小了代码量。

/*弹丸质心运动微分方程组*/
void 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 a = rho(Y[7], Y[5]) / rho0;double b = Gvcs(Y[5], v, vr);// 微分方程组dy[0] = 1.0;dy[1] = -C * a * b * (Y[1] - wx);dy[2] = -C * a * b * Y[2] - G0;dy[3] = -C * a * b * (Y[3] - wz);dy[4] = Y[1];dy[5] = Y[2];dy[6] = Y[3];dy[7] = -rho(Y[7], Y[5])*G0*Y[2];dy[8] = -G0 * cos(Y[8]) / v;
}

3.2 RK4函数

这里的龙格库塔函数模仿了matlab中的ode45函数的写法,同样极大地缩小了代码量。

void RK4(double rk_step)
{// rk_step为dt,时间步长double a[4], old_y[NumbVars], Y1[NumbVars], *dy;int i, j;a[0] = rk_step / 2; a[1] = rk_step / 2; a[2] = rk_step; a[3] = rk_step;dy = (double*)calloc(NumbVars, sizeof(double));dery(NumbVars, dy, Y);for (i = 0; i < NumbVars; i++)  old_y[i] = Y[i];for (j = 0; j < 3; j++){for (i = 0; i < NumbVars; i++){Y1[i] = old_y[i] + a[j] * dy[i];Y[i] = Y[i] + a[j + 1] * dy[i] / 3;}dery(NumbVars, dy, Y1);}for (i = 0; i < NumbVars; i++)  Y[i] = Y[i] + a[0] * dy[i] / 3;free(dy);
}

四、仿真运行结果

开始运行三自由度弹道程序:


仿真结果文件位置:

仿真结果曲线:

1)射程-射高


2)时间-速度


3)时间-弹道倾角

弹箭三自由度弹道计算程序(c++ vs2017 )相关推荐

  1. 弹箭六自由度弹道计算程序(c++,vs 2017)

    以前写弹道程序都是使用 matlab,前两天心血来潮,突然想编写一个c++编写的六自由度弹道程序,所用时间大概3天左右,好了,不废话了,开始进入正题- 1.参考文献 使用的参考书是韩子鹏编写的< ...

  2. 炮弹仿真系统matlab软件下载,基于Matlab/Simulink的导弹六自由度弹道仿真系统设计...

    第 11 卷 第 1 期 2011 年 1 月 1671-1815( 2011) 1-0029-06 科 学 技 术 与 工 程 Science Technology and Engineering ...

  3. 基于matlab_simulink汽车三自由度模型仿真

    汽车三自由度操控模型 1.1建模假设: •1.汽车车速不变 . •2.不考虑切向力对轮胎特性的影响.  •3.侧向加速度不大于0.3-0.4g . •4.前轮转角不大,不考虑前轮左右的区别.  •5. ...

  4. 【机器人学习】 四足机器人(单腿三自由度)正运动学与轨迹规划仿真(solidwork三维模型+matlab代码)

    资料下载链接 solidworks三维模型 clear; clc close all % theta d a alpha qlim offset L(1) = Link( 'd', 0 , 'a' , ...

  5. 基于matlab的全阶观测器三自由度运动系统状态反馈控制系统的仿真

    目录 一.理论基础 二.核心程序 三.仿真测试结果 作者ID :fpga和matlab CSDN主页:https://blog.csdn.net/ccsss22?type=blog 擅长技术: 1.无 ...

  6. 10000多套机械手毕业设计 课程设计 毕业论文 图纸 分享/上下料机械手、搬运机械手、苹果采摘机械手、液压机械手、三自由度机械手、水果采摘机械手、六自由度机械手、焊接机械手、码垛机械手、四自由……

    10000多套机械手毕业设计 课程设计 毕业论文 图纸 分享/部分清单如下: 车床上下料机械手毕业设计全套(设计说明书(论文)+CAD图纸+PLC接线图+液压系统图+外文翻译) 搬运机械手及其控制系统 ...

  7. python实现飞行控制仿真(二)——三自由度仿真

    一.问题:利用python实现三自由度 [总结不对的地方请评论或私信我,谢谢!] 三自由度中简化的几个问题 1.3个控制量,(相比较6自由度中会使用4个控制量),三自由度中一般使用推力.升力和滚转角来 ...

  8. matlab实现三自由度机械臂旋转

    matlab实现三自由度的机械臂旋转 1 内容与要求 根据表一机械臂长度,以及图一机械臂配置为机械臂开发一个控制器,使其能够执行特定的任务.更具体地说,让机械臂的末端执行器移动到特定的点.项目要求: ...

  9. 【机器人学习】三自由度康复机器人运动学分析()

    具体内容如下: 下载链接 带matlab代码+solidworks模型 1.三自由度康复机器人运动学分析 ( 用q1代替,其他类似) Nx=cos(q3)*(cos(q1)*cos(q2) - sin ...

  10. 汽车转弯操纵稳定性三自由度模型魔术轮胎

    2.2.1 魔术轮胎 汽车轮胎是车辆和路的接触媒介,对车辆的动力学有着重要的影响,在本文的三自由度模型中,建立魔术轮胎,魔术公式的统一表达形式为: 其中,B为轮胎刚度因子,C轮胎曲线形状因子,D曲线峰 ...

最新文章

  1. pacman 查询_pacman包管理常用命令
  2. 蒙特卡洛算法贡献者之一Arianna Rosenbluth逝世 | AI日报
  3. 详解Spring Boot配置文件之多环境配置
  4. zoj-4011(动态规划)
  5. 中国程序员如何升职加薪,也许我们该学学印度人
  6. 浅谈巴拿马电源的谐波消除原理
  7. Python语言编程学习:文件路径变量修改,利用os模块固定文件父路径,变换文件子路径实现代码
  8. 发布地图服务属性表_Web3D地图来了!腾讯位置服务正式版发布!
  9. bzero, memset ,setmem 区别【转】
  10. CTF入门--请输入密码
  11. 关于flock文件锁的阻塞与非阻塞
  12. 字符串操作之字符串连接
  13. 2017 ICPC西安区域赛 A - XOR (线段树并线性基)
  14. spyder配置说明_Spyder学习使用总结
  15. 阿里云认证多少分能通过?考试题库在哪里找?
  16. 东方博宜OJ 1056 - 【入门】所有不超过1000的数中含有数字3的自然数
  17. webgl中解决深度冲突-多边形偏移
  18. 推荐编程使用紫光输入法
  19. arm汇编标号globel和word解释
  20. 多线程抢票_java多线程下模拟抢票

热门文章

  1. 笔记本显示器亮度调节脚本
  2. php取名字的姓,【更新】爬取姓名大全的名字
  3. 交换机、路由器和防火墙的原理和区别
  4. java异常之-Caused by: java.lang.IllegalStateException: Method has too many Body parameters
  5. 看完你就知道交换机端口该搭配什么光模块了
  6. 通讯:白先勇的“八千里路云和月”
  7. 接上一章winhex数据恢复新手入门教程
  8. 【Laravel笔记】13. 模型的关联写入
  9. 乔治城大学计算机专业,美国乔治城大学计算机
  10. 1155 服务器芯片组,2014年主流主板芯片组分析