Main Content

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 and Cylinder 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 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.

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 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.

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

|

Related Topics