function [state_eq, obser_eq, Nx, Ny, Nu, NparSys, Nparam, NparID, dt, Ndata, ... t, Z, Uinp, param, parFlag, x0, iSD, SDyError, output_file] = mDefCase04d(test_case, target_log) % Definition of model, flight data, initial values etc. % Lateral motion % Nonlinear model in terms of dimensional derivatives as function of % variables in the stability axes (V, alfa) % states - beta, p, r, phi, psi % outputs - beta, p, r, phi, psi, ay % inputs - da, dr % % Inputs % test_case test case number % % Outputs % state_eq function to code right hand sides of state equations % obser_eq function to code right hand sides of observation equations % Nx number of states % Ny number of observation variables % Nu number of input (control) variables % NparSys number of system parameters % Nparam total number of system and bias parameters % NparID total number of parameters to be estimated (free parameters) % dt sampling time % Ndata total number of data points for Nzi time segments % t time vector % Z observation variables: Data array of measured outputs (Ndata,Ny) % Uinp input variables: Data array of measured input (Ndata,Nu) % param initial starting values for unknown parameters (aerodynamic derivatives) % parFlag flags for free and fixed parameters % x0 initial conditions on state variables % iSD Flag to specify optionally initial R (default; 0) % SDyError standard-deviations of output errors to compute initial covariance % matrix R (required only for iSD ~= 0) if (nargin < 1), target_log = 100, end; % Constants d2r = pi/180; r2d = 180/pi; %---------------------------------------------------------------------------------------- % Model definition state_eq = 'xdot_nlinear_lat'; % Function for state equations obser_eq = 'obs_nlinear_lat'; % Function for observation equations Nx = 5; % Number of states Ny = 6; % Number of observation variables Nu = 2; % Number of input (control) variables NparSys = 14; % Number of system parameters Nparam = NparSys + Nx; % Total number of parameters to be estimated dt = 0.02; % Sampling time iSD = 0; % Initial R option (default; 0) disp(['Test Case = ', num2str(test_case)]); disp('Lateral motion, nonlinear model -- Melco R/C: Nx=5, Ny=5, Nu=2') %--------------------------------------------------------------------------------------- % Load flight data for Nzi time segments to be analyzed and concatenate log_file = ''; output_file = sprintf('../CVS_IGNORE/FEM_out_%d_%d.csv', test_case, target_log); U0 = 20; % トリム状態における対気速度[m/s] W0 = 0; % トリム状態における下方向速度[m/s] THETA0 = 0; % トリム状態におけるピッチ角(安定軸) BOFFSET = 0; % ピトー管のオフセット DA_PARAM = [15, 3051, -0.03306 * d2r]; DR_PARAM = [18, 3066, -0.03438 * d2r]; % Flags for free and fixed parameters parFlag = [1; 1; 1; 1;... 1; 1; 1; 1; 1;... 1; 1; 1; 1; 1;... %0; 0; 0; 0; 0;]; 1; 1; 1; 1; 1;]; % Initial starting values for unknown parameters (aerodynamic derivatives) % Yb, Yp, Yr, Ydr, Lb, Lp, Lr, Lda, Ldr, Nb, Np, Nr, Nda, Ndr, f11, f22, f33, f44, f55 param = [ -3.00000D+01; -1.00000D-02; 1.00000D-01; 5.00000D+00;... -1.00000D+02; -3.00000D+01; 5.00000D+00; 8.00000D+01; -4.00000D+01;... -4.00000D+00; -4.00000D+00; -5.00000D-01; 7.00000D+00; -3.00000D+01;... 1.00000D-00; 1.00000D-02; 1.00000D-02; 1.00000D-03; 1.00000D-03]; % x0 : Initial conditions on state variables beta, p, r, phi, psi if (target_log < 100), error('No Lateral LOG, 080806_watarase'); elseif (target_log < 200), files = { ... '272830.arc', % 100 '272917.dr', % 101 '272962.2.rs', % 102 '273050.arc', % 103 '281579.8.rdr', % 104 '281735.6.arc', % 105 '281769.9.rd', % 106 '281823.2.rs', % 107 '281840.7.rs', % 108 '281885.2.td', % 109 '281896.3.arc', % 110 '281907.5.rd', % 111 '281924.5.rs'}; % 112 dirname = '../../091228_si/CVS_IGNORE/081105_katsuma/'; log_file = [dirname, char(files(target_log - 99)), '.csv']; output_file = [dirname, char(files(target_log - 99)), '.fem.csv']; if target_log == 100, parFlag = [ 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 0; 0; 0; 0; 0;]; %1; 1; 1; 1; 1;]; U0 = 18; THETA0 = 0 * d2r; %x0 = [10 * d2r; 10 * d2r; 10 * d2r; 10 * d2r; 10 * d2r]; DA_PARAM = [15, 2956, -0.03306 * d2r]; DR_PARAM = [18, 2905, -0.03438 * d2r]; %iSD = 1; SDyError = 1./[1E-2, 1E-3, 1E-3, 1E-4, 1E-4, 1E1]'.^0.5; % b, p, q, r, phi, psi, ay elseif target_log == 105, parFlag = [ 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 1; 1; 1; 1; 1;]; %1; 1; 1; 1; 1;]; U0 = 16; THETA0 = -6 * d2r; %x0 = [10 * d2r; 10 * d2r; 10 * d2r; 10 * d2r; 10 * d2r]; DA_PARAM = [15, 2956, -0.03306 * d2r]; DR_PARAM = [18, 2905, -0.03438 * d2r]; %iSD = 1; SDyError = 1./[1E-2, 1E-3, 1E-3, 1E-4, 1E-4, 1E1]'.^0.5; % b, p, q, r, phi, psi, ay end elseif (target_log < 250), files = { '280769.0.arc', % 200 '280779.0.arc', % 201 '280813.0.rep', % 202 '280819.0.rep', % 203 '280846.0.red', % 204 '280912.0.s', % 205 '280957.0.rep', % 206 '280961.0.rep'};% 207 dirname = '../../091228_si/CVS_IGNORE/090623_taiki/'; log_file = [dirname, char(files(target_log - 199)), '.csv']; output_file = [dirname, char(files(target_log - 199)), '.fem.csv']; if target_log == 200, U0 = 23.2; BOFFSET = 10 * d2r; THETA0 = 2 * d2r; param = [ -1.00000D+01; -1.00000D-02; 1.00000D-01; 5.00000D+00;... -2.00000D+02; -4.00000D+01; 5.00000D+01; 1.00000D+02; -4.00000D+01;... -4.00000D+01; -5.00000D+00; -1.00000D+00; 1.00000D+01; -2.00000D+01;... 1.00000D-02; 1.00000D-02; 1.00000D-02; 1.00000D-02; 1.00000D-02]; parFlag = [ 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 1; 1; 1; 1; 0;... 0; 0; 0; 0; 0;]; x0 = [1 * d2r; 1 * d2r; 1 * d2r; 1 * d2r; 1 * d2r]; %iSD = 1; SDyError = 1./[1E-4, 1E-4, 1E-4, 1E-4, 1E-4, 1E-2]'.^0.5; % b, p, q, r, phi, psi, ay end elseif (target_log < 300), files = { '293033.5.arc', % 250 '293058.0.rep', % 251 '293061.0.rep', % 252 '293077.0.red', % 253 '293094.2.rd', % 254 '293135.8.s', % 255 '293154.8.s', % 256 '293163.1.arc', % 257 '293188.1.ad', % 258 '293190.6.rd', % 259 '293198.5.rd'}; % 260 dirname = '../../091228_si/CVS_IGNORE/091012_taiki/'; log_file = [dirname, char(files(target_log - 249)), '.csv']; output_file = [dirname, char(files(target_log - 249)), '.fem.csv']; end disp(['Log NO. = ', num2str(target_log), '; file => ', log_file]); if (target_log < 200), disp('Longitudinal motion, nonlinear model -- MUAV: Nx=4, Ny=5, Nu=2') elseif (target_log < 300), disp('Longitudinal motion, nonlinear model -- Orca: Nx=4, Ny=5, Nu=2') end data = load(log_file); % Number of data points Ndata = size(data,1); izhf = Ndata; % Generate new time axis t = [0:dt:Ndata*dt-dt]'; % Observation variables beta, p, r, phi, psi, ay Z = [data(:,14)-BOFFSET,data(:,34),data(:,36),data(:,10),data(:,8),data(:,32)]; % Input variables da, dr Uinp = [ ... (data(:,DA_PARAM(1)) - DA_PARAM(2)) * DA_PARAM(3), ... (data(:,DR_PARAM(1)) - DR_PARAM(2)) * DR_PARAM(3)]; % トリム状態における対気速度[m/s], 下方向速度[m/s], ピッチ角(安定軸), ピトー管オフセット global stables; stables = [U0, W0, THETA0]; % Total number of free parameters NparID = size(find(parFlag~=0),1); % Initial conditions on state variables beta, p, r, phi, psi if ~exist('x0'), x0 = [mean(Z(1:10,1)); mean(Z(1:10,2)); mean(Z(1:10,3)); mean(Z(1:10,4)); mean(Z(1:10,5))]; end if ~exist('SDyError'), SDyError = []; end