В этом примере показано, как настроить параметры в таблице поиска в модели, которая использует планирование усиления для настройки отклика контроллера на изменяющуюся установку. При настройке модели используется sdo.optimize команда.
Откройте модель Simulink.
mdl = 'sdoShipSteering';
open_system(mdl)

Эта модель реализует модель Номото, которая обычно используется для рулевого управления судна. Динамические характеристики судна существенно варьируются в зависимости от таких факторов, как скорость судна. Поэтому контроллер руля направления должен также изменяться в зависимости от скорости, чтобы соответствовать требованиям для управления судном.
Для удержания корабля на курсе контур управления сравнивает курсовый угол корабля с эталонным курсовым углом, а контроллер ПД подает командные сигналы на руль направления. Блок Ship Plant реализует модель Nomoto, систему второго порядка, параметры которой изменяются в зависимости от скорости корабля. Судно первоначально движется со своей максимальной скоростью 15 м/с, но замедлится, когда опорная траектория определит поворот в воде. Этот поворот вместе с усилием двигателя используется блоком Force Dynamics для вычисления скорости корабля во времени. Блок «Кинематика» вычисляет траекторию корабля.
Откройте блок контроллера.
open_system([mdl '/Controller'])

При изменении скорости изменяется и судовая установка. Поэтому коэффициенты усиления контроллера PD должны изменяться, и скорость используется в качестве переменной планирования. Контроллер в форме K(1 + sTd) где K - общий выигрыш и Td - постоянная времени, связанная с производным членом. Планирование усиления реализуется посредством таблиц поиска, а данные таблицы определяются K и Td. Это векторы, которые определяют различные значения для различных скоростей. Различные скорости указаны в векторах точек останова таблицы поиска bpK и bpTd.
В справке уточняется, что в 200 секунд корабль должен повернуть на 180 градусов и обратить курс вспять. Одно требование состоит в том, что угол курса судна должен соответствовать углу опорного курса в пределах огибающей. Для безопасности и комфорта пассажиров второе требование состоит в том, что общее ускорение судна должно оставаться в пределах границы 0,25 g, где 1 g - ускорение гравитации на поверхности Земли, 9,8 м/с/с.
Векторы параметров контроллера K и Td будут являться конструктивными переменными и будут настроены на соответствие требованиям. Если невозможно выполнить оба требования, то таблица поиска имеет точки останова bpK и bpTd также будет использоваться в качестве конструктивных переменных. В этом случае нам нужно будет указать дополнительное требование, которое bpK и bpTd должен быть монотонно строго увеличен, потому что это требуется для векторов точек останова в таблицах поиска Simulink.
Укажите требования, которые должны быть удовлетворены. Во-первых, корабль должен следовать по опорной траектории. Поскольку ссылка по существу представляет собой изменение шага от 0 до 180 градусов, для угла курса судна задается огибающая ответа шага.
Requirements = struct; Requirements.StepResponseEnvelope = sdo.requirements.StepResponseEnvelope(... 'StepTime', 200, ... (seconds) 'RiseTime', 75, ... 'SettlingTime', 200, ... 'PercentRise', 85, ... (%) 'PercentOvershoot', 5, ... 'PercentSettling', 1, ... 'FinalValue', pi ... (radians) );
Второе требование заключается в том, что для безопасности и комфорта пассажиров общее ускорение не должно превышать 0,25 g в любое время. Суммарное ускорение состоит из двух компонентов: тангенциального компонента вдоль направления движения корабля и нормального (горизонтального) компонента. Требование о том, чтобы суммарное ускорение не превышало 0,25 g, соответствует требованию о том, чтобы в фазовой плоскости тангенциального и нормального ускорения траектория этого корабля оставалась в пределах круга радиуса 0,25 * 9,8.
accelGravity = 9.8; Requirements.Comfort = sdo.requirements.PhasePlaneEllipse(... 'Radius', 0.25*[1 1] * accelGravity );
Проверьте поведение корабля с начальными, не настроенными параметрами контроллера, чтобы убедиться, что требования выполнены. Используйте функцию sdoShipSteeringPlots для построения графика поведения корабля. Первый график ниже показывает, что угол курса корабля остается в пределах допусков огибающей ответа на шаг, удовлетворяя первому требованию. На втором графике показана траектория движения корабля в воде. Черная стрелка указывает начальное положение и направление движения. Корабль разворачивается на 180 градусов и диаметр составляет примерно 415 метров. Третий график показывает ускорение корабля в фазовой плоскости тангенциального и нормального ускорения. Черная стрелка указывает начальную точку и направление эволюции во времени. Суммарный разгон превышает границы вблизи 208 секунд, поэтому требование безопасности и комфорта пассажиров не удовлетворяется.
hPlots = sdoShipSteeringPlots(mdl, Requirements);



