IDF-based MDO on the Sobieski SSBJ test case

from __future__ import division, unicode_literals

from matplotlib import pyplot as plt

from gemseo.api import configure_logger, create_discipline, create_scenario
from gemseo.problems.sobieski.core import SobieskiProblem

configure_logger()

Out:

<RootLogger root (INFO)>

Instantiate the disciplines

First, we instantiate the four disciplines of the use case: SobieskiPropulsion, SobieskiAerodynamics, SobieskiMission and SobieskiStructure.

disciplines = create_discipline(
    [
        "SobieskiPropulsion",
        "SobieskiAerodynamics",
        "SobieskiMission",
        "SobieskiStructure",
    ]
)

Build, execute and post-process the scenario

Then, we build the scenario which links the disciplines with the formulation and the optimization algorithm. Here, we use the IDF formulation. We tell the scenario to minimize -y_4 instead of minimizing y_4 (range), which is the default option.

Instantiate the scenario

design_space = SobieskiProblem().read_design_space()
scenario = create_scenario(
    disciplines,
    "IDF",
    objective_name="y_4",
    design_space=design_space,
    maximize_objective=True,
)

Set the design constraints

for c_name in ["g_1", "g_2", "g_3"]:
    scenario.add_constraint(c_name, "ineq")

Define the algorithm inputs

We set the maximum number of iterations, the optimizer and the optimizer options

algo_options = {
    "ftol_rel": 1e-10,
    "ineq_tolerance": 1e-3,
    "eq_tolerance": 1e-3,
    "normalize_design_space": True,
}
scn_inputs = {"max_iter": 20, "algo": "SLSQP", "algo_options": algo_options}

Execute the scenario

scenario.execute(scn_inputs)

