Этот пример показывает моделирование серого ящика большого, и объедините нелинейную систему. Цель состоит в том, чтобы показать способность использовать модель IDNLGREY, чтобы оценить большое количество параметров (16) в системе, имеющей много входных параметров (10) и выходные параметры (5). Система является аэродинамическим телом. Мы создаем модель, которая предсказывает ускорение и скорость тела с помощью измерений его скоростей (поступательный и угловой) и различные углы, связанные с его поверхностями управления.
Мы загружаем измеренные скорости, углы и динамическое давление файла данных, названного aerodata.mat:
load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'aerodata'));
Этот файл содержит однородно набор выборочных данных с 501 выборкой в переменных u
и y
. Шаг расчета составляет 0,02 секунды. Этот набор данных был сгенерирован из другой более тщательно продуманной модели аэродинамического тела.
Затем мы создаем объект IDDATA представлять и хранить данные:
z = iddata(y, u, 0.02, 'Name', 'Data'); z.InputName = {'Aileron angle' 'Elevator angle' ... 'Rudder angle' 'Dynamic pressure' ... 'Velocity' ... 'Measured angular velocity around x-axis' ... 'Measured angular velocity around y-axis' ... 'Measured angular velocity around z-axis' ... 'Measured angle of attack' ... 'Measured angle of sideslip'}; z.InputUnit = {'rad' 'rad' 'rad' 'kg/(m*s^2)' 'm/s' ... 'rad/s' 'rad/s' 'rad/s' 'rad' 'rad'}; z.OutputName = {'V(x)' ... % Angular velocity around x-axis 'V(y)' ... % Angular velocity around y-axis 'V(z)' ... % Angular velocity around z-axis 'Accel.(y)' ... % Acceleration in y-direction 'Accel.(z)' ... % Acceleration in z-direction }; z.OutputUnit = {'rad/s' 'rad/s' 'rad/s' 'm/s^2' 'm/s^2'}; z.Tstart = 0; z.TimeUnit = 's';
Просмотрите входные данные:
figure('Name', [z.Name ': input data'],... 'DefaultAxesTitleFontSizeMultiplier',1,... 'DefaultAxesTitleFontWeight','normal',... 'Position',[50, 50, 850, 620]); for i = 1:z.Nu subplot(z.Nu/2, 2, i); plot(z.SamplingInstants, z.InputData(:,i)); title(['Input #' num2str(i) ': ' z.InputName{i}],'FontWeight','normal'); xlabel(''); axis tight; if (i > z.Nu-2) xlabel([z.Domain ' (' z.TimeUnit ')']); end end
Рисунок 1: Входные сигналы.
Просмотрите выходные данные:
figure('Name', [z.Name ': output data']); h_gcf = gcf; Pos = h_gcf.Position; h_gcf.Position = [Pos(1), Pos(2)-Pos(4)/2, Pos(3), Pos(4)*1.5]; for i = 1:z.Ny subplot(z.Ny, 1, i); plot(z.SamplingInstants, z.OutputData(:,i)); title(['Output #' num2str(i) ': ' z.OutputName{i}]); xlabel(''); axis tight; end xlabel([z.Domain ' (' z.TimeUnit ')']);
Рисунок 2: Выходные сигналы.
На первый взгляд может выглядеть странным измерить варианты некоторых выходных параметров во входном векторе. Однако модель, используемая для генерации данных, содержит несколько интеграторов, которые часто приводят к нестабильному поведению симуляции. Чтобы избежать этого, измерения некоторых выходных сигналов возвращены через нелинейного наблюдателя. Это вход 6 - 8 в наборе данных z
. Таким образом это - система, действующая в замкнутом цикле, и цель осуществления моделирования состоит в том, чтобы предсказать "будущие" значения тех выходных параметров с помощью измерений текущего и прошлого поведения.
Чтобы смоделировать динамику интереса, мы используем объект модели IDNLGREY, чтобы представлять структуру пространства состояний системы. Разумная структура получена при помощи основной силы Ньютона и законов об импульсе (уравнения баланса). Чтобы полностью описать структуру модели, основные аэродинамические отношения (конститутивные отношения) также используются.
Файл MEX на C, aero_c.c, описывает систему с помощью состояния и выходных уравнений и начальных условий, аналогичных описанному затем. Не использование деривации детализирует для уравнений движения, мы только отображаем конечное состояние и выводим уравнения и замечаем, что структура является довольно комплексной, а также нелинейной.
/* State equations. */
void compute_dx(double *dx, double *x, double *u, double **p)
{
/* Retrieve model parameters. */
double *F, *M, *C, *d, *A, *I, *m, *K;
F = p[0]; /* Aerodynamic force coefficient. */
M = p[1]; /* Aerodynamic momentum coefficient. */
C = p[2]; /* Aerodynamic compensation factor. */
d = p[3]; /* Body diameter. */
A = p[4]; /* Body reference area. */
I = p[5]; /* Moment of inertia, x-y-z. */
m = p[6]; /* Mass. */
K = p[7]; /* Feedback gain. */
/* x[0]: Angular velocity around x-axis. */
/* x[1]: Angular velocity around y-axis. */
/* x[2]: Angular velocity around z-axis. */
/* x[3]: Angle of attack. */
/* x[4]: Angle of sideslip. */
dx[0] = 1/I[0]*(d[0]*A[0]*(M[0]*x[4]+0.5*M[1]*d[0]*x[0]/u[4]+M[2]*u[0])*u[3]-(I[2]-I[1])*x[1]*x[2])+K[0]*(u[5]-x[0]);
dx[1] = 1/I[1]*(d[0]*A[0]*(M[3]*x[3]+0.5*M[4]*d[0]*x[1]/u[4]+M[5]*u[1])*u[3]-(I[0]-I[2])*x[0]*x[2])+K[0]*(u[6]-x[1]);
dx[2] = 1/I[2]*(d[0]*A[0]*(M[6]*x[4]+M[7]*x[3]*x[4]+0.5*M[8]*d[0]*x[2]/u[4]+M[9]*u[0]+M[10]*u[2])*u[3]-(I[1]-I[0])*x[0]*x[1])+K[0]*(u[7]-x[2]);
dx[3] = (-A[0]*u[3]*(F[2]*x[3]+F[3]*u[1]))/(m[0]*u[4])-x[0]*x[4]+x[1]+K[0]*(u[8]/u[4]-x[3])+C[0]*pow(x[4],2);
dx[4] = (-A[0]*u[3]*(F[0]*x[4]+F[1]*u[2]))/(m[0]*u[4])-x[2]+x[0]*x[3]+K[0]*(u[9]/u[4]-x[4]);
}
/* Output equations. */
void compute_y(double *y, double *x, double *u, double **p)
{
/* Retrieve model parameters. */
double *F, *A, *m;
F = p[0]; /* Aerodynamic force coefficient. */
A = p[4]; /* Body reference area. */
m = p[6]; /* Mass. */
/* y[0]: Angular velocity around x-axis. */
/* y[1]: Angular velocity around y-axis. */
/* y[2]: Angular velocity around z-axis. */
/* y[3]: Acceleration in y-direction. */
/* y[4]: Acceleration in z-direction. */
y[0] = x[0];
y[1] = x[1];
y[2] = x[2];
y[3] = -A[0]*u[3]*(F[0]*x[4]+F[1]*u[2])/m[0];
y[4] = -A[0]*u[3]*(F[2]*x[3]+F[3]*u[1])/m[0];
}
Мы должны также ввести начальные значения этих 23 параметров. Мы задаем некоторые параметры (аэродинамические коэффициенты силы, аэродинамические коэффициенты импульса, и момент факторов инерции) как векторы в 8 различных объектах параметра. Начальные значения параметров получены частично физическим обоснованием и частично количественным предположением. Последние 4 параметра (A, я, m и K) являются более или менее константами, таким образом, путем фиксации этих параметров мы получаем структуру модели 16 свободными параметрами, распределенными среди объектов параметра F, M, C и d.
Parameters = struct('Name', ... {'Aerodynamic force coefficient' ... % F, 4-by-1 vector. 'Aerodynamic momentum coefficient' ... % M, 11-by-1 vector. 'Aerodynamic compensation factor' ... % C, scalar. 'Body diameter' ... % d, scalar. 'Body reference area' ... % A, scalar. 'Moment of inertia, x-y-z' ... % I, 3-by-1 vector. 'Mass' ... % m, scalar. 'Feedback gain'}, ... % K, scalar. 'Unit', ... {'1/(rad*m^2), 1/(rad*m^2), 1/(rad*m^2), 1/(rad*m^2)' ... ['1/rad, 1/(s*rad), 1/rad, 1/rad, ' ... '1/(s*rad), 1/rad, 1/rad, 1/rad^2, ' ... '1/(s*rad), 1/rad, 1/rad'] ... '1/(s*rad)' 'm' 'm^2' ... 'kg*m^2, kg*m^2,kg*m^2' 'kg' '-'}, ... 'Value', ... {[20.0; -6.0; 35.0; 13.0] ... [-1.0; 15; 3.0; -16.0; -1800; -50; 23.0; -200; -2000; -17.0; -50.0] ... -5.0, 0.17, 0.0227 ... [0.5; 110; 110] 107 6}, ... 'Minimum',... {-Inf(4, 1) -Inf(11, 1) -Inf -Inf -Inf -Inf(3, 1) -Inf -Inf}, ... % Ignore constraints. 'Maximum', ... {Inf(4, 1) Inf(11, 1) Inf Inf Inf Inf(3, 1) Inf Inf}, ... % Ignore constraints. 'Fixed', ... {false(4, 1) false(11, 1) false true true true(3, 1) true true});
Мы также задаем 5 состояний структуры модели таким же образом:
InitialStates = struct('Name', {'Angular velocity around x-axis' ... 'Angular velocity around y-axis' ... 'Angular velocity around z-axis' ... 'Angle of attack' 'Angle of sideslip'}, ... 'Unit', {'rad/s' 'rad/s' 'rad/s' 'rad' 'rad'}, ... 'Value', {0 0 0 0 0}, ... 'Minimum', {-Inf -Inf -Inf -Inf -Inf},... % Ignore constraints. 'Maximum', {Inf Inf Inf Inf Inf},... % Ignore constraints. 'Fixed', {true true true true true});
Файл модели наряду с порядком, параметром и данными о начальных состояниях теперь используется, чтобы создать объект IDNLGREY, описывающий систему:
FileName = 'aero_c'; % File describing the model structure. Order = [5 10 5]; % Model orders [ny nu nx]. Ts = 0; % Time-continuous system. nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts, ... 'Name', 'Model', 'TimeUnit', 's');
Затем мы используем данные из объекта IDDATA задать сигналы ввода и вывода системы:
nlgr.InputName = z.InputName; nlgr.InputUnit = z.InputUnit; nlgr.OutputName = z.OutputName; nlgr.OutputUnit = z.OutputUnit;
Таким образом у нас есть объект IDNLGREY с 10 входными сигналами, 5 состояниями и 5 выходными сигналами. Как упомянуто ранее, модель также содержит 23 параметра, 7 из которых фиксируются и 16 из которых свободны:
nlgr
nlgr = Continuous-time nonlinear grey-box model defined by 'aero_c' (MEX-file): dx/dt = F(t, u(t), x(t), p1, ..., p8) y(t) = H(t, u(t), x(t), p1, ..., p8) + e(t) with 10 input(s), 5 state(s), 5 output(s), and 16 free parameter(s) (out of 23). Name: Model Status: Created by direct construction or transformation. Not estimated.
Прежде, чем оценить 16 свободных параметров, мы симулируем систему с помощью начального вектора параметра. Симуляция предоставляет полезную информацию о качестве первоначальной модели:
clf
compare(z, nlgr); % simulate the model and compare the response to measured values
Рисунок 3: Сравнение между измеренными выходными параметрами и симулированными выходными параметрами первоначальной модели.
Из графика мы видим, что измеренные и симулированные сигналы совпадают друг с другом тесно за исключением отрезка времени 4 - 6 секунд. Этот факт ясно показан в графике ошибок предсказания:
figure; h_gcf = gcf; Pos = h_gcf.Position; h_gcf.Position = [Pos(1), Pos(2)-Pos(4)/2, Pos(3), Pos(4)*1.5]; pe(z, nlgr);
Рисунок 4: ошибки Предсказания первоначальной модели.
Первоначальная модель, как задано выше является вероятной начальной точкой для оценки параметра. Затем мы вычисляем ошибочную оценку предсказания 16 свободных параметров. Этот расчет займет время.
duration = clock; nlgr = nlgreyest(z, nlgr, nlgreyestOptions('Display', 'on')); duration = etime(clock, duration);
На используемом компьютере оценка параметров заняла следующее количество времени, чтобы завершиться:
disp(['Estimation time : ' num2str(duration, 4) ' seconds']);
Estimation time : 26.52 seconds
disp(['Time per iteration: ' num2str(duration/nlgr.Report.Termination.Iterations, 4) ' seconds.']);
Time per iteration: 1.263 seconds.
Чтобы оценить качество предполагаемой модели и проиллюстрировать улучшение по сравнению с первоначальной моделью, мы симулируем предполагаемую модель и сравниваем измеренные и симулированные выходные параметры:
clf compare(z, nlgr);
Рисунок 5: Сравнение между измеренными выходными параметрами и симулированными выходными параметрами предполагаемой модели.
Фигура ясно указывает на улучшение по сравнению с результатом симуляции, полученным с первоначальной моделью. Системная динамика в отрезке времени 4 - 6 секунд теперь получена с намного более высокой точностью, чем прежде. Это лучше всего отображено путем рассмотрения ошибок предсказания:
figure; h_gcf = gcf; Pos = h_gcf.Position; h_gcf.Position = [Pos(1), Pos(2)-Pos(4)/2, Pos(3), Pos(4)*1.5]; pe(z, nlgr);
Рисунок 6: ошибки Предсказания предполагаемой модели.
Давайте завершим тематическое исследование путем отображения модели и оцененной неопределенности:
present(nlgr);
nlgr = Continuous-time nonlinear grey-box model defined by 'aero_c' (MEX-file): dx/dt = F(t, u(t), x(t), p1, ..., p8) y(t) = H(t, u(t), x(t), p1, ..., p8) + e(t) with 10 input(s), 5 state(s), 5 output(s), and 16 free parameter(s) (out of 23). Inputs: u(1) Aileron angle(t) [rad] u(2) Elevator angle(t) [rad] u(3) Rudder angle(t) [rad] u(4) Dynamic pressure(t) [kg/(m*s^2)] u(5) Velocity(t) [m/s] u(6) Measured angular velocity around x-axis(t) [rad/s] u(7) Measured angular velocity around y-axis(t) [rad/s] u(8) Measured angular velocity around z-axis(t) [rad/s] u(9) Measured angle of attack(t) [rad] u(10) Measured angle of sideslip(t) [rad] States: Initial value x(1) Angular velocity around x-axis(t) [rad/s] xinit@exp1 0 (fixed) in [-Inf, Inf] x(2) Angular velocity around y-axis(t) [rad/s] xinit@exp1 0 (fixed) in [-Inf, Inf] x(3) Angular velocity around z-axis(t) [rad/s] xinit@exp1 0 (fixed) in [-Inf, Inf] x(4) Angle of attack(t) [rad] xinit@exp1 0 (fixed) in [-Inf, Inf] x(5) Angle of sideslip(t) [rad] xinit@exp1 0 (fixed) in [-Inf, Inf] Outputs: y(1) V(x)(t) [rad/s] y(2) V(y)(t) [rad/s] y(3) V(z)(t) [rad/s] y(4) Accel.(y)(t) [m/s^2] y(5) Accel.(z)(t) [m/s^2] Parameters: Value Standard Deviation p1(1) Aerodynamic force coefficient [1/(rad*m^2..] 21.2863 0.339394 (estimated) in [-Inf, Inf] p1(2) -7.62502 0.180264 (estimated) in [-Inf, Inf] p1(3) 35.0799 0.657227 (estimated) in [-Inf, Inf] p1(4) 8.58246 1.08611 (estimated) in [-Inf, Inf] p2(1) Aerodynamic momentum coefficient [1/rad, 1/(..] -1.0476 0.0733533 (estimated) in [-Inf, Inf] p2(2) 15.6854 0.883102 (estimated) in [-Inf, Inf] p2(3) 3.00613 0.199227 (estimated) in [-Inf, Inf] p2(4) -17.7963 0.324639 (estimated) in [-Inf, Inf] p2(5) -1060.91 224.269 (estimated) in [-Inf, Inf] p2(6) -53.5594 1.25436 (estimated) in [-Inf, Inf] p2(7) 34.6095 1.37299 (estimated) in [-Inf, Inf] p2(8) -210.237 7.95211 (estimated) in [-Inf, Inf] p2(9) -2641.55 273.034 (estimated) in [-Inf, Inf] p2(10) -33.6327 3.05742 (estimated) in [-Inf, Inf] p2(11) -50.9269 1.64086 (estimated) in [-Inf, Inf] p3 Aerodynamic compensation factor [1/(s*rad)] -0.640669 0.706338 (estimated) in [-Inf, Inf] p4 Body diameter [m] 0.17 0 (fixed) in [-Inf, Inf] p5 Body reference area [m^2] 0.0227 0 (fixed) in [-Inf, Inf] p6(1) Moment of inertia, x-y-z [kg*m^2, kg..] 0.5 0 (fixed) in [-Inf, Inf] p6(2) 110 0 (fixed) in [-Inf, Inf] p6(3) 110 0 (fixed) in [-Inf, Inf] p7 Mass [kg] 107 0 (fixed) in [-Inf, Inf] p8 Feedback gain [-] 6 0 (fixed) in [-Inf, Inf] Name: Model Status: Termination condition: Maximum number of iterations or number of function evaluations reached.. Number of iterations: 21, Number of function evaluations: 22 Estimated using Solver: ode45; Search: lsqnonlin on time domain data "Data". Fit to estimation data: [52.93;94.91;91.4;96.07;98.84]% FPE: 4.627e-10, MSE: 1.672 More information in model's "Report" property.
Предполагаемая модель является хорошей начальной точкой для исследования основной эффективности различных стратегий управления. Высокочастотные модели, которые предпочтительно имеют физическую интерпретацию, являются, например, жизненными компонентами так называемых "прогнозирующих систем управления модели".
Для получения дополнительной информации об идентификации динамических систем с System Identification Toolbox™ см. страницу продукта System Identification Toolbox.