【数学建模】通过调整飞行角度使飞机顺利飞行(Matlab)

题目

在约10000米的高空的某边长为160公里的正方形区域内,经常有若干架飞机作水平飞行,区域内每架飞机的位置和速度向量均有计算机记录其数据,以便进行飞行管理。当一架欲进入该区域的飞机到达区域边缘时,记录其数据后,要立即计算并判断是否会与区域内的飞机发生碰撞,如果会碰撞,则应计算如何调整每架(包括新进入的)飞机飞行角度的方向角,以避免碰撞。现假定条件如下:
①不碰撞的标准为任意两架飞机的距离大于8公里
②飞机飞行方向角调整的幅度不应该超过30度
③所有飞机飞行速度均为每小时800公里
④进入该区域的飞机在到达区域边缘时与区域内飞机的距离应在60公里以上
⑤最多需考虑6架飞机
⑥不必考虑飞机离开此区域后的情况
请你对这个碰撞的飞行管理问题建立数学模型,列出计算步骤,要求飞机飞行方向角调整的幅度尽量小。并对一下数据进行计算(方向角误差不超过0.01°)

建模过程

1.问题重述
此题的目的是通过调整区域内(包括即将进入区域)的飞机的飞行角度,避免其在区域内飞行过程中发生碰撞,且要求飞行角度调整尽可能小。

2.模型假设
(1)假设区域内所有飞机都沿水平直线正常飞行(不考虑意外坠毁等情况)。
(2)若飞机需要进行飞行角度调整,则假定在角度调整过程中飞机速度不变。
(3)不考虑天气状况(不稳定气流,暴雨等)对飞机飞行造成的影响。
(4)假设新的飞机进入区域边缘时,区域内其他飞机的飞行方向和角度都合适。
(5)假设每架飞机最多只改变一次飞行角度。
(6)飞机进入边缘时就对飞机的方向角进行调整。

3.符号解释
在这里插入图片描述4.模型建立
飞机在10000米的高空,边长为160公里的正方形区域内飞行,因飞行高度与此题求解无关,所以可以不考虑天空高度,建立xoy平面直角坐标系模拟飞机的飞行区域。
以飞机每一时刻的所在点为圆心,4公里为半径绘制圆形,区域中的圆形相交等价于飞机发生碰撞。
因为飞机在飞行过程中的位置受飞行角度,飞行时间的影响,但飞行角度在新的飞机进入区域的那一刻就会进行调整且在飞行过程中固定,所以飞机的位置坐标可以看做飞行时间t的函数。
此题为优化问题,目标函数为 。6个约束条件等价的数学约束如下:
在这里插入图片描述

模型求解

hwf1:目标函数
function y=hwf1(seta)
for i=1:6
    y=seta(i).^2;
end
end

hw3_main:主程序
clear,clc;
x0=zeros(1,6);
lb=zeros(1,6);
ub=[(pi/6).^2 (pi/6).^2 (pi/6).^2 (pi/6).^2 (pi/6).^2 (pi/6).^2];
[x,fval]=fmincon(@hwf1,x0,[],[],[],[],lb,ub,@hwf2)

hwf2:非线性约束
function [c,ceq]=hwf2(seta)
m=[150 85 150 145 130 0];
n=[140 85 155 50 150 0];
seta0 = [243 236 220.5 159 230 52]*pi/180;
c=[];x=[];y=[];
cc=cos(seta0+seta);ss=sin(seta0+seta);
for t=0:0.001:160*sqrt(2)/800
    for i=1:length(m)
        for j=i+1:length(m)
            c=[c 64-((m(i)-m(j)+800*t*(cc(i)-cc(j)))^2+(n(i)-n(j)+800*t*(ss(i)-ss(j)))^2)];
        end
    end
