.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/formulations/plot_sobieski_idf_example.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_formulations_plot_sobieski_idf_example.py: IDF-based MDO on the Sobieski SSBJ test case ============================================ .. GENERATED FROM PYTHON SOURCE LINES 24-36 .. code-block:: Python from __future__ import annotations from gemseo import configure_logger from gemseo import create_discipline from gemseo import create_scenario from gemseo import generate_n2_plot from gemseo.algos.opt.scipy_local.settings.slsqp import SLSQP_Settings from gemseo.problems.mdo.sobieski.core.design_space import SobieskiDesignSpace configure_logger() .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 37-44 Instantiate the disciplines ---------------------------- First, we instantiate the four disciplines of the use case: :class:`.SobieskiPropulsion`, :class:`.SobieskiAerodynamics`, :class:`.SobieskiMission` and :class:`.SobieskiStructure`. .. GENERATED FROM PYTHON SOURCE LINES 44-51 .. code-block:: Python disciplines = create_discipline([ "SobieskiPropulsion", "SobieskiAerodynamics", "SobieskiMission", "SobieskiStructure", ]) .. GENERATED FROM PYTHON SOURCE LINES 52-55 We can quickly access the most relevant information of any discipline (name, inputs, and outputs) with Python's ``print()`` function. Moreover, we can get the default input values of a discipline with the attribute :attr:`.Discipline.default_input_data` .. GENERATED FROM PYTHON SOURCE LINES 55-59 .. code-block:: Python for discipline in disciplines: print(discipline) print(f"Default inputs: {discipline.default_input_data}") .. rst-class:: sphx-glr-script-out .. code-block:: none SobieskiPropulsion Default inputs: {'y_23': array([12562.01206488]), 'x_3': array([0.5]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'c_3': array([4360.])} SobieskiAerodynamics Default inputs: {'x_2': array([1.]), 'y_32': array([0.50279625]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'y_12': array([5.06069742e+04, 9.50000000e-01]), 'c_4': array([0.01375])} SobieskiMission Default inputs: {'y_14': array([50606.9741711 , 7306.20262124]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'y_24': array([4.15006276]), 'y_34': array([1.10754577])} SobieskiStructure Default inputs: {'y_21': array([50606.9741711]), 'y_31': array([6354.32430691]), 'x_1': array([0.25, 1. ]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'c_0': array([2000.]), 'c_1': array([25000.]), 'c_2': array([6.])} .. GENERATED FROM PYTHON SOURCE LINES 60-64 You may also be interested in plotting the couplings of your disciplines. A quick way of getting this information is the API function :func:`.generate_n2_plot`. A much more detailed explanation of coupling visualization is available :ref:`here `. .. GENERATED FROM PYTHON SOURCE LINES 64-66 .. code-block:: Python generate_n2_plot(disciplines, save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_001.png :alt: plot sobieski idf example :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 67-76 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 :class:`.IDF` formulation. We tell the scenario to minimize -y_4 instead of minimizing y_4 (range), which is the default option. Instantiate the scenario ^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 76-79 .. code-block:: Python design_space = SobieskiDesignSpace() design_space .. raw:: html
Sobieski design space:
Name Lower bound Value Upper bound Type
x_shared[0] 0.01 0.05 0.09 float
x_shared[1] 30000 45000 60000 float
x_shared[2] 1.4 1.6 1.8 float
x_shared[3] 2.5 5.5 8.5 float
x_shared[4] 40 55 70 float
x_shared[5] 500 1000 1500 float
x_1[0] 0.1 0.25 0.4 float
x_1[1] 0.75 1 1.25 float
x_2 0.75 1 1.25 float
x_3 0.1 0.5 1 float
y_14[0] 24850 50606.9741711 77100 float
y_14[1] -7700 7306.20262124 45000 float
y_32 0.235 0.5027962499999999 0.795 float
y_31 2960 6354.32430691 10185 float
y_24 0.44 4.15006276 11.13 float
y_34 0.44 1.10754577 1.98 float
y_23 3365 12194.2671934 26400 float
y_21 24850 50606.9741711 77250 float
y_12[0] 24850 50606.9742 77250 float
y_12[1] 0.45 0.95 1.5 float


