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

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

Гидравлическая цилиндрическая модель

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

sys = 'sdoHydraulicCylinder';
open_system(sys);

Гидравлическая цилиндрическая модель основана на модели Simulink sldemo_hydcyl. Модель включает:

  • Pump и подсистемы Cylinder Assembly. Для получения дополнительной информации о подсистемах см. "Симуляцию одиночного гидравлического цилиндра".

  • Ступенчатое изменение применилось к цилиндрической области отверстия распределительного клапана, которая заставляет цилиндрическое поршневое положение изменяться.

Гидравлическая цилиндрическая проблема проектирования

Вы настраиваете цилиндрическую площадь поперечного сечения и поршневой коэффициент упругости, чтобы соответствовать следующим конструктивным требованиям:

  • Гарантируйте, что поршневое положение имеет время нарастания переходного процесса меньше чем 0,04 секунд и времени установки меньше чем 0,05 секунд.

  • Ограничьте максимальные цилиндрические давления на 1.75e6 N/m.

  • Минимизируйте цилиндрическую площадь поперечного сечения.

Задайте переменные проекта

Выберите следующие параметры модели как переменные проекта для оптимизации:

  • Цилиндрическая площадь поперечного сечения Ac

  • Поршневой коэффициент упругости K

Ac = sdo.getParameterFromModel('sdoHydraulicCylinder','Ac');
K  = sdo.getParameterFromModel('sdoHydraulicCylinder','K');

Ограничьте цилиндрическую площадь поперечного сечения круговой областью с радиусом между 1 и 2 сантиметрами.

Ac.Minimum = pi*1e-2^2; % m^2
Ac.Maximum = pi*2e-2^2; % m^2

Ограничьте поршневой коэффициент упругости областью значений 1e4 к 10e4 N/m.

K.Minimum  = 1e4;       % N/m
K.Maximum  = 10e4;      % N/m

Задайте конструктивные требования

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

Регистрируйте следующие сигналы:

  • Цилиндрические давления, доступные в первом выходном порту блока Cylinder Assembly

Pressures = Simulink.SimulationData.SignalLoggingInfo;
Pressures.BlockPath       = 'sdoHydraulicCylinder/Cylinder Assembly';
Pressures.OutputPortIndex = 1;
  • Поршневое положение, доступное во втором выходном порту блока Cylinder Assembly

PistonPosition = Simulink.SimulationData.SignalLoggingInfo;
PistonPosition.BlockPath       = 'sdoHydraulicCylinder/Cylinder Assembly';
PistonPosition.OutputPortIndex = 2;

Создайте объект хранить информацию журналирования и использовать позже, чтобы моделировать модель

simulator = sdo.SimulationTest('sdoHydraulicCylinder');
simulator.LoggingInfo.Signals = [PistonPosition,Pressures];

Задайте поршневое требование переходного процесса положения времени нарастания меньше чем 0,04 секунд и времени установления меньше, чем 0,05 секунд.

PistonResponse = sdo.requirements.StepResponseEnvelope;
set(PistonResponse, ...
    'RiseTime',        0.04, ...
    'FinalValue',      0.04, ...
    'SettlingTime',    0.05, ...
    'PercentSettling', 1);

Задайте максимальное цилиндрическое требование к давлению меньше, чем 1.75e6 N/m.

MaxPressure = sdo.requirements.SignalBound;
set(MaxPressure, ...
    'BoundTimes',      [0 0.1], ...
    'BoundMagnitudes', [1.75e6 1.75e6], ...
    'Type',            '<=');

Для удобства соберите требования к производительности в одну структуру, чтобы использовать позже.

requirements = struct(...
    'PistonResponse', PistonResponse, ...
    'MaxPressure',    MaxPressure);

Создайте Функцию Цели/Ограничения

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

Здесь, используйте анонимную функцию с одним аргументом, который вызывает функцию sdoHydraulicCylinder_design.

evalDesign = @(p) sdoHydraulicCylinder_design(p,simulator,requirements);

Функция:

  • Имеет один входной параметр, который задает цилиндрическую площадь поперечного сечения и поршневые значения коэффициента упругости.

  • Возвращает значение цели оптимизации и ограничительные значения нарушения оптимизации.

Решатель оптимизации минимизирует объективное значение и пытается сохранить ограничительные значения нарушения оптимизации отрицательными. Введите help sdoExampleCostFunction для получения дополнительной информации о том, как записать функцию цели/ограничения.

Функция sdoHydraulicCylinder_design использует simulator, и requirements возражает, чтобы оценить проект. Введите edit sdoHydraulicCylinder_design, чтобы исследовать функцию более подробно.

type sdoHydraulicCylinder_design
function design = sdoHydraulicCylinder_design(p,simulator,requirements)
%SDOHYDRAULICCYLINDER_DESIGN
%
% The sdoHydraulicCylinder_design function is used to evaluate a cylinder
% design.
%
% The |p| input argument is the vector of cylinder design parameters.
%
% The |simulator| input argument is a sdo.SimulinkTest object used to
% simulate the |sdoHydraulicCylinder| model and log simulation signals
%
% The |requirements| input argument contains the design requirements used
% to evaluate the cylinder design
%
% The |design| return argument contains information about the design
% evaluation that can be used by the |sdo.optimize| function to optimize
% the design.
%
% see also sdo.optimize, sdoExampleCostFunction