Out:

    INFO - 09:24:44:
    INFO - 09:24:44: *** Start MDO Scenario execution ***
    INFO - 09:24:44: MDOScenario
    INFO - 09:24:44:    Disciplines: SobieskiPropulsion SobieskiAerodynamics SobieskiMission SobieskiStructure
    INFO - 09:24:44:    MDOFormulation: IDF
    INFO - 09:24:44:    Algorithm: SLSQP
    INFO - 09:24:44: Optimization problem:
    INFO - 09:24:44:    Minimize: -y_4(x_shared, y_14, y_24, y_34)
    INFO - 09:24:44:    With respect to: x_shared, x_1, x_2, x_3, y_14, y_32, y_31, y_24, y_34, y_23, y_21, y_12
    INFO - 09:24:44:    Subject to constraints:
    INFO - 09:24:44:       g_1(x_shared, x_1, y_31, y_21) <= 0.0
    INFO - 09:24:44:       g_2(x_shared, x_2, y_32, y_12) <= 0.0
    INFO - 09:24:44:       g_3(x_shared, x_3, y_23) <= 0.0
    INFO - 09:24:44:       y_31_y_32_y_34(x_shared, x_3, y_23): y_31(x_shared, x_3, y_23) - y_31 == 0.0
    INFO - 09:24:44:                                            y_32(x_shared, x_3, y_23) - y_32 == 0.0
    INFO - 09:24:44:                                            y_34(x_shared, x_3, y_23) - y_34 == 0.0
    INFO - 09:24:44:       y_21_y_23_y_24(x_shared, x_2, y_32, y_12): y_21(x_shared, x_2, y_32, y_12) - y_21 == 0.0
    INFO - 09:24:44:                                                  y_23(x_shared, x_2, y_32, y_12) - y_23 == 0.0
    INFO - 09:24:44:                                                  y_24(x_shared, x_2, y_32, y_12) - y_24 == 0.0
    INFO - 09:24:44:       y_12_y_14(x_shared, x_1, y_31, y_21): y_12(x_shared, x_1, y_31, y_21) - y_12 == 0.0
    INFO - 09:24:44:                                             y_14(x_shared, x_1, y_31, y_21) - y_14 == 0.0
    INFO - 09:24:44: Design Space:
    INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
    INFO - 09:24:44: | name     | lower_bound |       value        | upper_bound | type  |
    INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
    INFO - 09:24:44: | x_shared |     0.01    |        0.05        |     0.09    | float |
    INFO - 09:24:44: | x_shared |    30000    |       45000        |    60000    | float |
    INFO - 09:24:44: | x_shared |     1.4     |        1.6         |     1.8     | float |
    INFO - 09:24:44: | x_shared |     2.5     |        5.5         |     8.5     | float |
    INFO - 09:24:44: | x_shared |      40     |         55         |      70     | float |
    INFO - 09:24:44: | x_shared |     500     |        1000        |     1500    | float |
    INFO - 09:24:44: | x_1      |     0.1     |        0.25        |     0.4     | float |
    INFO - 09:24:44: | x_1      |     0.75    |         1          |     1.25    | float |
    INFO - 09:24:44: | x_2      |     0.75    |         1          |     1.25    | float |
    INFO - 09:24:44: | x_3      |     0.1     |        0.5         |      1      | float |
    INFO - 09:24:44: | y_14     |    24850    |   50606.9741711    |    77100    | float |
    INFO - 09:24:44: | y_14     |    -7700    |   7306.20262124    |    45000    | float |
    INFO - 09:24:44: | y_32     |    0.235    | 0.5027962499999999 |    0.795    | float |
    INFO - 09:24:44: | y_31     |     2960    |   6354.32430691    |    10185    | float |
    INFO - 09:24:44: | y_24     |     0.44    |     4.15006276     |    11.13    | float |
    INFO - 09:24:44: | y_34     |     0.44    |     1.10754577     |     1.98    | float |
    INFO - 09:24:44: | y_23     |     3365    |   12194.2671934    |    26400    | float |
    INFO - 09:24:44: | y_21     |    24850    |   50606.9741711    |    77250    | float |
    INFO - 09:24:44: | y_12     |    24850    |     50606.9742     |    77250    | float |
    INFO - 09:24:44: | y_12     |     0.45    |        0.95        |     1.5     | float |
    INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
    INFO - 09:24:44: Optimization:   0%|          | 0/20 [00:00<?, ?it]
    INFO - 09:24:44: Optimization:  30%|███       | 6/20 [00:00<00:00, 168.27 it/sec, obj=3.96e+3]
    INFO - 09:24:44: Optimization:  30%|███       | 6/20 [00:00<00:00, 141.88 it/sec, obj=3.96e+3]
    INFO - 09:24:44: Optimization result:
    INFO - 09:24:44: Objective value = 3962.9526217985263
    INFO - 09:24:44: The result is feasible.
    INFO - 09:24:44: Status: 8
    INFO - 09:24:44: Optimizer message: Positive directional derivative for linesearch
    INFO - 09:24:44: Number of calls to the objective function by the optimizer: 7
    INFO - 09:24:44: Constraints values w.r.t. 0:
    INFO - 09:24:44:    g_1 = [-0.01805183 -0.03333975 -0.04424427 -0.05183035 -0.05732248 -0.13720303
    INFO - 09:24:44:  -0.10279697]
    INFO - 09:24:44:    g_2 = -2.166209250198392e-06
    INFO - 09:24:44:    g_3 = [-7.67165451e-01 -2.32834549e-01 -1.78465879e-05 -1.83253517e-01]
    INFO - 09:24:44:    y_12_y_14 = [3.31196595e-08 1.29015182e-08 3.32147398e-08 2.33971913e-08]
    INFO - 09:24:44:    y_21_y_23_y_24 = [0.00000000e+00 9.50788249e-08 2.44492523e-07]
    INFO - 09:24:44:    y_31_y_32_y_34 = [-1.00976229e-07 -1.26724891e-07 -9.53784673e-08]
    INFO - 09:24:44: Design Space:
    INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:44: | name     | lower_bound |        value        | upper_bound | type  |
    INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:44: | x_shared |     0.01    | 0.05999945844768744 |     0.09    | float |
    INFO - 09:24:44: | x_shared |    30000    |  59999.36188472858  |    60000    | float |
    INFO - 09:24:44: | x_shared |     1.4     |  1.400011395953098  |     1.8     | float |
    INFO - 09:24:44: | x_shared |     2.5     |  2.500062481153684  |     8.5     | float |
    INFO - 09:24:44: | x_shared |      40     |  69.99949948899524  |      70     | float |
    INFO - 09:24:44: | x_shared |     500     |  1499.986640198356  |     1500    | float |
    INFO - 09:24:44: | x_1      |     0.1     |  0.3999633933729535 |     0.4     | float |
    INFO - 09:24:44: | x_1      |     0.75    |  0.7500061364948122 |     1.25    | float |
    INFO - 09:24:44: | x_2      |     0.75    |  0.7500056408385082 |     1.25    | float |
    INFO - 09:24:44: | x_3      |     0.1     |  0.1562473006335393 |      1      | float |
    INFO - 09:24:44: | y_14     |    24850    |   44750.2308549515  |    77100    | float |
    INFO - 09:24:44: | y_14     |    -7700    |  19349.94590290229  |    45000    | float |
    INFO - 09:24:44: | y_32     |    0.235    |  0.7328346197705424 |    0.795    | float |
    INFO - 09:24:44: | y_31     |     2960    |  9437.653099153551  |    10185    | float |
    INFO - 09:24:44: | y_24     |     0.44    |  8.057175760897779  |    11.13    | float |
    INFO - 09:24:44: | y_34     |     0.44    |  0.9239561506019203 |     1.98    | float |
    INFO - 09:24:44: | y_23     |     3365    |  5554.079992829635  |    26400    | float |
    INFO - 09:24:44: | y_21     |    24850    |   44750.2308549515  |    77250    | float |
    INFO - 09:24:44: | y_12     |    24850    |   44750.2308549515  |    77250    | float |
    INFO - 09:24:44: | y_12     |     0.45    |  0.9027969578958603 |     1.5     | float |
    INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:44: *** MDO Scenario run terminated in 0:00:00.165821 ***

