В этом примере показано, как оценить параметры модели с помощью линейного и нелинейного моделирования серого ящика.
Используйте идентификацию серого ящика, чтобы оценить коэффициенты ОДУ, которые описывают динамику модели, чтобы соответствовать данной траектории ответа.
Для линейной динамики представляйте модель с помощью линейной модели серого ящика (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)
Нелинейная оценка модели серого ящика обеспечивает более близкую подгонку к результатам измерений.
greyest
| idgrey
| idnlgrey
| nlgreyest