Укажите конструктивные переменные, настраиваемые подпрограммой оптимизации в соответствии с требованиями. Укажите коэффициент усиления контроллера PD, K и Td, в качестве конструктивных переменных. Для начальных значений используйте -0.1 для всех записей в K вектор и 50 для всех записей в Td вектор. Если не все требования могут быть удовлетворены, то позже векторы точек останова bpK и bpTd также могут быть конструктивными переменными.
DesignVars = sdo.getParameterFromModel(mdl, {'K','Td'});
DesignVars(1).Value = -0.1*[1 1 1 1];
DesignVars(2).Value = 50*[1 1 1 1];
sdo.setValueInModel(mdl, DesignVars);
Создайте целевую функцию, которая будет вызываться при каждой итерации оптимизации для оценки требований конструкции по мере настройки конструктивных переменных. Эта функция затрат имеет входные аргументы для модели, конструктивных переменных, симулятора (определенного ниже) и требований к конструкции. Функция затрат использует максимум требований Comfort в любое время при вычислении, чтобы объединить результаты оценки требований в скаляр, чтобы количество элементов было одинаковым независимо от временных шагов, выполняемых решателем Simulink.
type sdoShipSteering_Design
function Vals = sdoShipSteering_Design(mdl, P, Simulator, Requirements)
%SDOSHIPSTEERING_DESIGN Objective function for ship steering
%
% Function called at each iteration of the optimization problem.
%
% The function is called with the model named mdl, a set of parameter
% values, P, a Simulator, and the design Requirements to evaluate. It
% returns the objective value and constraint violations, Vals, to the
% optimization solver.
%
% See the sdoExampleCostFunction function and sdo.optimize for a more
% detailed description of the function signature.
%
% See also sdoShipSteering_cmddemo
% Copyright 2016 The MathWorks, Inc.
%% Model Evaluation
% Simulate the model.
Simulator.Parameters = P;
Simulator = sim(Simulator);
% Retrieve logged signal data.
SimLog = find(Simulator.LoggedData,get_param(mdl, 'SignalLoggingName'));
Heading = find(SimLog, 'Heading');
NormalAccel = find(SimLog, 'NormalAccel');
TangenAccel = find(SimLog, 'TangenAccel');
% Evaluate the step response envelope requirement
Cleq_StepResponseEnvelope = evalRequirement(Requirements.StepResponseEnvelope, Heading.Values);
% Evaluate the safety/comfort requirement on total acceleration.
Cleq_Comfort = evalRequirement(Requirements.Comfort, NormalAccel.Values, TangenAccel.Values);
%% Return Values.
% Collect the evaluated design requirement values in a structure to return
% to the optimization solver.
Vals.Cleq = Cleq_StepResponseEnvelope(:);
Vals.Cleq = [Vals.Cleq ; Cleq_Comfort];
% Evaluate monotonic variable requirement
if isfield(Requirements, 'Monotonic')
Cleq_bpK = evalRequirement(Requirements.Monotonic, P(3).Value);
Cleq_bpTd = evalRequirement(Requirements.Monotonic, P(4).Value);
Vals.Cleq = [Vals.Cleq ; Cleq_bpK ; Cleq_bpTd];
end
end
Для выполнения функции затрат требуется симулятор. Создайте симулятор и добавьте сигналы модели в журнал, чтобы их значения были доступны для функции затрат.
Simulator = sdo.SimulationTest(mdl); % Ship Heading Angle Heading = Simulink.SimulationData.SignalLoggingInfo; Heading.BlockPath = 'sdoShipSteering/Ship Plant'; Heading.LoggingInfo.LoggingName = 'Heading'; Heading.LoggingInfo.NameMode = 1; Heading.OutputPortIndex = 1; % Normal Acceleration NormalAccel = Simulink.SimulationData.SignalLoggingInfo; NormalAccel.BlockPath = 'sdoShipSteering/Kinematics'; NormalAccel.LoggingInfo.LoggingName = 'NormalAccel'; NormalAccel.LoggingInfo.NameMode = 1; NormalAccel.OutputPortIndex = 4; % Tangential Acceleration TangenAccel = Simulink.SimulationData.SignalLoggingInfo; TangenAccel.BlockPath = 'sdoShipSteering/Kinematics'; TangenAccel.LoggingInfo.LoggingName = 'TangenAccel'; TangenAccel.LoggingInfo.NameMode = 1; TangenAccel.OutputPortIndex = 5; % Collect logged signals Simulator.LoggingInfo.Signals = [... Heading ; ... NormalAccel ; ... TangenAccel ];
Перед оптимизацией настройте симулятор для быстрой оценки, включив функцию быстрого перезапуска Simulink.
Simulator = fastRestart(Simulator, 'on');
Во время оптимизации решатель Simulink может генерировать предупреждение, если размер временного шага становится слишком маленьким. Временное подавление этого предупреждения.
warnState = warning('query', 'Simulink:Engine:SolverMinStepSizeWarn'); warnState1 = warning('query', 'Simulink:Solver:Warning'); warnState2 = warning('query', 'SimulinkExecution:DE:MinStepSizeWarning'); warning('off', 'Simulink:Engine:SolverMinStepSizeWarn'); warning('off', 'Simulink:Solver:Warning'); warning('off', 'SimulinkExecution:DE:MinStepSizeWarning');
Для оптимизации определите дескриптор функции затрат, использующей симулятор и требования, определенные выше. Используйте анонимную функцию, которая принимает один аргумент (конструктивные переменные) и вызывает целевую функцию. Наконец, позвоните sdo.optimize оптимизация конструктивных переменных для обеспечения соответствия требованиям.
optimfcn = @(P) sdoShipSteering_Design(mdl, P, Simulator, Requirements); [Optimized_DesignVars, Info] = sdo.optimize(optimfcn, DesignVars);
Optimization started 27-Jan-2021 15:06:29
max First-order
Iter F-count f(x) constraint Step-size optimality
0 17 0 0.6127
1 34 0 0.3215 0.865 0.321
2 57 0 0.3079 0.174 0.308
3 103 0 0.3079 0.00127 0.308
Converged to an infeasible point.
fmincon stopped because the size of the current step is less than
the value of the step size tolerance but constraints are not
satisfied to within the value of the constraint tolerance.
Экран показывает, что оптимизатор не удовлетворял всем требованиям. Попробуйте оптимизировать конструктивные переменные в модели и постройте график результатов. Угол курса не находится в пределах требуемой огибающей ответа шага, а суммарное ускорение все еще превышает допустимый уровень во время части разворота. Кроме того, диаметр разворота увеличился до 660 метров, поэтому разворот не такой плотный, как при не настроенных выигрышах.
sdo.setValueInModel(mdl, Optimized_DesignVars); hPlots = sdoShipSteeringPlots(mdl, Requirements, hPlots);



