В этом примере показано, как использовать суррогатную оптимизацию в Simulink Design Optimization™, чтобы оптимизировать проект гидравлического цилиндра.
Этот пример требует программного обеспечения Parallel Computing Toolbox™.
Решение задач оптимизации включает использующие различные значения переменных проекта и выполнения целевой функции многократно, особенно если целевая функция достаточно несглаженна таким образом, что основанный на производной решатель не подходит. В таких случаях вы можете должны быть использовать решатель без производных, такой как patternsearch
, но эти решатели имеют тенденцию требовать выполнения целевой функции намного больше раз. Используя такой решатель может быть трудоемким, если целевая функция является в вычислительном отношении дорогой, чтобы оценить. Одним способом преодолеть эту проблему является суррогатная оптимизация. Этот подход создает суррогат дорогой целевой функции. Суррогат может быть оценен быстро и дает результаты, очень похожие на исходную целевую функцию. Суррогатная оптимизация также пробует много начальных точек, который помогает найти глобальный оптимум, вместо того, чтобы сходиться на решении, которое, в то время как локально оптимальный, не может быть глобальным оптимумом.
В этом примере показано, как использовать суррогатную оптимизацию, чтобы оптимизировать ответ гидравлического цилиндра. Откройте модель.
open_system('sdoHydraulicCylinder')
Модель гидроцилиндра основана на модели Simulink sldemo_hydcyl
. Модель включает:
Pump
и Cylinder Assembly
подсистемы. Для получения дополнительной информации о подсистемах смотрите Симуляцию одиночного гидравлического цилиндра.
Ступенчатое изменение применилось к цилиндрической площади постоянного отверстия распределительного клапана, которая заставляет положение поршня гидроцилиндра изменяться.
Теперь задайте переменные проекта, чтобы настроиться: цилиндрическая площадь поперечного сечения Ac
и поршневой коэффициент упругости K
.
DesignVars = sdo.getParameterFromModel('sdoHydraulicCylinder',{'Ac','K'}); DesignVars(1).Value = 1e-3; DesignVars(1).Minimum = 0.0003; DesignVars(1).Maximum = 0.0013; DesignVars(1).Scale = 0.001; DesignVars(2).Value = 50000; DesignVars(2).Minimum = 10000; DesignVars(2).Maximum = 100000; DesignVars(2).Scale = 1;
Затем задайте конструктивные требования, чтобы удовлетворить следующим условиям во время оптимизации:
Давление остается менее чем 1 750 000 Н/м.
Переходной процесс положения поршня удовлетворяет времени нарастания 0,04 секунд и времени урегулирования 0,05 секунд.
Requirements = struct; Requirements.MaxPressure = sdo.requirements.SignalBound(... 'BoundMagnitudes', [1750000 1750000], ... 'BoundTimes', [0 0.1]); Requirements.PistonResponse = sdo.requirements.StepResponseEnvelope(... 'FinalValue', 0.04, ... 'PercentSettling', 1, ... 'RiseTime', 0.04, ... 'SettlingTime', 0.05);
Затем задайте сигналы модели регистрировать во время симуляции модели. Эти сигналы необходимы, чтобы оценить конструктивные требования, то есть, определить, удовлетворяют ли им.
Simulator = sdo.SimulationTest('sdoHydraulicCylinder'); PistonPosition_Info = Simulink.SimulationData.SignalLoggingInfo; PistonPosition_Info.BlockPath = 'sdoHydraulicCylinder/Cylinder Assembly'; PistonPosition_Info.OutputPortIndex = 2; PistonPosition_Info.LoggingInfo.LoggingName = 'PistonPosition'; PistonPosition_Info.LoggingInfo.NameMode = 1; Pressures_Info = Simulink.SimulationData.SignalLoggingInfo; Pressures_Info.BlockPath = 'sdoHydraulicCylinder/Cylinder Assembly'; Pressures_Info.LoggingInfo.LoggingName = 'Pressures'; Pressures_Info.LoggingInfo.NameMode = 1; Simulator.LoggingInfo.Signals = [... PistonPosition_Info; ... Pressures_Info];
Создайте функцию, которая вызвана в каждой итерации оптимизации, чтобы оценить конструктивные требования. Используйте анонимную функцию с одним аргументом, который вызывает sdoHydraulicCylinder_optFcn
.
optimfcn = @(P) sdoHydraulicCylinder_optFcn(P,Simulator,Requirements);
sdoHydraulicCylinder_optFcn
функционируйте использует средство моделирования, и требования возражает, чтобы оценить проект. Введите edit sdoHydraulicCylinder_optFcn
исследовать функцию более подробно.
Теперь попытайтесь решить эту задачу оптимизации с помощью основанного на производной решателя. Задайте опции оптимизации.
Options = sdo.OptimizeOptions;
Options.Method = 'fmincon';
Options.UseParallel = true;
Options.OptimizedModel = Simulator;
Запустите оптимизацию путем вызова sdo.optimize
с указателем целевой функции, параметры, чтобы оптимизировать, и опции.
[Optimized_DesignVars,Info] = sdo.optimize(optimfcn,DesignVars,Options);
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6). Configuring parallel workers for optimization... Analyzing and transferring files to the workers ...done. Parallel workers configured for optimization. Optimization started 15-Jul-2021 11:36:33 max First-order Iter F-count f(x) constraint Step-size optimality 0 5 0.001 0.3033 1 10 0.00123343 0.3726 0.233 100 2 20 0.00117522 0.3545 0.0582 100 3 28 0.00121802 0.3678 0.0428 100 4 39 0.00117879 0.3556 0.0392 100 5 48 0.00120789 0.3646 0.0291 100 6 60 0.00119077 0.3593 0.0171 100 7 72 0.00119977 0.3621 0.00901 100 8 80 0.00119977 0.3621 0.00089 100 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. Removing data from parallel workers... Data removed from parallel workers.
В конце итераций оптимизации, "max constraint
"столбец все еще положителен, указывая, что основанный на производной решатель не удовлетворяет всем требованиям.
Поскольку основанный на производной решатель не удовлетворяет всем требованиям, попробуйте surrogateopt
как решатель без производных. Задайте опции оптимизации.
Options = sdo.OptimizeOptions;
Options.Method = 'surrogateopt';
Options.MethodOptions.MaxFunctionEvaluations = 100;
Options.UseParallel = true;
Options.OptimizedModel = Simulator;
Запустите оптимизацию путем вызова sdo.optimize
с указателем целевой функции, параметры, чтобы оптимизировать, и опции.
[Optimized_DesignVars,Info] = sdo.optimize(optimfcn,DesignVars,Options);
Configuring parallel workers for optimization... Analyzing and transferring files to the workers ...done. Parallel workers configured for optimization. Optimization started 15-Jul-2021 11:37:23 Current Current F-count f(x) max constraint f(x) max constraint Trial type 1 0.001 0.303264 0.001 0.303264 initial 2 0.001 0.303264 0.0003 0.41283 random 3 0.001 0.303264 0.0008 0.982707 random 4 0.001 0.303264 0.00055 0.573642 random 5 0.001 0.303264 0.00105 1.25679 random 6 0.001 0.303264 NaN Inf random 7 0.001 0.303264 0.001175 2.14476 random 8 0.001 0.303264 NaN Inf random 9 0.000925 0.252177 0.000925 0.252177 random 10 0.000925 0.252177 NaN Inf random 11 0.000925 0.252177 0.0011125 0.333109 random 12 0.000925 0.252177 NaN Inf random 13 0.000925 0.252177 0.0008625 0.724191 random 14 0.000925 0.252177 NaN Inf random 15 0.000925 0.252177 0.0009875 1.46276 random 16 0.000925 0.252177 0.0007375 4.26818 random 17 0.000925 0.252177 0.0012375 0.399354 random 18 0.000925 0.252177 0.00076875 0.985955 random 19 0.000925 0.252177 0.00126875 1.39122 random 20 0.000925 0.252177 0.00051875 0.477584 random 21 0.000925 0.252177 0.00101875 1.23392 random 22 0.000925 0.252177 NaN Inf random 23 0.00089375 0.226608 0.00089375 0.226608 random 24 0.00089375 0.226608 NaN Inf random 25 0.00089375 0.226608 0.00114375 3.56038 random 26 0.00089375 0.226608 NaN Inf random 27 0.00089375 0.226608 0.00095625 8.44124 random 28 0.00089375 0.226608 NaN Inf random 29 0.00089375 0.226608 0.00120625 0.325598 random 30 0.00058125 0.0293624 0.00058125 0.0293624 random 31 0.00058125 0.0293624 NaN Inf adaptive 32 0.00058125 0.0293624 NaN Inf adaptive 33 0.00058125 0.0293624 NaN Inf adaptive 34 0.00058125 0.0293624 NaN Inf adaptive 35 0.00058125 0.0293624 NaN Inf adaptive 36 0.00058125 0.0293624 NaN Inf adaptive 37 0.00058125 0.0293624 0.000373093 0.20491 adaptive 38 0.00058125 0.0293624 NaN Inf adaptive 39 0.00058125 0.0293624 NaN Inf adaptive 40 0.00058125 0.0293624 NaN Inf adaptive 41 0.00058125 0.0293624 NaN Inf adaptive 42 0.00058125 0.0293624 0.000405619 0.394347 adaptive 43 0.00058125 0.0293624 NaN Inf adaptive 44 0.00058125 0.0293624 0.000439948 0.442546 adaptive 45 0.00058125 0.0293624 0.000654805 0.13009 adaptive 46 0.00058125 0.0293624 0.000545924 0.0716494 adaptive 47 0.00058125 0.0293624 0.000507695 0.209479 adaptive 48 0.00058125 0.0293624 0.000615123 0.368681 adaptive 49 0.00058125 0.0293624 0.000648997 1.79744 adaptive 50 0.00058125 0.0290879 0.00058125 0.0290879 adaptive Current Current F-count f(x) max constraint f(x) max constraint Trial type 51 0.00058125 0.0290879 0.000581445 0.0291836 adaptive 52 0.00058125 0.0290879 0.000581152 0.0291773 adaptive 53 0.00058125 0.0290879 0.00058125 0.0292252 adaptive 54 0.00058125 0.0290879 0.000581348 0.029273 adaptive 55 0.00058125 0.0290879 0.00108125 0.821321 random 56 0.00058125 0.0290879 NaN Inf random 57 0.00058125 0.0290879 0.00083125 2.51611 random 58 0.00058125 0.0290879 NaN Inf random 59 0.00058125 0.0290879 0.00106562 0.768714 random 60 0.00058125 0.0290879 NaN Inf random 61 0.00058125 0.0290879 0.000815625 0.725618 random 62 0.00058125 0.0290879 0.000440625 0.067243 random 63 0.00058125 0.0290879 0.000940625 0.901158 random 64 0.00058125 0.0290879 0.000690625 0.475563 random 65 0.00058125 0.0290879 0.00119062 1.14814 random 66 0.00058125 0.0290879 NaN Inf random 67 0.00058125 0.0290879 0.000878125 1.83347 random 68 0.00058125 0.0290879 0.000628125 7.48485 random 69 0.00058125 0.0290879 0.00112812 0.359996 random 70 0.00058125 0.0290879 NaN Inf random 71 0.00058125 0.0290879 0.00125312 0.367383 random 72 0.00058125 0.0290879 NaN Inf random 73 0.00058125 0.0290879 0.00100312 2.73758 random 74 0.00058125 0.0290879 NaN Inf random 75 0.000398826 0.01138 0.000398826 0.01138 adaptive 76 0.000398826 0.01138 0.000398501 0.0121406 adaptive 77 0.000398826 0.01138 0.000342896 0.0664043 adaptive 78 0.000398826 0.01138 0.000419212 0.0337089 adaptive 79 0.000398826 0.01138 NaN Inf adaptive 80 0.000398826 0.01138 NaN Inf adaptive 81 0.000398826 0.01138 NaN Inf adaptive 82 0.000398826 0.01138 NaN Inf adaptive 83 0.000398826 0.01138 NaN Inf adaptive 84 0.000398826 0.01138 NaN Inf adaptive 85 0.000398826 0.01138 0.000379602 0.0552041 adaptive 86 0.000398826 0.01138 NaN Inf adaptive 87 0.000398826 0.01138 0.000381455 0.0919141 adaptive 88 0.000398984 0.00300044 0.000398984 0.00300044 adaptive 89 0.000405043 0.000165085 0.000405043 0.000165085 adaptive 90 0.000400538 0.000170854 0.000400538 0.000170854 adaptive 91 0.000400538 0.000170854 0.000399682 0.00578883 adaptive 92 0.000400538 0.000170854 0.000401935 0.00574052 adaptive 93 0.000400538 0.000170854 0.000398905 0.00720515 adaptive 94 0.000397413 -0.00044187 0.000397413 -0.00044187 adaptive 95 0.000397413 -0.00044187 0.000398976 -0.000446158 adaptive 96 0.000397413 -0.00044187 0.000400538 0.000265697 adaptive The current solution is feasible. surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MethodOptions.MaxFunctionEvaluations'. Increasing the function evaluation limit may result in an improved solution. Removing data from parallel workers... Data removed from parallel workers.
Используя surrogateopt, всем конструктивным требованиям удовлетворяют, как обозначено отрицательной величиной в "max constraint
"столбец.
Обновите модель с оптимизированными значениями параметров.
sdo.setValueInModel('sdoHydraulicCylinder',Optimized_DesignVars);
В этом примере, решатель с помощью суррогатов, успешных на задаче оптимизации, где основанный на производной решатель неудачен. surrogateopt
решатель является глобальным решателем, который пробует много начальных точек. При помощи суррогата модели, surrogateopt
потребности запустить модель только умеренное число раз.
sdo.OptimizeOptions
| sdo.optimize