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:
PumpandCylinder Assemblysubsystems. 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);
Configuring parallel workers for optimization...
Analyzing and transferring files to the workers ...done.
Analyzing and transferring files to the workers ...done.
Parallel workers configured for optimization.
Optimization started 2023-May-04, 13:37:43
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.
Analyzing and transferring files to the workers ...done.
Parallel workers configured for optimization.
Optimization started 2023-May-04, 13:38:35
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.411103 random
3 0.001 0.303264 0.0008 1.02568 random
4 0.001 0.303264 0.00055 0.578226 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.65452 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.487797 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 NaN Inf adaptive
38 0.00058125 0.0293624 0.000382646 0.259073 adaptive
39 0.00058125 0.0293624 0.000872844 0.18585 adaptive
40 0.00058125 0.0293624 NaN Inf adaptive
41 0.00058125 0.0293624 NaN Inf adaptive
42 0.00058125 0.0293624 NaN Inf adaptive
43 0.00058125 0.0293624 0.000346006 0.100726 adaptive
44 0.00058125 0.0293624 0.00043983 0.372926 adaptive
45 0.00058125 0.0293624 0.000510274 0.598923 adaptive
46 0.00058125 0.0293624 0.000510805 0.276542 adaptive
47 0.00058125 0.0293624 0.000616738 0.353985 adaptive
48 0.00058125 0.0293624 0.000651695 0.138744 adaptive
49 0.00058125 0.0293624 0.000652226 1.69733 adaptive
50 0.000582031 0.0286493 0.000582031 0.0286493 adaptive
Current Current
F-count f(x) max constraint f(x) max constraint Trial type
51 0.000582031 0.0286493 0.000581641 0.0290052 adaptive
52 0.000582031 0.0286493 0.000581445 0.0291836 adaptive
53 0.000582031 0.0286493 0.00058125 0.0292252 adaptive
54 0.000582031 0.0286493 0.000581348 0.029273 adaptive
55 0.000582031 0.0286493 0.00108125 0.821321 random
56 0.000582031 0.0286493 NaN Inf random
57 0.000582031 0.0286493 0.00083125 2.64838 random
58 0.000582031 0.0286493 NaN Inf random
59 0.000582031 0.0286493 0.00106562 0.768714 random
60 0.000582031 0.0286493 0.000315625 5.20466 random
61 0.000582031 0.0286493 0.000815625 0.725618 random
62 0.000582031 0.0286493 0.000440625 0.067243 random
63 0.000582031 0.0286493 0.000940625 0.901158 random
64 0.000582031 0.0286493 0.000690625 0.475563 random
65 0.000582031 0.0286493 0.00119062 1.14814 random
66 0.000582031 0.0286493 NaN Inf random
67 0.000582031 0.0286493 0.000878125 1.89266 random
68 0.000582031 0.0286493 0.000628125 7.48485 random
69 0.000582031 0.0286493 0.00112812 0.359996 random
70 0.000582031 0.0286493 NaN Inf random
71 0.000582031 0.0286493 0.00125312 0.367383 random
72 0.000582031 0.0286493 NaN Inf random
73 0.000582031 0.0286493 0.00100312 2.73758 random
74 0.000582031 0.0286493 NaN Inf random
75 0.000582031 0.0286493 0.00103437 0.258263 random
76 0.000582031 0.0286493 0.000784375 1.32496 random
77 0.000582031 0.0286493 0.00128437 3.05351 random
78 0.000582031 0.0286493 0.000659375 1.20157 random
79 0.000582031 0.0286493 0.00115937 1.52728 random
80 0.000582031 0.0286493 NaN Inf random
81 0.000582031 0.0286493 0.000909375 1.28986 random
82 0.000582031 0.0286493 0.000721875 0.11391 random
83 0.000582031 0.0286493 0.00122187 0.780649 random
84 0.000582031 0.0286493 NaN Inf random
85 0.000582031 0.0286493 0.0003 0.0907138 adaptive
86 0.000582031 0.0286493 NaN Inf adaptive
87 0.000582031 0.0286493 NaN Inf adaptive
88 0.000582031 0.0286493 NaN Inf adaptive
89 0.000357693 -0.000458298 0.000357693 -0.000458298 adaptive
90 0.000357693 -0.000458298 0.000445736 0.0595388 adaptive
91 0.000357693 -0.000458298 0.000472898 0.0296971 adaptive
92 0.000357693 -0.000458298 NaN Inf adaptive
93 0.000357693 -0.000458298 0.000467197 0.0100422 adaptive
94 0.000357693 -0.000458298 0.000349748 0.0373376 adaptive
95 0.000357693 -0.000458298 0.000355658 0.0328266 adaptive
96 0.000357693 -0.000458298 0.000332693 0.0625643 adaptive
97 0.000357693 -0.000458298 0.000357693 -0.000458298 best value
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