end
ceq=0;
end
  • 9
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
飞行员空中弹射问题是一类典型的空气动力学问题,在飞行器事故中具有重要的应用价值。为了提高飞行员的生存率,在飞行器发生故障时,需要在最短时间内将飞行员弹射出去。本文将针对飞行员空中弹射问题进行优化,利用数学建模方法进行求解,并使用MATLAB进行代码实现。 问题描述: 考虑一架飞机飞行过程中发生故障,飞行员需要在最短时间内从机舱中弹射出来。假设飞行员弹射出机舱后,其高度为 $h_0$,速度为 $v_0$,初始角度为 $\theta$,弹射位置与机舱相对位置为 $x_0$。在空气阻力的作用下,飞行员的轨迹满足以下运动方程: $$ \begin{cases} \ddot x = -\frac{1}{2}C_d\rho Ae^{-\frac{y}{H}}\dot x\sqrt{\dot x^2+\dot y^2} \\ \ddot y = -g-\frac{1}{2}C_d\rho Ae^{-\frac{y}{H}}\dot y\sqrt{\dot x^2+\dot y^2} \end{cases} $$ 其中,$x$ 和 $y$ 分别为飞行员的水平和竖直位置,$\dot x$ 和 $\dot y$ 分别为飞行员的水平和竖直速度,$A$ 为飞行员的横截面积,$C_d$ 为飞行员的阻力系数,$\rho$ 为空气密度,$H$ 为大气尺度高度,$g$ 为重力加速度。 优化目标: 求出在给定的初始条件下,飞行员从机舱弹射出来后,最短时间内到达地面的位置。 数学建模: 为了求解该问题,我们需要将其转化为数学模型。首先,我们可以将运动方程进行化简: $$ \begin{cases} \frac{\mathrm{d}^2x}{\mathrm{d}t^2} = -\frac{1}{2}C_d\rho A\frac{\mathrm{d}x}{\mathrm{d}t}\sqrt{\left(\frac{\mathrm{d}x}{\mathrm{d}t}\right)^2+\left(\frac{\mathrm{d}y}{\mathrm{d}t}\right)^2} \\ \frac{\mathrm{d}^2y}{\mathrm{d}t^2} = -g-\frac{1}{2}C_d\rho A\frac{\mathrm{d}y}{\mathrm{d}t}\sqrt{\left(\frac{\mathrm{d}x}{\mathrm{d}t}\right)^2+\left(\frac{\mathrm{d}y}{\mathrm{d}t}\right)^2} \end{cases} $$ 然后,我们可以利用欧拉法对运动方程进行数值求解。具体来说,我们可以将时间 $t$ 离散化,得到下面的差分方程: $$ \begin{cases} x_{i+1} = x_i + \Delta t\dot x_i \\ \dot x_{i+1} = \dot x_i - \frac{1}{2}C_d\rho A\Delta t\dot x_i\sqrt{\dot x_i^2+\dot y_i^2} \\ y_{i+1} = y_i + \Delta t\dot y_i \\ \dot y_{i+1} = \dot y_i - g\Delta t - \frac{1}{2}C_d\rho A\Delta t\dot y_i\sqrt{\dot x_i^2+\dot y_i^2} \end{cases} $$ 其中,$i$ 表示时间步数,$\Delta t$ 表示时间步长。在上述差分方程中,我们可以利用初始条件 $x_0, y_0, \dot x_0, \dot y_0$ 进行迭代求解。 最后,我们可以利用二分法求解最短时间。具体来说,我们可以不断调整弹射角度 $\theta$,然后利用上述差分方程进行数值求解,求出飞行员到达地面的位置。如果到达地面的位置小于某个阈值,则认为该弹射角度合法。然后,我们可以不断缩小角度范围,最终得到最短时间的弹射角度MATLAB代码实现: 下面是该问题的MATLAB代码实现。其中,我们将时间步长 $\Delta t$ 设置为 $0.01$,时间总长设置为 $100$,弹射角度范围设置为 $[0, 90]$,阈值设置为 $10$。关于其他变量的具体值,可以根据实际情况进行设置。 ```matlab % 飞行员空中弹射问题求解 % 作者:AI算法工程师 clear all; clc; %% 参数设置 % 初始条件 h0 = 25000; % 飞行员弹射高度(m) v0 = 200; % 飞行员弹射速度(m/s) x0 = 0; % 弹射位置与机舱相对位置(m) g = 9.8; % 重力加速度(m/s^2) Cd = 0.5; % 飞行员阻力系数 A = 0.1; % 飞行员横截面积(m^2) H = 8000; % 大气尺度高度(m) rho = 1.225; % 空气密度(kg/m^3) dt = 0.01; % 时间步长(s) tmax = 100; % 时间总长(s) theta_min = 0; % 弹射角度范围(度) theta_max = 90; threshold = 10; % 最短时间阈值(m) %% 求解最短时间 theta = (theta_min + theta_max) / 2; % 初始角度 t = 0:dt:tmax; % 时间向量 x = x0 + v0 * cosd(theta) * t; % 水平位置 y = h0 + v0 * sind(theta) * t - 0.5 * g * t.^2; % 竖直位置 vx = v0 * cosd(theta); % 水平速度 vy = v0 * sind(theta) - g * t; % 竖直速度 for i = 1:length(t) - 1 % 欧拉法求解运动方程 vx(i + 1) = vx(i) - 0.5 * Cd * rho * A * vx(i) * sqrt(vx(i)^2 + vy(i)^2) * dt; vy(i + 1) = vy(i) - g * dt - 0.5 * Cd * rho * A * vy(i) * sqrt(vx(i)^2 + vy(i)^2) * dt; x(i + 1) = x(i) + vx(i + 1) * dt; y(i + 1) = y(i) + vy(i + 1) * dt; % 判断是否到达地面 if y(i + 1) < 0 break; end end if x(end) < threshold % 到达地面的位置小于阈值,则认为该角度合法 fprintf('最短时间角度为 %.2f 度\n', theta); else % 否则,继续二分法搜索 if x(end) > threshold && x(end - 1) < threshold fprintf('最短时间角度为 %.2f 度\n', theta); elseif x(end) < threshold && x(end + 1) > threshold fprintf('最短时间角度为 %.2f 度\n', theta); elseif x(end) > threshold theta_min = theta; theta = (theta_min + theta_max) / 2; elseif x(end) < threshold theta_max = theta; theta = (theta_min + theta_max) / 2; end end %% 绘制轨迹图 figure(1); plot(x, y); xlabel('水平位置(m)'); ylabel('竖直位置(m)'); title('飞行员空中弹射问题轨迹图'); ``` 参考文献: [1] 肖林, 张洪波. 基于MATLAB数学建模实例. 电子工业出版社, 2014. [2] 李庆华, 陈立奇, 李绍林. 数学建模算法与应用. 科学出版社, 2014.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值