[学习笔记]非线性规划实例——飞行管理问题

一、题目阐述

在这里插入图片描述
在这里插入图片描述二、题目分析
(1)假设条件:
1、忽略飞机的体积,转角时间的问题。
2、新飞机在进入时,所有飞机完成飞行路线调整。
3、一次就调整到位,直到下一个飞机进入区域。
(2)模型选择:飞机的位置由初始方向、调整方向、飞行速度,时间确定。判断是否相撞,可以通过判断任意两架飞机距离是否大于8公里。可以由此确定该问题是非线性规划问题。
(3)构建模型:为了保证调整幅度最小,目标函数应设置为:
Min z = ∑|△Θi| (i=1、2、3、4、5、6)
为了保证飞机在题设条件下不相撞,约束条件设置为:
Min dij(t)>8 距离大于8公里
△Θi<[-Π/6,Π/6] 角度不超过30°
构建Min dij(t)模型(纯数学问题):设某架飞机的初始坐标是(x,y)、飞机的初始角度是theta、角度变化量是delta、飞机速度已知为v、记时间为t。飞机在t时间的位置是:(x+vtcos(theta+delta),yi+vtsin(theta+delta))
设置两架飞机的角标为i、j,两架飞机的向量是:
{[xi-xj+vt[cos(theta i+delta i )-cos(theta j+delta j )],[yi-yj+vt[sin(theta i+delta i )-sin(theta j+delta j )]}
并且很容易求得其欧式距离。
令:
A = [xi-xj+vt[cos(theta i+delta i )-cos(theta j+delta j )]
B = [yi-yj+vt[sin(theta i+delta i )-sin(theta j+delta j )]
A1 = cos(theta i+delta i )-cos(theta j+delta j )
A2 = sin(theta i+delta i )-sin(theta j+delta j )
L = A2+B2(平方不好打…)
在其他条件确定、只有t为变量的情况下对两架飞机之间的距离求导:
dL/dt = AvA1+BvB1;
Ⅰ、dL/dt > 0 :在t = 0 时,取得距离最小值,但是由于初始状态之下每一架飞机间隔距离都>8公里,所以不会相撞。
Ⅱ、dL/dt = 0 :在t使得dL/dt = 0时,取得距离最小值。
为了方便计算,移项化成“t”的不等式。如下:
fenzi = ((y(j)-y(i))(si(j)-si(i)) +(x(j)-x(i))(co(j)-co(i))) ; % 分子
fenmu = v * ((co(j)-co(i))^2 + (si(j)-si(i))^2); % 分母
t(i,j) =- fenzi / fenmu;
三、matlab代码实现
(1)绘制机场图:

%% 画出六架飞机
clear;clc
figure(1) %生成一个图像
%存储有关于飞机的数据坐标、角度
data = [150 140 243
    85  85  236
    150 155 220.5
    145 50  159 
    130 150 230
    0   0   52];
plot(data(:,1),data(:,2),'.r')
axis([0 160,0,160]);% 设置坐标轴刻度范围
hold on;
for i = 1:6
    txt = ['飞机',num2str(i)];
    text(data(i,1)+2,data(i,2)+2,txt,'FontSize',8)
end

在这里插入图片描述

(2)设置目标函数:

function f=fun1(delta)
    f = sum(abs(delta))*180/pi;
end

(3)设置约束条件

function [c,ceq] = nonlfun1(delta) %决策变量是六个飞机的变化角度
     x = [150 85 150 145 130  0]; % 飞机初始位置的横坐标
     y = [140 85 155  50 150  0]; % 飞机初始位置的纵坐标
     theta = [243 236 220.5 159 230 52] * pi / 180; % 飞机初始的飞行方向角
     v=800;
     co = cos(theta + delta);  % 包含6个元素的向量
     si = sin(theta + delta);  % 包含6个元素的向量
     d = zeros(6);  % 初始化飞机两两之间的最短距离矩阵
     for i = 2: 6
         for j = 1: i-1
             % 套用我们推导出来的公式计算飞机i和飞机j相距最近的时间
             fenzi = ((y(j)-y(i))*(si(j)-si(i)) +(x(j)-x(i))*(co(j)-co(i))) ;  % 分子
             fenmu =  v * ((co(j)-co(i))^2 + (si(j)-si(i))^2);  % 分母
             t(i,j) =- fenzi / fenmu;
             if t(i,j) <0  
                 d(i, j) = 1000; 
             else
                 d(i, j) = sqrt((x(j)-x(i)+v*t(i,j)*(co(j)-co(i)))^2+(y(j)-y(i)+v*t(i,j)*(si(j)-si(i)))^2); 
             end 
         end
     end
     %非线性不等式约束条件
     c = ones(15,1)*8.000001-[d(2,1);d(3,1:2)';d(4,1:3)';d(5,1:4)';d(6,1:5)'];
     % 15表示15种飞机匹配方式,取值为8.000001表示大于题设条件8
     %无非线性等式约束
     ceq=[];
end

几个处理细节:
1.当t>0时表示两架飞机越来越远,设置距离为1000表示无论如何两架飞机都不可能相撞。
2.设置距离8.000001表示距离即使是最小值也略大于8千米。
3.注意sin和cos函数的参数是弧度制,要注意角度制的转换。
4.名称尽量设计的短!尤其是遇到长的公式!!!
(3)主函数设置

%% 求解非线性规划问题
x0 = [0 0 0 0 0 0];  % 初始值
lb = -pi/6*ones(6,1);
ub = pi/6*ones(6,1);
[x,fval] = fmincon(@fun1,x0,[],[],[],[],lb,ub,@nonlfun1)
x = x * 180 / pi    % 将弧度转换为度数
  • 16
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值