Чтобы выполнить требования к конструкции, используйте результат оптимизации сверху в качестве начальной точки и настройте дополнительные переменные. Добавить точки останова bpK и bpTd в качестве конструктивных переменных. Максимальная скорость судна составляет 15 м/с, а при повороте может замедлиться до 60% от максимальной скорости, или 9 м/с. Установите начальное значение точки останова на равном расстоянии от 9 до 15 м/с. Ограничьте минимальные значения точек останова 9 м/с и максимальные значения точек останова 15 м/с.
DesignVars = Optimized_DesignVars;
DesignVars(3:4) = sdo.getParameterFromModel(mdl, {'bpK','bpTd'});
% Set initial values
DesignVars(3).Value = [9 11 13 15];
DesignVars(4).Value = [9 11 13 15];
% Constrain min and max values
DesignVars(3).Minimum = 9;
DesignVars(3).Maximum = 15;
DesignVars(4).Minimum = 9;
DesignVars(4).Maximum = 15;
% Set values in the model
sdo.setValueInModel(mdl, DesignVars);
Точки останова в блоке таблицы поиска Simulink должны быть строго монотонно увеличены. Добавьте его к проектным требованиям.
Requirements.Monotonic = sdo.requirements.MonotonicVariable; optimfcn = @(P) sdoShipSteering_Design(mdl, P, Simulator, Requirements);
Оптимизируйте модель, настроив все четыре конструктивные переменные, чтобы убедиться, что все требования могут быть выполнены.
[Optimized_DesignVars, Info] = sdo.optimize(optimfcn, DesignVars);
Optimization started 27-Jan-2021 15:06:51
max First-order
Iter F-count f(x) constraint Step-size optimality
0 29 0 0.3079
1 61 0 0.1432 0.148 1.01
2 94 0 0.03626 0.0858 0.597
3 123 0 0.01911 0.0548 0.0859
4 153 0 0.007837 0.0341 0.00627
5 183 0 0 0.0256 0.000903
Local minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
Экран показывает, что оптимизатор смог удовлетворить все требования. Попробуйте оптимизировать конструктивные переменные в модели и постройте график результатов. На приведенных ниже графиках угол курса находится в пределах огибающей ответа шага, а общее ускорение находится в пределах допустимого диапазона 0,25 g. Кроме того, диаметр разворота составляет 615 метров, что плотнее, чем когда точки останова не настраивались.
sdo.setValueInModel(mdl, Optimized_DesignVars); hPlots = sdoShipSteeringPlots(mdl, Requirements, hPlots);



В этом примере судовая установка изменялась в зависимости от скорости судна, поэтому необходимо было также изменять коэффициенты усиления контроллера. Планирование усиления реализовано с использованием таблиц подстановки. Настроив значения коэффициентов усиления и точек останова в контроллере, судно смогло следовать опорному курсовому углу, одновременно ограничив общее ускорение для обеспечения безопасной и комфортной езды пассажиров.
Чтобы узнать, как оптимизировать таблицы поиска в запланированном контроллере усиления с помощью оптимизатора отклика, см. раздел Оптимизация конструкции с использованием требований к таблице поиска для планирования усиления (GUI).
% Close the model and figures, and restore state of warnings. fastRestart(Simulator, 'off'); % restore fast restart settings bdclose(mdl) close(hPlots) warning(warnState); % restore state of warning warning(warnState1); % restore state of warning warning(warnState2); % restore state of warning
sdo.requirements.FunctionMatching | sdo.requirements.MonotonicVariable | sdo.requirements.PhasePlaneEllipse | sdo.requirements.PhasePlaneRegion | sdo.requirements.RelationalConstraint | sdo.requirements.SmoothnessConstraint