1061 lines
25 KiB
Matlab
1061 lines
25 KiB
Matlab
function generate_trim_report(mass)
|
|
%% 计算条件设定
|
|
|
|
if nargin<1
|
|
mass = 315;
|
|
end
|
|
|
|
h0 = 150;
|
|
gamma0 = 0;
|
|
v0 = 20:1:50;
|
|
|
|
rpt_name = 'trimming_report';
|
|
|
|
%% 模型初始化
|
|
proj = slproject.getCurrentProject;
|
|
wd = cd;
|
|
try
|
|
cd([proj.RootFolder '/docs/trim/',num2str(mass),'kg']);
|
|
catch
|
|
mkdir([proj.RootFolder '/docs/trim/',num2str(mass),'kg']);
|
|
cd([proj.RootFolder '/docs/trim/',num2str(mass),'kg']);
|
|
end
|
|
mdl = evalin('base', 'mdl_name');
|
|
fcn = [mdl, '_an'];
|
|
opts = trimoptions(fcn);
|
|
opts.v0_type = uint8(1); % 0-TAS;1-CAS;2-Mach
|
|
opts.max_alpha = 12/57.3;
|
|
opts.min_alpha = -3/57.3;
|
|
opts.max_de = 30/57.3;
|
|
opts.min_de = -30/57.3;
|
|
opts.max_da = 20/57.3;
|
|
opts.min_da = -20/57.3;
|
|
opts.max_dr = 10/57.3;
|
|
opts.min_dr = -10/57.3;
|
|
opts.max_df = 30/57.3;
|
|
opts.min_df = 0/57.3;
|
|
opts.max_throttle = 1;
|
|
opts.min_throttle = 0.0;
|
|
opts.throttle = 0.5;
|
|
opts.max_beta = 9/57.3;
|
|
opts.min_beta = -9/57.3;
|
|
opts.TrimOptions.OptimizationOptions.Display = 'iter';
|
|
opts.TrimOptions.DisplayReport = 'on';
|
|
% opts.OptimizationOptions.MaxFunEvals = 600;
|
|
% opts.OptimizationOptions.TolX = 1e-4;
|
|
load_system(fcn);
|
|
mdlWks = get_param(fcn,'ModelWorkspace');
|
|
|
|
assignin(mdlWks,'mass0',mass);
|
|
%% 初始化报告
|
|
import mlreportgen.report.*
|
|
import mlreportgen.dom.*
|
|
% rpt_name = 'trimming_report';
|
|
rpt = Report(rpt_name,'docx');
|
|
|
|
tp = TitlePage;
|
|
tp.Title = 'Trimming Report';
|
|
tp.Subtitle = ['for model ' fcn];
|
|
tp.Author = 'Lyu Weiye';
|
|
add(rpt,tp);
|
|
%% 计算
|
|
|
|
% trim_lon_alpha_df_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
|
|
trim_lon_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
|
|
% trim_lon_cg_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
%
|
|
% linLonLat_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
%
|
|
% trimGamma_report(rpt,opts,mdlWks,h0,v0);
|
|
%
|
|
% trimSideslip_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
%
|
|
% trimTurnPhiDr_report(rpt,opts,mdlWks,h0,v0);
|
|
%
|
|
% trimPullup_report(rpt,opts,mdlWks,h0,v0);
|
|
|
|
% trim_lon_df_report(rpt,opts,mdlWks,h0,v0,gamma0);
|
|
|
|
% throttle = 1;
|
|
% trimGamma_df_report(rpt,opts,mdlWks,h0,v0,throttle);
|
|
|
|
%% 结束
|
|
rptview(rpt);
|
|
close_system(fcn, 0); % close without saving
|
|
cd(wd);
|
|
end
|
|
|
|
%% 纵向配平
|
|
function trim_lon_report(rpt,opts,~,h0,v0,gamma0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
plotTrimLon(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
gamma0, 'CAS/ m/s');
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定直平飞配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimLon_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimLon(hf, opts, h0, v0, gamma0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v = v0
|
|
[success,opts1] = trimLon(opts, h0, v, gamma0);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
de_lst(j) = opts.de;
|
|
thr_lst(j) = opts.throttle;
|
|
thrust_lst(j) = opts.thrust;
|
|
LoD_lst(j) = opts.LoD;
|
|
RPM_lst(j) = opts.RPM;
|
|
power_lst(j) = opts.power;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if j>1
|
|
figure(hf);
|
|
subplot(421);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(422);
|
|
plot(v_lst, LoD_lst);
|
|
xlabel(xlbl);
|
|
ylabel('LoD');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(423);
|
|
plot(v_lst, thrust_lst);
|
|
xlabel(xlbl);
|
|
ylabel('T_r / N');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(424);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(425);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(426);
|
|
plot(v_lst, power_lst);
|
|
xlabel(xlbl);
|
|
ylabel('P_r / W');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(427);
|
|
plot(v_lst, RPM_lst);
|
|
xlabel(xlbl);
|
|
ylabel('RPM');
|
|
hold on;
|
|
grid on;
|
|
|
|
|
|
end
|
|
end
|
|
|
|
%% 不同重心纵向配平
|
|
function trim_lon_cg_report(rpt,opts,mdlWks,h0,v0,gamma0)
|
|
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
cg_lst = [0,0.000541,0.000974];
|
|
for idx = 1:length(cg_lst)
|
|
cg = cg_lst(idx);
|
|
lbl{idx} = ['cgx=',num2str(cg),'m'];
|
|
% assignin(mdlWks,'force_CG',1);
|
|
% assignin(mdlWks,'force_CG_pos_m',[cg, 0, 0]); CG_bias_m
|
|
assignin(mdlWks,'CG_bias_m',[cg, 0, 0]);
|
|
plotTrimLon(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
gamma0, 'CAS/ m/s');
|
|
end
|
|
|
|
assignin(mdlWks,'force_CG',0);
|
|
assignin(mdlWks,'force_CG_pos_m',[0, 0, 0]);
|
|
assignin(mdlWks,'CG_bias_m',[0, 0, 0]);
|
|
lgd = legend(lbl,'location','best');
|
|
set(lgd,...
|
|
'Position',[0.720333850982767 0.162299541026901 0.152500001464571 0.125950573061809]);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定直平飞配平结果_前后重心(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimLon_cg_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
%% 模态分析
|
|
function linLonLat_report(rpt,opts,~,h0,v0,gamma0)
|
|
|
|
hf = figure();
|
|
plotLinLonLat(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
gamma0);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('线性化模态结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('linearize_modes%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
%% 爬升
|
|
function trimGamma_report(rpt,opts,~,h0,v0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
for thr=[0, 0.7, 0.8, 0.9, 1]
|
|
plotTrimGamma(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
thr, 'CAS/ m/s');
|
|
end
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定常爬升下滑配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('climb_glide%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimGamma(hf, opts, h0, v0, thr0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v =v0
|
|
[success,opts1] = trimGamma( opts, h0, v, thr0 );
|
|
if success && opts1.gamma > -0.2
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
de_lst(j) = opts.de;
|
|
thr_lst(j) = opts.throttle;
|
|
gamma_lst(j) = opts.gamma;
|
|
hdot_lst(j) = sin(opts.gamma)*opts.TAS;
|
|
thrust_lst(j) = opts.thrust;
|
|
RPM_lst(j) = opts.RPM;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if j>1
|
|
figure(hf);
|
|
subplot(421);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(422);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(423);
|
|
plot(v_lst, gamma_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\gamma / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(424);
|
|
plot(v_lst, hdot_lst);
|
|
xlabel(xlbl);
|
|
ylabel('RoC / m/s');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(425);
|
|
plot(v_lst, thrust_lst);
|
|
xlabel(xlbl);
|
|
ylabel('T / N');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(426);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(427);
|
|
plot(v_lst, RPM_lst);
|
|
xlabel(xlbl);
|
|
ylabel('RPM');
|
|
hold on;
|
|
grid on;
|
|
|
|
end
|
|
end
|
|
|
|
%% 带侧滑飞行配平
|
|
function trimSideslip_report(rpt,opts,~,h0,v0,gamma0)
|
|
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
for beta0 = [-5:5:5]./57.3
|
|
plotTrimSideslip(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
beta0, gamma0, 'CAS/ m/s');
|
|
end
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('带侧滑飞行配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimSideslip%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimSideslip(hf, opts, h0, v0, beta0, gamma0, xlbl)
|
|
if nargin < 7
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v =v0
|
|
[success,opts1] = trimSideslip(opts, h0, v, beta0, gamma0);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
aos_lst(j) = opts.beta;
|
|
da_lst(j) = opts.da;
|
|
de_lst(j) = opts.de;
|
|
del_lst(j) = opts.del;
|
|
der_lst(j) = opts.der;
|
|
dr_lst(j) = opts.dr;
|
|
phi_lst(j) = opts.phi;
|
|
r_lst(j) = opts.r;
|
|
thr_lst(j) = opts.throttle;
|
|
thrust_lst(j) = opts.thrust;
|
|
% RPM_lst(j) = opts.rpm;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if ~isempty(v_lst)
|
|
figure(hf);
|
|
subplot(421);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(422);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(423);
|
|
plot(v_lst, aos_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\beta / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(424);
|
|
plot(v_lst, dr_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_r / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(425);
|
|
plot(v_lst, da_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_a / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(426);
|
|
plot(v_lst, phi_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\phi/ ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(427);
|
|
plot(v_lst, del_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{el} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(428);
|
|
plot(v_lst, der_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{er} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
end
|
|
end
|
|
%% 盘旋特性
|
|
function trimTurnPhiDr_report(rpt,opts,~,h0,v0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 800 700]);
|
|
idx = 1;
|
|
for phi=-30:15:30
|
|
plotTurnPhiDr(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
phi/57.3, 0, 'CAS/ m/s');
|
|
end
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('非协调盘旋配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('turn_dr0%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTurnPhiDr(hf, opts, h0, v0, phi0, dr0, xlbl)
|
|
if nargin < 7
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v =v0
|
|
[success,opts1] = trimTurnPhiDr( opts, h0, v, phi0, dr0);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
aos_lst(j) = opts.beta;
|
|
de_lst(j) = opts.de;
|
|
thr_lst(j) = opts.throttle;
|
|
thrust_lst(j) = opts.thrust;
|
|
Nn_lst(j) = opts.Nn;
|
|
da_lst(j) = opts.da;
|
|
dr_lst(j) = opts.dr;
|
|
gamma_lst(j) = opts.gamma;
|
|
LoD_lst(j) = opts.LoD;
|
|
phi_lst(j) = opts.phi;
|
|
omega_lst(j) = sqrt(dot(opts.pqr,opts.pqr));
|
|
if phi0==0
|
|
R_lst(j) = 0;
|
|
else
|
|
R_lst(j) = v_lst(j)/omega_lst(j);
|
|
end
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if ~isempty(v_lst)
|
|
figure(hf);
|
|
subplot(331);
|
|
plot(v_lst,aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(332);
|
|
plot(v_lst,de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(333);
|
|
plot(v_lst,thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(334);
|
|
plot(v_lst,da_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_a / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(335);
|
|
plot(v_lst,dr_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_r / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(336);
|
|
plot(v_lst,aos_lst*57.3 );
|
|
xlabel(xlbl);
|
|
ylabel('\beta / ^o');
|
|
grid on
|
|
hold on;
|
|
|
|
subplot(337);
|
|
plot(v_lst,phi_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\phi / ^o');
|
|
grid on
|
|
hold on;
|
|
|
|
subplot(338);
|
|
plot(v_lst,Nn_lst);
|
|
xlabel(xlbl);
|
|
ylabel('N_z');
|
|
grid on
|
|
hold on;
|
|
|
|
subplot(339);
|
|
plot(v_lst,omega_lst*57.3 );
|
|
xlabel(xlbl);
|
|
ylabel('\omega / ^o/s');
|
|
grid on
|
|
hold on;
|
|
|
|
end
|
|
end
|
|
|
|
%% 机动特性
|
|
function trimPullup_report(rpt,opts,~,h0,v0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
idx = 1;
|
|
for Nz = -0.5:0.5:2.5
|
|
plotTrimPullup(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
Nz, 'CAS/ m/s');
|
|
idx = idx+1;
|
|
end
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定常拉起配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('pullup_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimPullup(hf, opts, h0, v0, Nz0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
v_lst = [];
|
|
for v =v0
|
|
[success,opts1] = trimPullup( opts, h0, v, Nz0);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
de_lst(j) = opts.de;
|
|
thrust_lst(j) = opts.thrust;
|
|
thr_lst(j) = opts.throttle;
|
|
nz_lst(j) = opts.Nn;
|
|
j=j+1;
|
|
end
|
|
end
|
|
if ~isempty(v_lst)
|
|
figure(hf);
|
|
subplot(321);
|
|
plot(v_lst,aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(322);
|
|
plot(v_lst,de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^o');
|
|
grid on
|
|
hold on
|
|
|
|
subplot(323);
|
|
plot(v_lst, thrust_lst);
|
|
xlabel(xlbl);
|
|
ylabel('T / N');
|
|
grid on
|
|
hold on
|
|
|
|
|
|
subplot(324);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
grid on
|
|
hold on;
|
|
|
|
subplot(325);
|
|
plot(v_lst, nz_lst);
|
|
xlabel(xlbl);
|
|
ylabel('Nz');
|
|
grid on
|
|
hold on;
|
|
|
|
|
|
end
|
|
end
|
|
|
|
%% 单发失效配平
|
|
function trim_engfault_report(rpt,opts,mdlWks,h0,v0,gamma0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
for idx = 2
|
|
assignin(mdlWks,'eng_fault',idx); % right engine fault
|
|
plotTrimEngfault(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
gamma0);
|
|
end
|
|
assignin(mdlWks,'eng_fault',0);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('trim_Engfault_rlst(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimEngfault_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimEngfault(hf, opts, h0, v0, gamma0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v = v0
|
|
[success,opts1] = trimEngfault(opts, h0, v, gamma0);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
aos_lst(j) = opts.beta;
|
|
de_lst(j) = opts.de;
|
|
dal_lst(j) = opts.dal;
|
|
dar_lst(j) = opts.dar;
|
|
dr_lst(j) = opts.dr;
|
|
da_lst(j) = opts.da;
|
|
thr_lst(j) = opts.throttle;
|
|
% thrust_lst(j) = opts.thrust; % 单发推力(N)
|
|
LoD_lst(j) = opts.LoD;
|
|
% cft_lst(j) = opts.fuelrate; % 单发燃油消耗率(kg/s)
|
|
% RPM_lst(j) = opts.rpm;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
figure(hf);
|
|
subplot(421);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(422);
|
|
plot(v_lst, aos_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\beta / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(423);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('thr');
|
|
hold on;
|
|
grid on
|
|
subplot(424);
|
|
plot(v_lst, da_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_a / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(425);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(426);
|
|
plot(v_lst, dr_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_r / ^{o}');
|
|
hold on;
|
|
grid on
|
|
|
|
subplot(427);
|
|
plot(v_lst, del_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{el} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(428);
|
|
plot(v_lst, der_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{er} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
end
|
|
|
|
|
|
%% 最大油门单发失效配平
|
|
function trim_maxengfault_report(rpt,opts,mdlWks,h0,v0)
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 800 700]);
|
|
for idx = 0:1:2
|
|
assignin(mdlWks,'eng_fault',idx); % right engine fault
|
|
plotTrimMaxEngfault(hf, ...
|
|
opts, ...
|
|
h0, v0);
|
|
end
|
|
assignin(mdlWks,'eng_fault',0);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('trim_maxEngfault_rlst(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimMaxEngfault_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimMaxEngfault(hf, opts, h0, v0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v = v0
|
|
[success,opts1] = trimEngfaultThr(opts, h0, v, 1);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
aos_lst(j) = opts.beta;
|
|
de_lst(j) = opts.de;
|
|
dal_lst(j) = opts.dal;
|
|
dar_lst(j) = opts.dar;
|
|
dr_lst(j) = opts.dr;
|
|
da_lst(j) = opts.da;
|
|
thr_lst(j) = opts.throttle;
|
|
gamma_lst(j) = opts.gamma;
|
|
hdot_lst(j) = sin(opts.gamma)*opts.TAS;
|
|
% thrust_lst(j) = opts.thrust; % 单发推力(N)
|
|
LoD_lst(j) = opts.LoD;
|
|
% cft_lst(j) = opts.fuelrate; % 单发燃油消耗率(kg/s)
|
|
% RPM_lst(j) = opts.rpm;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
figure(hf);
|
|
subplot(331);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(332);
|
|
plot(v_lst, aos_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\beta / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(333);
|
|
plot(v_lst, hdot_lst);
|
|
xlabel(xlbl);
|
|
ylabel('RoC / m/s');
|
|
hold on;
|
|
grid on
|
|
subplot(334);
|
|
plot(v_lst, da_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_a / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(335);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on
|
|
subplot(336);
|
|
plot(v_lst, dr_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_r / ^{o}');
|
|
hold on;
|
|
grid on
|
|
|
|
subplot(337);
|
|
plot(v_lst, dal_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{al} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(338);
|
|
plot(v_lst, dar_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_{ar} / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
end
|
|
|
|
|
|
function plotLinLonLat(hf, opts, h0, v0, gamma0)
|
|
figure(hf);
|
|
for v =v0
|
|
[success,opts1,op_point] = trimLon( opts, h0, v, gamma0 );
|
|
if success
|
|
opts = opts1;
|
|
% [Glon,Glat] = linfdm_numericalpert(opts.fcn,op_point);
|
|
[Glon,Glat] = linfdm(opts.fcn,op_point);
|
|
ev = eig(Glon);
|
|
subplot(211);
|
|
plot(real(ev),imag(ev), 'x');
|
|
xlabel('Real');
|
|
ylabel('Imag');
|
|
hold on;
|
|
ev = eig(Glat);
|
|
subplot(212);
|
|
plot(real(ev),imag(ev), 'x');
|
|
xlabel('Real');
|
|
ylabel('Imag');
|
|
hold on;
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
%% 襟翼构型配平
|
|
|
|
function trim_lon_df_report(rpt,opts,mdlWks,h0,v0,gamma0)
|
|
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 800]);
|
|
df_lst = [0, 10, 20, 30, 40];
|
|
lbl = {'df=0','df=10','df=20','df=30','df=40'};
|
|
% df_lst = [-5, 0, 5];
|
|
% lbl = {'df=-5', 'df=0','df=5'};
|
|
for idx = 1:length(df_lst)
|
|
df = df_lst(idx);
|
|
% lbl{idx} = ['df=',num2str(df),'^o'];
|
|
assignin(mdlWks,'df',df./57.3);
|
|
plotTrimLon(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
gamma0, 'CAS/ m/s');
|
|
end
|
|
assignin(mdlWks,'df',0./57.3);
|
|
lgd = legend(lbl,'location','best');
|
|
set(lgd,...
|
|
'Position',[0.720333850982767 0.162299541026901 0.152500001464571 0.125950573061809]);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定直平飞配平结果_变襟翼(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimLon_df_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
|
|
%% 纵向配平
|
|
function trim_lon_alpha_df_report(rpt,opts,~,h0,v0,gamma0)
|
|
hf = figure();
|
|
alpha0 = 4/57.3;
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
plotTrimLonALphaDf(hf, ...
|
|
opts, ...
|
|
h0, v0, alpha0,...
|
|
gamma0, 'CAS/ m/s');
|
|
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定直平飞配平结果(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimLon_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
function plotTrimLonALphaDf(hf, opts, h0, v0, alpha0, gamma0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v = v0
|
|
[success,opts1] = trimLonAlphaDf(opts, h0, alpha0, gamma0,v);
|
|
if success
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
df_lst(j) = opts.df;
|
|
aoa_lst(j) = opts.alpha;
|
|
de_lst(j) = opts.de;
|
|
thr_lst(j) = opts.throttle;
|
|
thrust_lst(j) = opts.thrust;
|
|
LoD_lst(j) = opts.LoD;
|
|
RPM_lst(j) = opts.RPM;
|
|
power_lst(j) = opts.power;
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if j>1
|
|
figure(hf);
|
|
subplot(321);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(322);
|
|
plot(v_lst, LoD_lst);
|
|
xlabel(xlbl);
|
|
ylabel('LoD');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(323);
|
|
plot(v_lst, df_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_f / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(324);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(325);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(326);
|
|
plot(v_lst, power_lst);
|
|
xlabel(xlbl);
|
|
ylabel('P_r / W');
|
|
hold on;
|
|
grid on;
|
|
|
|
end
|
|
end
|
|
|
|
|
|
function trimGamma_df_report(rpt,opts,mdlWks,h0,v0,throttle)
|
|
|
|
hf = figure();
|
|
set(gcf,'Position',[0 0 700 600]);
|
|
df_lst = [0, 10, 20, 30];
|
|
lbl = {'df=0','df=10','df=20','df=30'};
|
|
for idx = 1:length(df_lst)
|
|
df = df_lst(idx);
|
|
% lbl{idx} = ['df=',num2str(df),'^o'];
|
|
assignin(mdlWks,'df',df./57.3);
|
|
plotTrimGammaDf(hf, ...
|
|
opts, ...
|
|
h0, v0, ...
|
|
throttle, 'CAS/ m/s');
|
|
end
|
|
assignin(mdlWks,'df',0./57.3);
|
|
lgd = legend(lbl,'location','best');
|
|
set(lgd,...
|
|
'Position',[0.720333850982767 0.162299541026901 0.152500001464571 0.125950573061809]);
|
|
fig = mlreportgen.report.Figure();
|
|
fig.Snapshot.Caption = sprintf('定爬升配平结果_变襟翼(H=%.0f)',h0);
|
|
add(rpt,fig);
|
|
savefig(sprintf('trimGamma_df_h%.0f',h0));
|
|
delete(gcf);
|
|
end
|
|
|
|
|
|
function plotTrimGammaDf(hf, opts, h0, v0, thr0, xlbl)
|
|
if nargin < 6
|
|
xlbl = 'v / m/s';
|
|
end
|
|
j=1;
|
|
for v =v0
|
|
[success,opts1] = trimGamma( opts, h0, v, thr0 );
|
|
if success && opts1.gamma > -0.2
|
|
opts = opts1;
|
|
v_lst(j) = v;
|
|
aoa_lst(j) = opts.alpha;
|
|
de_lst(j) = opts.de;
|
|
thr_lst(j) = opts.throttle;
|
|
gamma_lst(j) = opts.gamma;
|
|
hdot_lst(j) = sin(opts.gamma)*opts.TAS;
|
|
thrust_lst(j) = opts.thrust;
|
|
RPM_lst(j) = opts.RPM;
|
|
tht_lst(j) = opts.attitude(2);
|
|
j=j+1;
|
|
end
|
|
end
|
|
|
|
if j>1
|
|
figure(hf);
|
|
subplot(321);
|
|
plot(v_lst, aoa_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\alpha / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(322);
|
|
plot(v_lst, de_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_e / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(323);
|
|
plot(v_lst, gamma_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\gamma / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(324);
|
|
plot(v_lst, hdot_lst);
|
|
xlabel(xlbl);
|
|
ylabel('RoC / m/s');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(325);
|
|
plot(v_lst, tht_lst*57.3);
|
|
xlabel(xlbl);
|
|
ylabel('\theta / ^{o}');
|
|
hold on;
|
|
grid on;
|
|
|
|
subplot(326);
|
|
plot(v_lst, thr_lst);
|
|
xlabel(xlbl);
|
|
ylabel('\delta_T');
|
|
hold on;
|
|
grid on;
|
|
end
|
|
end
|
|
|