Проектируйте оптимизацию с использованием требований интерполяционной таблицы для табличного управления (кода)

Этот пример показывает, как настроить параметры в интерполяционной таблице в модели, которая использует табличное управление для настройки реакции контроллера на объект, которая изменяется. Настройка модели использует sdo.optimize команда.

Модель управления судном

Откройте модель Simulink.

mdl = 'sdoShipSteering';
open_system(mdl)

Эта модель реализует модель Nomoto, которая обычно используется для управления судном. Динамические характеристики корабля значительно варьируются с такими факторами, как скорость корабля. Поэтому контроллер руля также должен изменяться со скоростью, порядок удовлетворять требованиям для управления судном.

Чтобы держать корабль на курсе, цикл управления сравнивает угол рыскания корабля с контрольным углом рыскания, и контроллер ПД отправляет командные сигналы в руль направления. Блок Ship Plant реализует модель Nomoto, систему второго порядка, параметры которой варьируются от скорости корабля. Корабль изначально движется с максимальной скоростью 15 м/с, но замедлится, когда эталонная траектория задаст поворот в воде. Этот поворот, наряду с силой двигателя, используется блоком Force Dynamics для вычисления скорости корабля с течением времени. Блок Kinematics вычисляет траекторию корабля.

Откройте блок Controller.

open_system([mdl  '/Controller'])

Когда скорость меняется, судовой объект также меняется. Поэтому коэффициент усиления контроллера должен измениться, и скорость используется в качестве переменной планирования. Контроллер имеет форму K(1 + sTd) где K - общий коэффициент усиления и Td - временная константа, связанная с производным членом. Табличное управление реализуется через интерполяционные таблицы, а данные таблицы заданы K и Td. Это векторы, которые задают различные значения для различных скоростей. Различные скорости заданы в векторах точек по оси Х интерполяционной таблицы bpK и bpTd.

Задача проекта

В ссылке указывается, что на 200 секунде корабль должен развернуться на 180 степени и развернуться обратным курсом. Одно из требований состоит в том, что угол рыскания корабля должен соответствовать ссылке угла рыскания в конверте. Для обеспечения безопасности и комфорта пассажиров второе требование заключается в том, что полное ускорение судна должно находиться в пределах границы 0,25 г, где 1 г - ускорение гравитации на поверхности Земли, 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 г в любое время. Полное ускорение состоит из двух компонентов, тангенциальной составляющей по направлению движения корабля и нормальной (горизонтальной) составляющей. Требование, чтобы полное ускорение не превышало 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);

Задайте конструктивные переменные

Задайте переменные проекты, которые будут настроены стандартной программой оптимизации порядка чтобы удовлетворить требования. Задайте усиления контроллера, 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, чтобы запустить модель. Создайте симулятор и добавьте сигналы модели в журнал, чтобы их значения были доступны для функции затрат.

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 Fast Restart.

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

Чтобы оптимизировать, задайте указатель на функцию затрат, которая использует Simulator и Требования, определенные выше. Используйте анонимную функцию, которая принимает один аргумент (переменные проекта) и вызывает целевую функцию. Наконец, позвоните 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's. В сложение диаметр поворота составляет 615 метров, что плотнее, чем когда не настраивались точки останова.

sdo.setValueInModel(mdl, Optimized_DesignVars);
hPlots = sdoShipSteeringPlots(mdl, Requirements, hPlots);

В этом примере судовой объект изменялся со скоростью корабля, поэтому коэффициент усиления контроллера также должен был изменяться. Табличное управление было реализовано с помощью интерполяционных таблиц. Путем настройки коэффициентов усиления и значений точек останова в контроллере, корабль смог следовать за контрольным углом рыскания, одновременно ограничивая полное ускорение для обеспечения безопасного и комфортного плавания пассажиров.

Похожие примеры

Чтобы узнать, как оптимизировать интерполяционные таблицы в запланированном контроллере усиления с помощью Response Optimizer, смотрите Оптимизацию проекта с использованием требований интерполяционной таблицы для табличного управления (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

См. также

| | | | |

Похожие темы