Files
2025-06-04 14:13:22 +08:00

97 lines
3.4 KiB
Matlab

function [success, opts, op_point,op_report,opsec] = trimLonAlphaDf( opts, h0, alp0, gamma0, v0)
% 无侧滑的定直飞行
opsec = update_opsec(opts.opsec, opts, h0, alp0, gamma0, v0);
%% Trim model
[op_point,op_report] = findop(opts.fcn,opsec,opts.TrimOptions);
if ~isempty(strfind(op_report.TerminationString,'successfully'))
success = true;
opts = update_opts(opts,op_report);
else
success = false;
end
end
function opsec = update_opsec(opsec, opts, h0, alp0, gamma0, v0)
n = length(opsec.Inputs);
for i=1:n
inputs = opsec.Inputs(i);
if strcmp(inputs.Block(end-1:end),'de')
inputs.u = opts.de;
inputs.Known = false; %unkown de
inputs.max = opts.max_de;
inputs.min = opts.min_de;
elseif strcmp(inputs.Block(end-7:end),'throttle')
inputs.u = opts.throttle;
inputs.Known = false; %unkown throttle
inputs.max = opts.max_throttle;
inputs.min = opts.min_throttle;
elseif strcmp(inputs.Block(end-1:end),'df')
inputs.u = 0;
inputs.Known = false; %unkown de
inputs.max = opts.max_df;
inputs.min = opts.min_df;
else
opsec.Inputs(i).Known = true;
end
end
n = length(opsec.States);
for i=1:n
states = opsec.States(i);
if strcmp(states.Block(end-2:end),'psi')
states.x = [0;opts.tht;opts.psi];
states.steadystate = [false;false;false];
states.Known = [true;false;true]; % set phi psi to zero, unknow tht
elseif strcmp(states.Block(end-1:end),'r ')
states.x = [0;0;0];
states.steadystate = [false;true;false]; % qdot = 0
states.Known = [true;true;true]; % set pqr to zero
elseif strcmp(states.Block(end-1:end),'wb')
if opts.v0_type == uint8(2)
v_t = 340*v0;
else
v_t = v0;
end
states.x = [v_t*cos(alp0);0;v_t*sin(alp0)];
states.steadystate = [true;false;true]; % wdot = 0, udot = 0
states.Known = [false;true;false]; % set vb to zero, unkown ub,wb
elseif strcmp(states.Block(end-1:end),'ze')
states.x = [0;0;-h0];
states.steadystate = [false;false;false];
states.Known = [true;true;true]; % set x,y to zero, z to h0
else
% nx = states.Nx;
% states.steadystate = zeros(nx,1,'logical'); % Nonequilibrium state for others
% states.Known = ones(nx,1,'logical'); % do not trim other states
end
end
n = length(opsec.Outputs);
for i=1:n
outputs = opsec.Outputs(i);
if opts.v0_type == uint8(0) && strcmp(outputs.Block(end-2:end),'TAS')
outputs.y = v0;
outputs.Known = true; % TAS = v0
elseif opts.v0_type == uint8(1) && strcmp(outputs.Block(end-2:end),'CAS')
outputs.y = v0;
outputs.Known = true; % CAS = v0
elseif opts.v0_type == uint8(2) && strcmp(outputs.Block(end-2:end),'ach')
outputs.y = v0;
outputs.Known = true; % Mach = v0
elseif strcmp(outputs.Block(end-4:end),'gamma')
outputs.y = gamma0;
outputs.Known = true;%true; % gamma = gamma0
elseif strcmp(outputs.Block(end-3:end),'lpha')
outputs.y = alp0;
outputs.Known = true;
outputs.max = opts.max_alpha;
outputs.min = opts.min_alpha;
elseif strcmp(outputs.Block(end-2:end),'eta')
outputs.y = 0;
outputs.Known = false;
outputs.max = opts.max_beta;
outputs.min = opts.min_beta;
else
outputs.Known = zeros(size(outputs.Known),'like',outputs.Known);
end
end
end