В этом примере показано, как оценить параметры модели с помощью линейного и нелинейного моделирования «серый ящик».
Используйте идентификацию «серого ящика» для оценки коэффициентов ОДУ, которые описывают динамику модели в соответствии с заданной траекторией отклика.
Для линейной динамики представляйте модель с помощью линейной модели «серый ящик» (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 используется для указания атрибутов данных, таких как имя вывода, единица измерения вывода, время начала и единицы измерения вектора времени.
Предполагая, что маятник подвергается только небольшим угловым смещениям, уравнение, описывающее движение маятника, может быть упрощено:

Используя в 
качестве переменных состояния угловое смещение () и угловую скорость (), упрощенное уравнение можно переписать в виде:

Здесь,
![$$\begin{array}{l}
X(t) = \left[ {\begin{array}{*{20}{c}}
\theta \\
{\dot \theta }
\end{array}} \right]\\
A = \left[ {\begin{array}{*{20}{c}}
0&1\\
{\frac{{ - g}}{l}}&{\frac{{ - b}}{{m{l^2}}}}
\end{array}} \right]\\
B = 0\\
C = \left[ {\begin{array}{*{20}{c}}
1&0
\end{array}} \right]\\
D = 0
\end{array}$$](../../examples/ident/win64/EstimatingCoefficientsOfODEsToFitGivenSolutionExample_eq17344076538719644789.png)
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. Оценочная стоимость 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. Оценочная стоимость b, коэффициент вязкого трения, используя нелинейную оценку в сером ящике, возвращается в nonlinear_b_est.
5. Сравните отклик линейной и нелинейной серых моделей с измеренными данными.
compare(data,linear_model,nonlinear_model)

Нелинейная оценка модели «серого ящика» обеспечивает более близкое соответствие измеренным данным.
greyest | idgrey | idnlgrey | nlgreyest