Этот пример показывает, как оценить параметры модели с помощью линейного и нелинейного серо-прямоугольного моделирования.
Используйте идентификацию серого ящика, чтобы оценить коэффициенты ОДУ, которые описывают динамику модели, чтобы соответствовать заданной траектории отклика.
Для линейной динамики представьте модель с помощью линейной модели серого ящика (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, an iddata объект со шаг расчета 0,1 секунды. The 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)
The 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 задает начальное предположение для коэффициента вязкого трения. The '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);

The 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');

The 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