В этом примере показано, как оценить параметры модели с помощью линейного и нелинейного моделирования серого ящика.
Используйте идентификацию серого ящика, чтобы оценить коэффициенты ОДУ, которые описывают динамику модели, чтобы соответствовать данной траектории ответа.
Для линейной динамики представляйте модель с помощью линейной модели серого ящика (idgrey
). Оцените коэффициенты модели с помощью greyest
.
Для нелинейной динамики представляйте модель с помощью нелинейной модели серого ящика (idnlgrey
). Оцените коэффициенты модели с помощью nlgreyest
.
В этом примере вы оцениваете значение коэффициента трения математического маятника с помощью его данных о колебании. Уравнение движения математического маятника:
угловое смещение маятника относительно его состояния отдыха. g
ускорение свободного падения. m
масса маятника и l
длина маятника. b
коэффициент вязкого трения, значение которого, как оценивается, соответствует данным угловым данным о смещении. Нет никакой внешней движущей силы, которая способствует движению маятника.
load(fullfile(matlabroot,'toolbox','ident', ... 'iddemos','data','pendulumdata')); data = iddata(y,[],0.1,'Name','Pendulum'); data.OutputName = 'Pendulum position'; data.OutputUnit = 'rad'; data.Tstart = 0; data.TimeUnit = 's';
Измеренные угловые данные о смещении загружаются и сохранены как data
, iddata
объект с шагом расчета 0,1 секунд. set
команда используется, чтобы задать атрибуты данных, такие как выходное имя, устройство вывода, и время начала и модули временного вектора.
Предположение, что маятник подвергается только маленьким угловым смещениям, уравнение, описывающее движение маятника, может быть упрощено:
Используя угловое смещение () и скорость вращения () как переменные состояния, упрощенное уравнение может быть переписано в форме:
Здесь,
B
и D
матрицы являются нулем, потому что нет никакой внешней движущей силы для математического маятника.
1. Создайте файл ОДУ, который связывает коэффициенты модели с его представлением пространства состояний.
function [A,B,C,D] = LinearPendulum(m,g,l,b,Ts) A = [0 1; -g/l, -b/m/l^2]; B = zeros(2,0); C = [1 0]; D = zeros(1,0); end
Функция, LinearPendulum
, возвращает представление пространства состояний линейной модели движения математического маятника с помощью коэффициентов модели m
G
L
, и b
. Ts
шаг расчета. Сохраните эту функцию как LinearPendulum.m
. Функциональный LinearPendulum
должен быть на пути MATLAB®. В качестве альтернативы можно задать имя полного пути для этой функции.
2. Создайте линейную модель серого ящика, сопоставленную с LinearPendulum
функция.
m = 1; g = 9.81; l = 1; b = 0.2; linear_model = idgrey('LinearPendulum',{m,g,l,b},'c');
m
G
и, l
задайте значения известных коэффициентов модели. b
задает исходное предположение для коэффициента вязкого трения. 'c'
входной параметр в вызове idgrey
задает linear_model
как система непрерывного времени.
3. Задайте m
G
, и l
как известные параметры.
linear_model.Structure.Parameters(1).Free = false; linear_model.Structure.Parameters(2).Free = false; linear_model.Structure.Parameters(3).Free = false;
Как задано на предыдущем шаге, m
G
, и l
первые три параметра linear_model
. Используя Structure.Parameters.Free
поле для каждого из параметров, m
G
, и l
заданы как фиксированные значения.
4. Создайте набор опции оценки, который задает начальное состояние, которое будет оценено, и включает отображение прогресса оценки. Также обеспечьте алгоритм оценки, чтобы возвратить устойчивую модель. Эта опция доступна только для линейной модели (idgrey) оценка.
opt = greyestOptions('InitialState','estimate','Display','on'); opt.EnforceStability = true;
5. Оцените коэффициент вязкого трения.
linear_model = greyest(data,linear_model,opt);
greyest
команда обновляет параметр linear_model
.
b_est = linear_model.Structure.Parameters(4).Value;
[linear_b_est,dlinear_b_est] = getpvec(linear_model,'free')
linear_b_est = 0.1178 dlinear_b_est = 0.0088
getpvec
возвращается, dlinear_b_est
, 1 неопределенность стандартного отклонения сопоставлена с b
, свободный параметр оценки linear_model
Ориентировочная стоимость.The b
, коэффициент вязкого трения, с помощью линейной оценки серого ящика возвращен в linear_b_est
.
6. Сравните ответ линейной модели серого ящика к результатам измерений.
compare(data,linear_model)
Линейная модель оценки серого ящика обеспечивает подгонку на 49,9% к результатам измерений. Плохая подгонка происходит из-за предположения, что маятник подвергается маленьким угловым смещениям, тогда как результаты измерений показывают большие колебания.
Нелинейная оценка серого ящика требует, чтобы вы описали дифференциальное уравнение в виде набора уравнений первого порядка.
Используя угловое смещение () и скорость вращения () как переменные состояния, уравнение движения может быть переписано в виде набора первого порядка нелинейные дифференциальные уравнения:
1. Создайте файл ОДУ, который связывает коэффициенты модели с его нелинейным представлением.
function [dx,y] = NonlinearPendulum(t,x,u,m,g,l,b,varargin) % Output equation. y = x(1); % Angular position. % State equations. dx = [x(2); ... % Angular position -(g/l)*sin(x(1))-b/(m*l^2)*x(2) ... % Angular velocity ]; end
Функция, NonlinearPendulum
, возвращает производные состояния и выход нелинейной модели движения маятника с помощью коэффициентов модели m
G
L
, и b
. Сохраните эту функцию как NonlinearPendulum.m
на пути MATLAB®. В качестве альтернативы можно задать имя полного пути для этой функции.
2. Создайте нелинейную модель серого ящика, сопоставленную с NonlinearPendulum
функция.
m = 1;
g = 9.81;
l = 1;
b = 0.2;
order = [1 0 2];
parameters = {m,g,l,b};
initial_states = [1; 0];
Ts = 0;
nonlinear_model = idnlgrey('NonlinearPendulum',order,parameters,initial_states,Ts);
3. Задайте m
G
, и l
как известные параметры.
setpar(nonlinear_model,'Fixed',{true true true false});
Как задано на предыдущем шаге, m
G
, и l
первые три параметра nonlinear_model
. Используя setpar
команда, m
G
, и l
заданы как фиксированные значения и b
задан как свободный параметр оценки.
4. Оцените коэффициент вязкого трения.
nonlinear_model = nlgreyest(data,nonlinear_model,'Display','Full');
nlgreyest
команда обновляет параметр nonlinear_model
.
b_est = nonlinear_model.Parameters(4).Value;
[nonlinear_b_est, dnonlinear_b_est] = getpvec(nonlinear_model,'free')
nonlinear_b_est = 0.1002 dnonlinear_b_est = 0.0149
getpvec
возвращается, как dnonlinear_b_est
, 1 неопределенность стандартного отклонения сопоставлена с b
, свободный параметр оценки nonlinear_model
Ориентировочная стоимость.The b
, коэффициент вязкого трения, с помощью нелинейной оценки серого ящика возвращен в nonlinear_b_est
.
5. Сравните ответ линейных и нелинейных моделей серого ящика к результатам измерений.
compare(data,linear_model,nonlinear_model)
Нелинейная оценка модели серого ящика обеспечивает более близкую подгонку к результатам измерений.
idgrey
| idnlgrey
| greyest
| nlgreyest