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

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

Модель гидроцилиндра

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

sys = 'sdoHydraulicCylinder';
open_system(sys);

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

  • Изменение шага, приложенное к площади постоянного отверстия клапана, которое заставляет изменять положение поршня гидроцилиндра.

Проект Гидравлического Цилиндра

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

  • Убедитесь, что положение поршня имеет переходную характеристику время нарастания менее 0,04 секунд и время установки менее 0,05 секунд.

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

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

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

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

  • Площадь поперечного сечения 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 Н/м.

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 Н/м.

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

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

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

Создайте функцию Objective/Constraint

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

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

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

Функция:

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

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

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

The 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 27-Jan-2021 15:06:24

                               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.000387625            0      0.00291      0.00459
    4     27  0.000382932            0      0.00331      0.00187
    5     32  0.000378204            0      0.00331     0.000219
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.

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

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

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

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

 
pOpt(2,1) =
 
       Name: 'K'
      Value: 1.5809e+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.7820e-04
       Gradients: [1x1 struct]
        exitflag: 1
      iterations: 5
    SolverOutput: [1x1 struct]
           Stats: [1x1 struct]

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

optInfo.Cleq
ans =

   -0.0972
   -0.0131
   -0.0131
   -1.0000
   -0.2064
   -0.0047
   -0.0069
   -0.0004
   -0.0476
   -0.0476

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

optInfo.F
ans =

   3.7820e-04

Обновление значений переменных модели

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

sdo.setValueInModel('sdoHydraulicCylinder',pOpt)

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

Чтобы узнать, как оптимизировать конструкцию цилиндра с помощью Response Optimizer, смотрите Оптимизацию проекта, чтобы соответствовать пользовательской цели (GUI).

% Close the model
bdclose('sdoHydraulicCylinder')