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

|

Related Topics