.. GENERATED FROM PYTHON SOURCE LINES 80-88 .. code-block:: Python scenario = create_scenario( disciplines, "y_4", design_space, maximize_objective=True, formulation_name="IDF", ) .. GENERATED FROM PYTHON SOURCE LINES 89-91 Set the design constraints ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 91-94 .. code-block:: Python for c_name in ["g_1", "g_2", "g_3"]: scenario.add_constraint(c_name, constraint_type="ineq") .. GENERATED FROM PYTHON SOURCE LINES 95-102 Visualize the XDSM ^^^^^^^^^^^^^^^^^^ Generate the XDSM file on the fly: - ``log_workflow_status=True`` will log the status of the workflow in the console, - ``save_html`` (default ``True``) will generate a self-contained HTML file, that can be automatically opened using ``show_html=True``. .. GENERATED FROM PYTHON SOURCE LINES 102-104 .. code-block:: Python scenario.xdsmize(save_html=False, pdf_build=False) .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 105-109 Define the algorithm inputs ^^^^^^^^^^^^^^^^^^^^^^^^^^^ We set the maximum number of iterations, the optimizer and the optimizer settings .. GENERATED FROM PYTHON SOURCE LINES 109-119 .. code-block:: Python slsqp_settings = SLSQP_Settings( max_iter=20, ftol_rel=1e-10, ineq_tolerance=1e-3, eq_tolerance=1e-3, normalize_design_space=True, ) .. GENERATED FROM PYTHON SOURCE LINES 120-122 Execute the scenario ^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 122-124 .. code-block:: Python scenario.execute(slsqp_settings) .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 11:48:38: *** Start MDOScenario execution *** INFO - 11:48:38: MDOScenario INFO - 11:48:38: Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure INFO - 11:48:38: MDO formulation: IDF INFO - 11:48:38: Optimization problem: INFO - 11:48:38: minimize -y_4(x_shared, y_14, y_24, y_34) INFO - 11:48:38: with respect to x_1, x_2, x_3, x_shared, y_12, y_14, y_21, y_23, y_24, y_31, y_32, y_34 INFO - 11:48:38: subject to constraints: INFO - 11:48:38: g_1(x_shared, x_1, y_31, y_21) <= 0 INFO - 11:48:38: g_2(x_shared, x_2, y_32, y_12) <= 0 INFO - 11:48:38: g_3(x_shared, x_3, y_23) <= 0 INFO - 11:48:38: 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 - 11:48:38: y_32(x_shared, x_3, y_23) - y_32 == 0.0 INFO - 11:48:38: y_34(x_shared, x_3, y_23) - y_34 == 0.0 INFO - 11:48:38: 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 - 11:48:38: y_23(x_shared, x_2, y_32, y_12) - y_23 == 0.0 INFO - 11:48:38: y_24(x_shared, x_2, y_32, y_12) - y_24 == 0.0 INFO - 11:48:38: 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 - 11:48:38: y_14(x_shared, x_1, y_31, y_21) - y_14 == 0.0 INFO - 11:48:38: over the design space: INFO - 11:48:38: +-------------+-------------+--------------------+-------------+-------+ INFO - 11:48:38: | Name | Lower bound | Value | Upper bound | Type | INFO - 11:48:38: +-------------+-------------+--------------------+-------------+-------+ INFO - 11:48:38: | x_shared[0] | 0.01 | 0.05 | 0.09 | float | INFO - 11:48:38: | x_shared[1] | 30000 | 45000 | 60000 | float | INFO - 11:48:38: | x_shared[2] | 1.4 | 1.6 | 1.8 | float | INFO - 11:48:38: | x_shared[3] | 2.5 | 5.5 | 8.5 | float | INFO - 11:48:38: | x_shared[4] | 40 | 55 | 70 | float | INFO - 11:48:38: | x_shared[5] | 500 | 1000 | 1500 | float | INFO - 11:48:38: | x_1[0] | 0.1 | 0.25 | 0.4 | float | INFO - 11:48:38: | x_1[1] | 0.75 | 1 | 1.25 | float | INFO - 11:48:38: | x_2 | 0.75 | 1 | 1.25 | float | INFO - 11:48:38: | x_3 | 0.1 | 0.5 | 1 | float | INFO - 11:48:38: | y_14[0] | 24850 | 50606.9741711 | 77100 | float | INFO - 11:48:38: | y_14[1] | -7700 | 7306.20262124 | 45000 | float | INFO - 11:48:38: | y_32 | 0.235 | 0.5027962499999999 | 0.795 | float | INFO - 11:48:38: | y_31 | 2960 | 6354.32430691 | 10185 | float | INFO - 11:48:38: | y_24 | 0.44 | 4.15006276 | 11.13 | float | INFO - 11:48:38: | y_34 | 0.44 | 1.10754577 | 1.98 | float | INFO - 11:48:38: | y_23 | 3365 | 12194.2671934 | 26400 | float | INFO - 11:48:38: | y_21 | 24850 | 50606.9741711 | 77250 | float | INFO - 11:48:38: | y_12[0] | 24850 | 50606.9742 | 77250 | float | INFO - 11:48:38: | y_12[1] | 0.45 | 0.95 | 1.5 | float | INFO - 11:48:38: +-------------+-------------+--------------------+-------------+-------+ INFO - 11:48:38: Solving optimization problem with algorithm SLSQP: INFO - 11:48:38: 5%|▌ | 1/20 [00:00<00:00, 323.06 it/sec, obj=-536] INFO - 11:48:38: 10%|█ | 2/20 [00:00<00:00, 83.55 it/sec, obj=-1.49e+3] INFO - 11:48:38: 15%|█▌ | 3/20 [00:00<00:00, 91.91 it/sec, obj=-3.83e+3] INFO - 11:48:38: 20%|██ | 4/20 [00:00<00:00, 97.68 it/sec, obj=-3.96e+3] INFO - 11:48:38: 25%|██▌ | 5/20 [00:00<00:00, 101.44 it/sec, obj=-3.96e+3] INFO - 11:48:38: 30%|███ | 6/20 [00:00<00:00, 104.68 it/sec, obj=-3.96e+3] INFO - 11:48:38: 35%|███▌ | 7/20 [00:00<00:00, 106.44 it/sec, obj=-3.96e+3] INFO - 11:48:38: 40%|████ | 8/20 [00:00<00:00, 107.57 it/sec, obj=-3.96e+3] INFO - 11:48:38: 45%|████▌ | 9/20 [00:00<00:00, 114.93 it/sec, obj=-3.96e+3] INFO - 11:48:38: 50%|█████ | 10/20 [00:00<00:00, 115.08 it/sec, obj=-3.96e+3] INFO - 11:48:38: 55%|█████▌ | 11/20 [00:00<00:00, 121.24 it/sec, obj=-3.96e+3] INFO - 11:48:38: 60%|██████ | 12/20 [00:00<00:00, 127.05 it/sec, obj=-3.96e+3] INFO - 11:48:38: 65%|██████▌ | 13/20 [00:00<00:00, 132.32 it/sec, obj=-3.96e+3] INFO - 11:48:38: 70%|███████ | 14/20 [00:00<00:00, 136.87 it/sec, obj=-3.96e+3] INFO - 11:48:38: 75%|███████▌ | 15/20 [00:00<00:00, 141.20 it/sec, obj=-3.96e+3] INFO - 11:48:38: 80%|████████ | 16/20 [00:00<00:00, 145.36 it/sec, obj=-3.96e+3] INFO - 11:48:38: 85%|████████▌ | 17/20 [00:00<00:00, 149.38 it/sec, obj=-3.96e+3] INFO - 11:48:38: 90%|█████████ | 18/20 [00:00<00:00, 152.79 it/sec, obj=-3.96e+3] INFO - 11:48:38: 95%|█████████▌| 19/20 [00:00<00:00, 156.27 it/sec, obj=-3.96e+3] INFO - 11:48:38: 100%|██████████| 20/20 [00:00<00:00, 159.25 it/sec, obj=-3.96e+3] INFO - 11:48:38: Optimization result: INFO - 11:48:38: Optimizer info: INFO - 11:48:38: Status: 8 INFO - 11:48:38: Message: Positive directional derivative for linesearch INFO - 11:48:38: Number of calls to the objective function by the optimizer: 21 INFO - 11:48:38: Solution: INFO - 11:48:38: The solution is feasible. INFO - 11:48:38: Objective: -3963.909125280606 INFO - 11:48:38: Standardized constraints: INFO - 11:48:38: g_1 = [-0.01807265 -0.03335477 -0.04425595 -0.0518399 -0.05733055 -0.13720865 INFO - 11:48:38: -0.10279135] INFO - 11:48:38: g_2 = 7.162693463458325e-06 INFO - 11:48:38: g_3 = [-7.67188159e-01 -2.32811841e-01 -3.73860557e-05 -1.83255000e-01] INFO - 11:48:38: y_12_y_14 = [ 1.12943503e-05 4.28787041e-07 1.13267743e-05 -1.50426345e-05] INFO - 11:48:38: y_21_y_23_y_24 = [-2.77708306e-16 1.33085464e-05 -2.62473913e-05] INFO - 11:48:38: y_31_y_32_y_34 = [-2.35661889e-06 -2.32437808e-06 1.57269783e-05] INFO - 11:48:38: Design space: INFO - 11:48:38: +-------------+-------------+---------------------+-------------+-------+ INFO - 11:48:38: | Name | Lower bound | Value | Upper bound | Type | INFO - 11:48:38: +-------------+-------------+---------------------+-------------+-------+ INFO - 11:48:38: | x_shared[0] | 0.01 | 0.06000179067336589 | 0.09 | float | INFO - 11:48:38: | x_shared[1] | 30000 | 60000 | 60000 | float | INFO - 11:48:38: | x_shared[2] | 1.4 | 1.4 | 1.8 | float | INFO - 11:48:38: | x_shared[3] | 2.5 | 2.5 | 8.5 | float | INFO - 11:48:38: | x_shared[4] | 40 | 70 | 70 | float | INFO - 11:48:38: | x_shared[5] | 500 | 1500 | 1500 | float | INFO - 11:48:38: | x_1[0] | 0.1 | 0.4 | 0.4 | float | INFO - 11:48:38: | x_1[1] | 0.75 | 0.75 | 1.25 | float | INFO - 11:48:38: | x_2 | 0.75 | 0.75 | 1.25 | float | INFO - 11:48:38: | x_3 | 0.1 | 0.156238904271528 | 1 | float | INFO - 11:48:38: | y_14[0] | 24850 | 44749.85202975167 | 77100 | float | INFO - 11:48:38: | y_14[1] | -7700 | 19351.86291108692 | 45000 | float | INFO - 11:48:38: | y_32 | 0.235 | 0.7328131425977524 | 0.795 | float | INFO - 11:48:38: | y_31 | 2960 | 9437.362336215188 | 10185 | float | INFO - 11:48:38: | y_24 | 0.44 | 8.05763183450019 | 11.13 | float | INFO - 11:48:38: | y_34 | 0.44 | 0.9239115967364436 | 1.98 | float | INFO - 11:48:38: | y_23 | 3365 | 5553.60943830111 | 26400 | float | INFO - 11:48:38: | y_21 | 24850 | 44749.85202975168 | 77250 | float | INFO - 11:48:38: | y_12[0] | 24850 | 44749.85202975167 | 77250 | float | INFO - 11:48:38: | y_12[1] | 0.45 | 0.9027908995968825 | 1.5 | float | INFO - 11:48:38: +-------------+-------------+---------------------+-------------+-------+ INFO - 11:48:38: *** End MDOScenario execution (time: 0:00:00.140494) *** .. GENERATED FROM PYTHON SOURCE LINES 125-129 Save the optimization history ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We can save the whole optimization problem and its history for further post processing: .. GENERATED FROM PYTHON SOURCE LINES 129-131 .. code-block:: Python scenario.save_optimization_history("idf_history.h5", file_format="hdf5") .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 11:48:38: Exporting the optimization problem to the file idf_history.h5 .. GENERATED FROM PYTHON SOURCE LINES 132-133 We can also save only calls to functions and design variables history: .. GENERATED FROM PYTHON SOURCE LINES 133-135 .. code-block:: Python scenario.save_optimization_history("idf_history.xml", file_format="ggobi") .. GENERATED FROM PYTHON SOURCE LINES 136-138 Print optimization metrics ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 138-140 .. code-block:: Python scenario.print_execution_metrics() .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 11:48:39: Scenario Execution Statistics INFO - 11:48:39: Discipline: SobieskiPropulsion INFO - 11:48:39: Executions number: 20 INFO - 11:48:39: Execution time: 0.006400016995030455 s INFO - 11:48:39: Linearizations number: 9 INFO - 11:48:39: Discipline: SobieskiAerodynamics INFO - 11:48:39: Executions number: 20 INFO - 11:48:39: Execution time: 0.00825697201071307 s INFO - 11:48:39: Linearizations number: 9 INFO - 11:48:39: Discipline: SobieskiMission INFO - 11:48:39: Executions number: 20 INFO - 11:48:39: Execution time: 0.00048785399485495873 s INFO - 11:48:39: Linearizations number: 9 INFO - 11:48:39: Discipline: SobieskiStructure INFO - 11:48:39: Executions number: 20 INFO - 11:48:39: Execution time: 0.04796631600402179 s INFO - 11:48:39: Linearizations number: 9 INFO - 11:48:39: Total number of executions calls: 80 INFO - 11:48:39: Total number of linearizations: 36 .. GENERATED FROM PYTHON SOURCE LINES 141-143 Plot the optimization history view ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 143-145 .. code-block:: Python scenario.post_process(post_name="OptHistoryView", save=False, show=True) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_002.png :alt: Evolution of the optimization variables :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_002.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_003.png :alt: Evolution of the objective value :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_003.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_004.png :alt: Evolution of the distance to the optimum :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_004.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_005.png :alt: Evolution of the inequality constraints :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_005.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_006.png :alt: Evolution of the equality constraints :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_006.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 146-148 Plot the quadratic approximation of the objective ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 148-149 .. code-block:: Python scenario.post_process(post_name="QuadApprox", function="-y_4", save=False, show=True) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_007.png :alt: Hessian matrix SR1 approximation of -y_4 :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_007.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_008.png :alt: plot sobieski idf example :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_idf_example_008.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 2.525 seconds) .. _sphx_glr_download_examples_formulations_plot_sobieski_idf_example.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_sobieski_idf_example.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_sobieski_idf_example.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_sobieski_idf_example.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_