В этом примере показано, как оптимизировать конструкцию для достижения пользовательских целей с помощью sdo.optimize. Параметры цилиндра оптимизируются для минимизации геометрии цилиндра и удовлетворения требований к конструкции.
Откройте модель Simulink.
sys = 'sdoHydraulicCylinder';
open_system(sys);

Модель гидроцилиндра основана на модели Simulink sldemo_hydcyl. Модель включает в себя:
Pump и Cylinder Assembly подсистем. Дополнительные сведения о подсистемах см. в разделе Моделирование одного гидравлического цилиндра.
Ступенчатое изменение, применяемое к области отверстия регулирующего клапана цилиндра, которое вызывает изменение положения поршня цилиндра.
Площадь поперечного сечения цилиндра и постоянная поршневой пружины настраиваются в соответствии со следующими требованиями к конструкции:
Убедитесь, что время нарастания отклика поршня составляет менее 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);
Для оптимизации площади поперечного сечения цилиндра и постоянной пружины поршня создайте функцию для оценки конструкции цилиндра. Эта функция вызывается в каждой итерации оптимизации.
Здесь используйте анонимную функцию с одним аргументом, вызывающим 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 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.
Оптимизация многократно оценивает конструкцию цилиндра путем регулирования площади поперечного сечения и постоянной поршневой пружины в соответствии с требованиями конструкции. Из объема работ см., что соблюдены требования к максимальному давлению и ответной реакции поршня.
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
F поле содержит оптимизированную площадь поперечного сечения. Оптимизированное значение площади поперечного сечения почти на 50% меньше начального значения.
optInfo.F
ans = 3.7820e-04
По умолчанию переменные модели Ac и K не обновляются в конце оптимизации. Используйте setValueInModel для обновления значений переменных модели.
sdo.setValueInModel('sdoHydraulicCylinder',pOpt)
Сведения об оптимизации конструкции цилиндра с помощью оптимизатора отклика см. в разделе Оптимизация конструкции для соответствия пользовательской цели (GUI).
% Close the model bdclose('sdoHydraulicCylinder')