% Copyright 2011 The MathWorks, Inc.

%% Simulate the model
%
% Use the simulator input argument to simulate the model and log model
% signals.
% 
% First ensure that we simulate the model with the parameter values chosen
% by the optimizer.
%
simulator.Parameters = p;
% Simulate the model and log signals.
%
simulator = sim(simulator);
% Get the simulation signal log, the simulation log name is defined by the
% model |SignalLoggingName| property
%
logName = get_param('sdoHydraulicCylinder','SignalLoggingName');
simLog = get(simulator.LoggedData,logName);

%% Evaluate the design requirements
%
% Use the requirements input argument to evaluate the design requirements
%
% Check the PistonPosition signal against the stepresponse requirement
%
PistonPosition = get(simLog,'PistonPosition');
cPiston = evalRequirement(requirements.PistonResponse,PistonPosition.Values);
% Check the Pressure signals against the maximum requirement
%
Pressures = find(simLog,'Pressures');
cPressure = evalRequirement(requirements.MaxPressure,Pressures.Values);
% Use the PistonResponse and MaxPressure requirements as non-linear
% constraints for optimization.
design.Cleq = [cPiston(:);cPressure(:)];
% Add design objective to minimize the Cylinder cross-sectional area
Ac = p(1);          %Since we called sdo.optimize(evalDesign,[Ac;K])
design.F = Ac.Value;
end

Оцените первоначальный проект

Вызовите целевую функцию с начальной цилиндрической площадью поперечного сечения и начальным поршневым коэффициентом упругости.

initDesign = evalDesign([Ac;K]);

Функция моделирует модель и оценивает конструктивные требования. Осциллограф показывает, что максимальное требование к давлению удовлетворено, но поршневое требование переходного процесса положения не удовлетворено.

initDesign является структурой со следующими полями:

  • Cleq показывает, что некоторые ограничения неравенства являются положительным указанием, что они не удовлетворены первоначальным проектом.

initDesign.Cleq
ans =

   -0.3839
   -0.1861
   -0.1836
   -1.0000
    0.3033
    0.2909
    0.1671
    0.2326
   -0.0480
   -0.0480

  • F показывает значение цели оптимизации (в этом случае цилиндрическая площадь поперечного сечения). Начальная площадь поперечного сечения проекта, как ожидалось, имеет то же значение как начальный параметр площади поперечного сечения Ac.

initDesign.F
ans =

   1.0000e-03

Оптимизируйте проект

Передайте целевую функцию, начальную площадь поперечного сечения и поршневые значения коэффициента упругости к sdo.optimize.

[pOpt,optInfo] = sdo.optimize(evalDesign,[Ac;K]);
 Optimization started 11-Jan-2019 03:36:37

                               max                     First-order 
 Iter F-count        f(x)   constraint    Step-size    optimality
    0      5        0.001       0.3033
    1     11   0.00057281      0.07293         0.48         85.4
    2     17  0.000391755            0        0.128           28
    3     22  0.000380144            0      0.00821      0.00424
    4     27  0.000375859            0      0.00313      0.00134
    5     32  0.000373865            0      0.00145     0.000306
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.

Оптимизация неоднократно оценивает цилиндрический проект путем корректировки площади поперечного сечения и поршневого коэффициента упругости, чтобы соответствовать конструктивным требованиям. От осциллографа смотрите, что максимальному давлению и поршневым требованиям ответа встречают.

Функция sdo.optimize возвращается:

  • pOpt показывает оптимизированную площадь поперечного сечения и поршневые значения коэффициента упругости.

pOpt
 
pOpt(1,1) =
 
       Name: 'Ac'
      Value: 3.7386e-04
    Minimum: 3.1416e-04
    Maximum: 0.0013
       Free: 1
      Scale: 0.0020
       Info: [1x1 struct]

 
pOpt(2,1) =
 
       Name: 'K'
      Value: 1.5652e+04
    Minimum: 10000
    Maximum: 100000
       Free: 1
      Scale: 65536
       Info: [1x1 struct]

 
2x1 param.Continuous
 
  • optInfo является структурой, которая содержит информацию о завершении оптимизации, такую как количество итераций оптимизации и оптимизированного проекта.

optInfo
optInfo = 

  struct with fields:

            Cleq: [10x1 double]
               F: 3.7386e-04
       Gradients: [1x1 struct]
        exitflag: 1
      iterations: 5
    SolverOutput: [1x1 struct]
           Stats: [1x1 struct]

Например, поле Cleq показывает, что оптимизированные нелинейные ограничения неравенства все неположительны в допусках оптимизации, указывая, что максимальное давление и поршневые требования ответа удовлетворены.

optInfo.Cleq
ans =

   -0.0982
   -0.0146
   -0.0146
   -1.0000
   -0.2074
   -0.0034
   -0.0053
   -0.0003
   -0.0476
   -0.0476

Поле F содержит оптимизированную площадь поперечного сечения. Оптимизированное значение площади поперечного сечения почти на 50% меньше что начальное значение.

optInfo.F
ans =

   3.7386e-04

Обновите образцовые значения переменных

По умолчанию образцовые переменные Ac и K не обновляются в конце оптимизации. Используйте команду setValueInModel, чтобы обновить образцовые значения переменных.

sdo.setValueInModel('sdoHydraulicCylinder',pOpt)

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

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

% Close the model
bdclose('sdoHydraulicCylinder')