В этом примере показано, как использовать суррогатную оптимизацию в 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