{'max_iter': 20, 'algo': 'SLSQP', 'algo_options': {'ftol_rel': 1e-10, 'ineq_tolerance': 0.001, 'eq_tolerance': 0.001, 'normalize_design_space': True}}

Save the optimization history

We can save the whole optimization problem and its history for further post processing:

scenario.save_optimization_history("idf_history.h5", file_format="hdf5")

Out:

INFO - 09:24:44: Export optimization problem to file: idf_history.h5

We can also save only calls to functions and design variables history:

scenario.save_optimization_history("idf_history.xml", file_format="ggobi")

Out:

INFO - 09:24:44: Export to ggobi for functions: ['-y_4', 'Iter', 'g_1', 'g_2', 'g_3', 'y_12_y_14', 'y_21_y_23_y_24', 'y_31_y_32_y_34']
INFO - 09:24:44: Export to ggobi file: idf_history.xml

Plot the optimization history view

scenario.post_process("OptHistoryView", save=False, show=False)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Distance to the optimum
  • Hessian diagonal approximation
  • Evolution of the inequality constraints
  • Evolution of the equality constraints

Out:

<gemseo.post.opt_history_view.OptHistoryView object at 0x7f61b8bbd220>

Plot the quadratic approximation of the objective

scenario.post_process("QuadApprox", function="-y_4", save=False, show=False)
# Workaround for HTML rendering, instead of ``show=True``
plt.show()
  • Hessian matrix SR1 approximation of -y_4
  • plot sobieski idf example

Total running time of the script: ( 0 minutes 4.388 seconds)

Gallery generated by Sphinx-Gallery