В этом примере показано, как к настройкам параметров в интерполяционной таблице в модели, которая использует табличное управление, чтобы настроить ответ диспетчера на объект, который варьируется. Модель, настраивающаяся, использует 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 26-Jul-2019 21:08:07 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 26-Jul-2019 21:08:31 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 г. Кроме того, поворачивающийся диаметр составляет 615 метров, который более труден чем тогда, когда точки останова не были настроены.
sdo.setValueInModel(mdl, Optimized_DesignVars); hPlots = sdoShipSteeringPlots(mdl, Requirements, hPlots);
В этом примере объект поставки менялся в зависимости от скорости поставки, таким образом, усиления контроллера также должны были варьироваться. Табличное управление было реализовано с помощью интерполяционных таблиц. Путем настройки усилений и значений точки останова в контроллере, поставка смогла следовать за углом заголовка ссылки, также ограничивая общее ускорение гарантировать безопасную и удобную поездку для пассажиров.
Изучить, как оптимизировать интерполяционные таблицы в усилении, запланировало контроллер, использующий инструмент Response Optimization, см., "Что Оптимизация проекта Использует Требования Интерполяционной таблицы для Табличного управления (графический интерфейс пользователя)".
% 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