Surrogate Optimization in Simulink Design Optimization
This example shows how to use surrogate optimization in Simulink Design Optimization™ to optimize the design of a hydraulic cylinder.
This example requires Parallel Computing Toolbox™ software.
Surrogate Optimization
Solving optimization problems involves using different values of the design variables and evaluating the objective function multiple times, especially if the objective function is sufficiently nonsmooth such that a derivative-based solver is not suitable. In such cases, you might need to use a derivative-free solver such as patternsearch
, but these solvers tend to require running the objective function many more times. Using such a solver can be time consuming if the objective function is computationally expensive to evaluate. One way to overcome this problem is surrogate optimization. This approach creates a surrogate of the expensive objective function. The surrogate can be evaluated quickly and gives results very similar to the original objective function. Surrogate optimization also tries many starting points, which helps find a global optimum, rather than converging on a solution that, while locally optimal, might not be the global optimum.
Hydraulic Cylinder Model
This example shows how to use surrogate optimization to optimize the response of a hydraulic cylinder. Open the model.
open_system('sdoHydraulicCylinder')
The hydraulic cylinder model is based on the Simulink model sldemo_hydcyl
. The model includes:
Pump
andCylinder Assembly
subsystems. For more information on the subsystems, see Single Hydraulic Cylinder Simulation.A step change applied to the cylinder control valve orifice area that causes the cylinder piston position to change.
Specify Design Variables
Now, specify the design variables to tune: the cylinder cross-sectional area Ac
and the piston spring constant 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;
Specify Design Requirements
Next, specify design requirements to satisfy the following conditions during optimization:
The pressure stays under 1,750,000 N/m.
The piston position step response satisfies a rise time of 0.04 seconds and a settling time of 0.05 seconds.
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);
Signal Logging
Next, specify model signals to log during model simulation. These signals are needed to evaluate the design requirements, that is, to determine whether they are satisfied.
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];
Create Optimization Objective Function
Create a function that is called at each optimization iteration to evaluate the design requirements. Use an anonymous function with one argument that calls sdoHydraulicCylinder_optFcn
.
optimfcn = @(P) sdoHydraulicCylinder_optFcn(P,Simulator,Requirements);
The sdoHydraulicCylinder_optFcn
function uses the simulator and requirements objects to evaluate the design. Type edit sdoHydraulicCylinder_optFcn
to examine the function in more detail.
Optimization Using Derivative-Based Solver
Now, try solving this optimization problem using a derivative-based solver. Specify optimization options.
Options = sdo.OptimizeOptions;
Options.Method = 'fmincon';
Options.UseParallel = true;
Options.OptimizedModel = Simulator;
Run the optimization by calling sdo.optimize
with the objective function handle, parameters to optimize, and options.
[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 05-Aug-2021 09:50:51 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.
At the end of optimization iterations, the "max constraint
" column is still positive, indicating that the derivative-based solver does not satisfy all of the requirements.
Optimization Options Using Surrogate Solver
Since the derivative-based solver does not satisfy all the requirements, try surrogateopt
as a derivative-free solver. Specify optimization options.
Options = sdo.OptimizeOptions;
Options.Method = 'surrogateopt';
Options.MethodOptions.MaxFunctionEvaluations = 100;
Options.UseParallel = true;
Options.OptimizedModel = Simulator;
Run the optimization by calling sdo.optimize
with the objective function handle, parameters to optimize, and options.
[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 05-Aug-2021 09:51:51 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 0.000353121 0.114521 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 0.000387527 0.275913 adaptive 36 0.00058125 0.0293624 NaN Inf adaptive 37 0.00058125 0.0293624 NaN Inf adaptive 38 0.00058125 0.0293624 NaN Inf adaptive 39 0.00058125 0.0293624 NaN Inf adaptive 40 0.00058125 0.0293624 0.0003626 0.130551 adaptive 41 0.00058125 0.0293624 NaN Inf adaptive 42 0.00058125 0.0293624 0.000373093 0.20491 adaptive 43 0.00058125 0.0293624 NaN Inf adaptive 44 0.00058125 0.0293624 0.00043983 0.376346 adaptive 45 0.00058125 0.0293624 0.000510805 0.276542 adaptive 46 0.00058125 0.0293624 0.000616738 0.353985 adaptive 47 0.00058125 0.0293624 0.000652226 1.69733 adaptive 48 0.00058125 0.0293624 0.000510274 0.602427 adaptive 49 0.00058125 0.0293624 0.000651695 0.138744 adaptive 50 0.000581641 0.0290052 0.000581641 0.0290052 adaptive Current Current F-count f(x) max constraint f(x) max constraint Trial type 51 0.000581641 0.0290052 0.00058125 0.0290879 adaptive 52 0.000581641 0.0290052 0.000581445 0.0291836 adaptive 53 0.000581641 0.0290052 0.000581152 0.0291773 adaptive 54 0.000581641 0.0290052 0.00058125 0.0292252 adaptive 55 0.000581641 0.0290052 0.00108125 0.821321 random 56 0.000581641 0.0290052 NaN Inf random 57 0.000581641 0.0290052 0.00083125 2.51611 random 58 0.000581641 0.0290052 NaN Inf random 59 0.000581641 0.0290052 0.00106562 0.768714 random 60 0.000581641 0.0290052 NaN Inf random 61 0.000581641 0.0290052 0.000815625 0.725618 random 62 0.000581641 0.0290052 0.000440625 0.067243 random 63 0.000581641 0.0290052 0.000940625 0.901158 random 64 0.000581641 0.0290052 0.000690625 0.475563 random 65 0.000581641 0.0290052 0.00119062 1.14814 random 66 0.000581641 0.0290052 NaN Inf random 67 0.000581641 0.0290052 0.000878125 1.83347 random 68 0.000581641 0.0290052 0.000628125 7.48485 random 69 0.000581641 0.0290052 0.00112812 0.359996 random 70 0.000581641 0.0290052 NaN Inf random 71 0.000581641 0.0290052 0.00125312 0.367383 random 72 0.000581641 0.0290052 NaN Inf random 73 0.000581641 0.0290052 0.00100312 2.73758 random 74 0.000581641 0.0290052 NaN Inf random 75 0.000581641 0.0290052 NaN Inf adaptive 76 0.000581641 0.0290052 NaN Inf adaptive 77 0.000581641 0.0290052 NaN Inf adaptive 78 0.000581641 0.0290052 0.000365623 0.0538825 adaptive 79 0.000581641 0.0290052 NaN Inf adaptive 80 0.000581641 0.0290052 NaN Inf adaptive 81 0.000581641 0.0290052 0.000392021 0.0600614 adaptive 82 0.000581641 0.0290052 NaN Inf adaptive 83 0.000581641 0.0290052 NaN Inf adaptive 84 0.000581641 0.0290052 NaN Inf adaptive 85 0.000581641 0.0290052 NaN Inf adaptive 86 0.000581641 0.0290052 NaN Inf adaptive 87 0.000581641 0.0290052 NaN Inf adaptive 88 0.00046017 0.00145339 0.00046017 0.00145339 adaptive 89 0.00046017 0.00145339 0.000373567 0.0128931 adaptive 90 0.00046017 0.00145339 0.000367658 0.0168988 adaptive 91 0.00046017 0.00145339 0.000369595 0.0335533 adaptive 92 0.00046017 0.00145339 0.00036664 0.035673 adaptive 93 0.00046017 0.00145339 0.000367609 0.0437603 adaptive 94 0.000457045 -7.33841e-05 0.000457045 -7.33841e-05 adaptive 95 0.000457045 -7.33841e-05 0.000458608 -0.000421362 adaptive 96 0.000457045 -7.33841e-05 0.000459389 -0.000458651 adaptive The current solution is feasible. surrogateopt stopped because it exceeded the function evaluation limit set by the 'MethodOptions.MaxFunctionEvaluations' property in the sdo.OptimizeOptions object. If the solution needs to be improved, you could try increasing the function evaluation limit. Removing data from parallel workers... Data removed from parallel workers.
Using surrogateopt, all the design requirements are satisfied, as indicated by a negative value in the "max constraint
" column.
Update the model with the optimized parameter values.
sdo.setValueInModel('sdoHydraulicCylinder',Optimized_DesignVars);
In this example, a solver using surrogates successful on an optimization problem where a derivative-based solver is unsuccessful. The surrogateopt
solver is a global solver that tries many starting points. By using a surrogate of the model, surrogateopt
needs to run the model only a moderate number of times.
See Also
sdo.OptimizeOptions
| sdo.optimize