2023年数维杯国际大学生数学建模挑战赛
A题 复合直升机的建模与优化控制问题
原题再现:
直升机具有垂直起降等飞行能力,广泛应用于侦察、运输等领域。传统直升机的配置导致旋翼叶片在高速飞行过程中受到冲击波的影响,难以稳定飞行。为了在保持直升机灵活飞行能力的同时发展其高速飞行能力,将固定翼与旋翼相结合的复合直升机的设计已成为发展的重要方向。
同轴直升机是一种典型的复合型直升机。这种配置主要由四个动力部件组成:同轴刚性转子、螺旋桨推进器以及水平和垂直尾翼。螺旋桨推进器的中心以及水平和垂直尾翼都位于飞行器机身的对称平面上。飞行机器的姿态角是指飞行过程中的滚转角ξ、俯仰角θ和偏航角ψ,相应的力矩称为滚转力矩、俯仰力矩和偏航力矩(如图1所示)。四个功率分量对飞行器姿态角的影响如下:1)同轴刚性转子产生的气动力矩可以近似为与空气密度ρ、转子盘面积和转子叶尖速度成正比的函数,正比例因子称为转子力矩因子。2) 螺旋桨推进器通过旋转产生推力和旋转力矩。3) 水平尾翼装有升降舵控制装置,可调节水平尾翼的相对角度以提供俯仰力矩。该力矩与动压、水平尾翼面积和水平尾翼与质心之间的横向距离成比例,比例系数称为水平尾翼力矩系数。4) 与水平尾翼类似,垂直尾翼通过安装方向舵控制装置来调节相对角度,从而提供偏航/滚转力矩。该力矩与动压、垂直尾翼面积以及垂直尾翼与质心之间的横向/纵向距离成比例,比例系数称为垂直尾翼力矩系数。
复合材料直升机的可操纵部件如下:(1)同轴旋翼总距离u_c,(2)同轴旋翼差速总距离u_cd,(3)同轴旋翼纵向周距u_e,(4)同轴旋翼横向周距u_a,(5)螺旋桨推进器工作能力u_t,(6)升降舵偏转值u_eh,(7)方向舵偏转值uav。根据直升机的飞行速度,在低速模式下(通常指85米/秒以下的速度),姿态角控制主要通过同轴转子和螺旋桨推进器实现。在高速模式下(一般指100米/秒以上的速度),姿态角控制主要通过螺旋桨推进器、升降舵和方向舵实现。
有一个同轴复合材料直升机原型的例子,该飞行器的一些空气动力学系数和机身参数已通过风洞实验获得,如附录I所示。
B、 标题数据
参见附录I。
C、 需要解决的问题
1、在给定参数的情况下,建立了复合直升机俯仰力矩表达式,建立了俯仰角变化模型。请提供飞行器在5s、10s和20s时的姿态角(初始飞行高度3000米,飞行速度前向分量80米/秒,垂直上升分量2米/秒,u\u c=0度、u\u cd=−2.1552度、u\u e=−3.4817度、u\u a=−2.0743度、u\u t=0度、u\u eh=−9.0772×10−7度、u\u av=4.1869×10−7度)
2、在给定参数的基础上,建立了复合直升机横摇、俯仰和偏航力矩的表达式,并建立了姿态角变化模型。请提供飞行器在5s、10s和20s时的姿态角(初始飞行高度3000米,飞行速度前向分量80米/秒,垂直上升分量0.2米/秒,u\u c=0度、u\u cd=–2.1552度、u\u e=–3.4817度、u\u a=–2.0743度、u\u t=0度、u\u eh=–9.0772×10−7度、u\u av=4.1869×10−7度)。
3、根据直升机在低速和高速飞行时的机动特性,设计各部件的机动幅度,以满足飞行器的水平飞行任务(零姿态角)(初始飞行高度3000米,飞行速度前向分量80米/秒,垂直上升分量0.2米/秒;初始飞行高度3000米,飞行速度前向分量180米/秒,垂直上升分量0.2米/秒)。
4、考虑到直升机的加速度机动任务,当飞行速度前向分量在20秒内从80米/秒均匀增加到180米/秒(假设前向加速度完全由螺旋桨助推器提供)时,请根据直升机在低速和高速飞行(初始飞行高度3000米,飞行垂直上升分量率0.2米/秒)时的机动特性,设计每个控制输入的动态值,以实现飞机的前向加速度和水平飞行(零姿态角)。
整体求解过程概述(摘要)
利用复合直升机的气动参数和机身参数对复合直升机进行力学分析,建立直升机的动力学微分方程,进而导出直升机姿态角变化模型。它还提供了不同时间点的姿态角数据,并规定了直升机各部件的控制值,以确保直升机顺利完成飞行任务。
问题1:该问题要求建立直升机俯仰角变化模型,并提供特定时刻的特定俯仰角。在给定的基本条件下,分析了作用在直升机上的俯仰力矩。我们将俯仰力矩视为旋翼产生的气动力矩和水平尾翼的俯仰力矩之和。我们分别计算这两个力矩分量,得到总力矩。根据力矩与角加速度的关系,建立了直升机的动力学微分方程。通过求解该微分方程,得到了俯仰角的变化模型。
问题2:该问题要求建立直升机三种不同姿态角变化的模型,并提供特定时刻的具体姿态角。在给定的基本条件下,分析了作用在直升机上的力矩。俯仰力矩为旋翼产生的气动力矩与水平尾翼的俯仰力矩之和,横摇力矩为旋翼产生的气动力矩与垂直尾翼的横摇力矩之和,横摆力矩为旋翼产生的气动力矩与垂直尾翼的横摆力矩之和。我们分别计算这些力矩分量,得到不同方向的总力矩。根据力矩与角速度的关系,建立了动力学微分方程。通过求解这些微分方程,得到了姿态角变化模型。
问题3:该问题要求控制直升机不同部件在高速和低速两种情况下完成水平飞行任务。假设直升机以恒定速度飞行,在低速情况下,姿态角控制主要通过同轴旋翼实现,而在高速模式下,姿态角控制主要通过吊卡和方向舵实现。选取不同的控制输入,建立直升机在这两种情况下的动态微分方程,得到姿态角变化模型。优化目标是使不同时刻三个姿态角之和最小。采用粒子群优化算法,得到各部件的最优控制输入。
问题4:该问题要求在直升机向前加速的同时,控制直升机不同部件完成水平飞行和向前加速任务。我们将飞行过程分为低速、中速和高速三个阶段,并在每个阶段选择不同的控制输入。建立了直升机在不同阶段的动力学微分方程,推导了姿态角变化模型。优化目标是使不同时刻三个姿态角之和最小。采用粒子群优化算法在不同时刻获得各部件的最优控制输入。
问题分析:
问题1和问题2的分析
问题1和问题2本质上是关于直升机的动态分析,唯一的区别是为每个问题提供不同的基础数据集。此外,问题1仅要求考虑俯仰力矩,而问题2涉及考虑所有三个方向的力矩。因此,我们采用相同的方法来分析这两个问题。将俯仰力矩视为旋翼产生的气动力矩与水平尾翼的俯仰力矩之和,将横摇力矩视为旋翼产生的气动力矩与垂直尾翼的横摇力矩之和,将横摆力矩视为旋翼产生的气动力矩与垂直尾翼的横摆力矩之和。我们分别计算这些力矩分量,得到不同方向的总力矩。然后,根据力矩与角速度的关系,建立动力学微分方程。通过求解这些微分方程,得到了姿态角变化模型。
问题三分析
问题三要求我们控制直升机顺利完成快速水平飞行任务。该问题建立在问题1和问题2建立的姿态角变化模型的基础上,用控制变量代替问题1和问题2给出的常数。我们用这些变量来表示姿态角,目的是最小化不同时刻的姿态角值之和。采用粒子群优化算法得到最优控制策略。
问题4的分析
问题4在问题3的基础上引入了一个变体,我们需要控制直升机以完成加速飞行任务。与问题3分别考虑高速和低速情况不同,问题4在单个飞行过程中结合了不同的速度条件。但是,对于低速、中速和高速时间段,我们仍然可以分段时间并选择不同的控制变量。需要注意的是,在前面的问题中,我们假设直升机以恒定速度飞行,而不考虑推进系统产生的扭矩。在问题4中,当直升机加速时,我们需要考虑推进系统产生的扭矩。以不同时刻姿态角值之和最小为目标,采用粒子群优化算法得到最优控制策略。
模型的建立与求解整体论文缩略图
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:
clc;
clear;
theta_final = [];
syms t theta(t)
F_dynamic = 1/2.*rho(t).*6404;
k_yaw = f2(sqrt(6404)/180)+g2(sqrt(6404)/180).*(-
3.4817)+m(sqrt(6404)/180).*(-2.1552);
M_yaw = k_yaw.*pi.*36.*rho(t).*1/2.*180.^2;
k_hor = -0.0001+phy_ud(sqrt(6404)/180).*(-9.0072).*0.0000001;
M_hor = k_hor.*F_dynamic.*1.*(-3);
M_total = M_yaw+M_hor;
% 定义二阶微分方程
eqn = 20000 * diff(theta, t, t) == M_total;
theta_d = diff(theta,t);
cond1 = theta(0) == 0;
cond2 = theta_d(0) == 0;
% 解微分方程
sol = simplify(dsolve(eqn, [cond1, cond2]));
% for t=0:0.1:20
%
% theta_final=cat(1,theta_final,[t eval(simplify(subs(sol,'t',t)))]);
%
% end
theta_final= eval(simplify(subs(sol,'t',20)))
clc;
clear;
theta_p_final=[];
theta_r_final =[];
theta_y_final=[];
syms t theta_p(t) theta_r(t) theta_y(t)
F_dynamic = 1/2.*rho(t).*6400.04;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 俯仰
k_pitch = f2(sqrt(6400.04)/180)+g2(sqrt(6400.04)/180).*(-
3.4817)+m(sqrt(6400.04)/180).*(-2.1552);
M_pitch = k_pitch.*pi.*36.*rho(t).*1/2.*180.^2;
k_hor = -0.0001+phy_ud(sqrt(6400.04)/180).*(-9.0772).*(-0.0000001);
M_hor = k_hor.*F_dynamic.*(-3);
M_y_total = M_pitch+M_hor;
m(sqrt(6400.04)/180)
eval(simplify(subs(M_pitch,'t',20)))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 滚动
k_roll = f1(sqrt(6400.04)/180)+g1(sqrt(6400.04)/180).*(-
2.0743)+c1(sqrt(6400.04)/180).*(-2.1552);
M_roll = k_roll.*pi.*36.*rho(t).*1/2.*180.^2;
k_ver_r =
sigma_v(sqrt(6400.04)/180)+phy_dir(sqrt(6400.04)/180).*(4.1869).*0.000000
1;
M_ver_r = k_ver_r.*F_dynamic.*0.5.*(0.2);
M_x_total = M_roll+M_ver_r;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 偏航
k_yaw = f3(sqrt(6400.04)/180)+c3(sqrt(6400.04)/180).*(-2.1552);
M_yaw = k_yaw.*pi.*36.*rho(t).*1/2.*180.^2;
k_ver_y =
sigma_v(sqrt(6400.04)/180)+phy_dir(sqrt(6400.04)/180).*(4.1869).*0.000000
1;
M_ver_y = k_ver_y.*F_dynamic.*0.5.*(-3);
M_z_total = M_yaw+M_ver_y;
%% 求俯仰角度
eqn = 20000 * diff(theta_p, t, t) == M_y_total;
theta_p_d = diff(theta_p,t);
cond1 = theta_p(0) == 0;
cond2 = theta_p_d(0) == 0;
% 解微分方程
sol = dsolve(eqn, [cond1, cond2]);
for i = 0:0.1:20
i
theta_p_final=cat(1,theta_p_final,[i
eval(simplify(subs(sol,'t',i)))]);
end
%% 求滚动角度
eqn = 8000 * diff(theta_r, t, t) == M_x_total;
theta_r_d = diff(theta_r,t);
cond1 = theta_r(0) == 0;
cond2 = theta_r_d(0) == 0;
% 解微分方程
sol = dsolve(eqn, [cond1, cond2]);
for i = 0:0.1:20
i
theta_r_final=cat(1,theta_r_final,[i
eval(simplify(subs(sol,'t',i)))]);
end
%% 求偏航角度
eqn = 25000 * diff(theta_y, t, t) == M_z_total;
theta_y_d = diff(theta_y,t);
cond1 = theta_y(0) == 0;
cond2 = theta_y_d(0) == 0;
% 解微分方程
sol = dsolve(eqn, [cond1, cond2]);
for i = 0:0.1:20
i
theta_y_final=cat(1,theta_y_final,[i
eval(simplify(subs(sol,'t',i)))]);
end
figure
plot(theta_p_final(:,1),theta_p_final(:,2),'LineWidth',2)
xlabel('t /s',FontSize=18)%设置横坐标轴
ylabel('theta of pitch /deg',FontSize=18)
figure
plot(theta_r_final(:,1),theta_r_final(:,2),'LineWidth',2)
xlabel('t /s',FontSize=18)%设置横坐标轴
ylabel('theta of roll /deg',FontSize=18)
figure
plot(theta_y_final(:,1),theta_y_final(:,2),'LineWidth',2)
xlabel('t /s',FontSize=18)%设置横坐标轴
ylabel('theta of yaw /deg',FontSize=18)