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

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

Поставьте держащуюся модель

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

mdl = 'sdoShipSteering';
open_system(mdl)

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

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

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

open_system([mdl  '/Controller'])

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

Проблема проектирования

Ссылка задает в 200 секунд, поставка должна повернуть 180 градусов и изменить курс. Одно требование - то, что угол рыскания поставки должен совпадать со ссылочным углом рыскания в конверте. Для безопасности и комфорта пассажиров, второе требование - то, что общее ускорение поставки должно остаться в связанном из 0,25 г, где 1 г является ускорением силы тяжести в поверхности Земли, 9.8 m/s/s.

Векторы параметра контроллера 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 г, соответствует требованию, чтобы в плоскости фазы тангенциального и нормального ускорения, траектория этой поставки осталась в кругу радиуса 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);

Создайте целевую функцию оптимизации

Создайте целевую функцию, которая будет вызвана в каждой итерации оптимизации, чтобы оценить конструктивные требования, когда переменные проекта настраиваются. Эта функция стоимости имеет входные параметры для модели, переменных проекта, средство моделирования (заданный ниже), и конструктивные требования. Функция стоимости использует максимум требований Комфорта в любом случае, когда это вычисляется, для того, чтобы консолидировать результаты оценки требования к скаляру, таким образом, число элементов является тем же самым независимо от временных шагов, взятых решателем 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 23-Jul-2021 09:09:45

                               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 23-Jul-2021 09:10:07

                               max                     First-order 
 Iter F-count        f(x)   constraint    Step-size    optimality
    0     29            0       0.3079
    1     62            0       0.1432        0.148         1.01
    2     96            0      0.03626       0.0858        0.597
    3    126            0      0.01911       0.0548       0.0859
    4    157            0     0.007837       0.0341      0.00627
    5    188            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 г. Кроме того, поворачивающийся диаметр составляет 615 метров, который более труден чем тогда, когда точки останова не были настроены.

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

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

Связанные примеры

Изучить, как оптимизировать интерполяционные таблицы в усилении, запланировало контроллер, использующий Response Optimizer, смотрите, что Оптимизация Проекта Использует Требования Интерполяционной таблицы для Табличного управления (графический интерфейс пользователя).

% 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

Смотрите также

| | | | |

Похожие темы