.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/formulations/plot_sobieski_mdf_example.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_formulations_plot_sobieski_mdf_example.py: MDF-based MDO on the Sobieski SSBJ test case ============================================ .. GENERATED FROM PYTHON SOURCE LINES 24-34 .. code-block:: default from __future__ import annotations from gemseo.api import configure_logger from gemseo.api import create_discipline from gemseo.api import create_scenario from gemseo.api import generate_n2_plot from gemseo.problems.sobieski.core.problem import SobieskiProblem configure_logger() .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 35-42 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 42-51 .. code-block:: default 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:`.MDODiscipline.default_inputs` .. GENERATED FROM PYTHON SOURCE LINES 55-59 .. code-block:: default for discipline in disciplines: print(discipline) print(f"Default inputs: {discipline.default_inputs}") .. 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:: default generate_n2_plot(disciplines, save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_001.png :alt: plot sobieski mdf example :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 67-78 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:`.MDF` formulation. We tell the scenario to minimize -y_4 instead of minimizing y_4 (range), which is the default option. Instantiate the scenario ^^^^^^^^^^^^^^^^^^^^^^^^ During the instantiation of the scenario, we provide some options for the MDF formulations: .. GENERATED FROM PYTHON SOURCE LINES 78-86 .. code-block:: default formulation_options = { "tolerance": 1e-10, "max_mda_iter": 50, "warm_start": True, "use_lu_fact": True, "linear_solver_tolerance": 1e-15, } .. GENERATED FROM PYTHON SOURCE LINES 87-96 - :code:`'warm_start`: warm starts MDA, - :code:`'warm_start`: optimize the adjoints resolution by storing the Jacobian matrix LU factorization for the multiple RHS (objective + constraints). This saves CPU time if you can pay for the memory and have the full Jacobians available, not just matrix vector products. - :code:`'linear_solver_tolerance'`: set the linear solver tolerance, idem we need full convergence .. GENERATED FROM PYTHON SOURCE LINES 97-108 .. code-block:: default design_space = SobieskiProblem().design_space print(design_space) scenario = create_scenario( disciplines, "MDF", objective_name="y_4", design_space=design_space, maximize_objective=True, **formulation_options, ) .. rst-class:: sphx-glr-script-out .. code-block:: none 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 109-111 Set the design constraints ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 111-114 .. code-block:: default for c_name in ["g_1", "g_2", "g_3"]: scenario.add_constraint(c_name, "ineq") .. GENERATED FROM PYTHON SOURCE LINES 115-121 XDSMIZE the scenario ^^^^^^^^^^^^^^^^^^^^ Generate the XDSM file on the fly, setting ``print_statuses=True`` will print the status in the console ``html_output`` (default ``True``), will generate a self-contained HTML file, that can be automatically open using ``open_browser=True`` .. GENERATED FROM PYTHON SOURCE LINES 121-123 .. code-block:: default scenario.xdsmize() .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 16:58:36: Generating HTML XDSM file in : xdsm.html .. GENERATED FROM PYTHON SOURCE LINES 124-135 Define the algorithm inputs ^^^^^^^^^^^^^^^^^^^^^^^^^^^ We set the maximum number of iterations, the optimizer and the optimizer options. Algorithm specific options are passed there. Use :meth:`~gemseo.api.get_algorithm_options_schema` API function for more information or read the documentation. Here ftol_rel option is a stop criteria based on the relative difference in the objective between two iterates ineq_tolerance the tolerance determination of the optimum; this is specific to the |g| wrapping and not in the solver. .. GENERATED FROM PYTHON SOURCE LINES 135-142 .. code-block:: default algo_options = { "ftol_rel": 1e-10, "ineq_tolerance": 2e-3, "normalize_design_space": True, } scn_inputs = {"max_iter": 10, "algo": "SLSQP", "algo_options": algo_options} .. GENERATED FROM PYTHON SOURCE LINES 143-157 .. seealso:: We can also generate a backup file for the optimization, as well as plots on the fly of the optimization history if option ``generate_opt_plot`` is ``True``. This slows down a lot the process, here since SSBJ is very light .. code:: scenario.set_optimization_history_backup(file_path="mdf_backup.h5", each_new_iter=True, each_store=False, erase=True, pre_load=False, generate_opt_plot=True) .. GENERATED FROM PYTHON SOURCE LINES 159-161 Execute the scenario ^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 161-163 .. code-block:: default scenario.execute(scn_inputs) .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 16:58:36: INFO - 16:58:36: *** Start MDOScenario execution *** INFO - 16:58:36: MDOScenario INFO - 16:58:36: Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure INFO - 16:58:36: MDO formulation: MDF INFO - 16:58:36: Optimization problem: INFO - 16:58:36: minimize -y_4(x_shared, x_1, x_2, x_3) = -y_4(x_shared, x_1, x_2, x_3) INFO - 16:58:36: with respect to x_1, x_2, x_3, x_shared INFO - 16:58:36: subject to constraints: INFO - 16:58:36: g_1(x_shared, x_1, x_2, x_3) <= 0.0 INFO - 16:58:36: g_2(x_shared, x_1, x_2, x_3) <= 0.0 INFO - 16:58:36: g_3(x_shared, x_1, x_2, x_3) <= 0.0 INFO - 16:58:36: over the design space: INFO - 16:58:36: +-------------+-------------+-------+-------------+-------+ INFO - 16:58:36: | name | lower_bound | value | upper_bound | type | INFO - 16:58:36: +-------------+-------------+-------+-------------+-------+ INFO - 16:58:36: | x_shared[0] | 0.01 | 0.05 | 0.09 | float | INFO - 16:58:36: | x_shared[1] | 30000 | 45000 | 60000 | float | INFO - 16:58:36: | x_shared[2] | 1.4 | 1.6 | 1.8 | float | INFO - 16:58:36: | x_shared[3] | 2.5 | 5.5 | 8.5 | float | INFO - 16:58:36: | x_shared[4] | 40 | 55 | 70 | float | INFO - 16:58:36: | x_shared[5] | 500 | 1000 | 1500 | float | INFO - 16:58:36: | x_1[0] | 0.1 | 0.25 | 0.4 | float | INFO - 16:58:36: | x_1[1] | 0.75 | 1 | 1.25 | float | INFO - 16:58:36: | x_2 | 0.75 | 1 | 1.25 | float | INFO - 16:58:36: | x_3 | 0.1 | 0.5 | 1 | float | INFO - 16:58:36: +-------------+-------------+-------+-------------+-------+ INFO - 16:58:36: Solving optimization problem with algorithm SLSQP: INFO - 16:58:36: ... 0%| | 0/10 [00:00 .. GENERATED FROM PYTHON SOURCE LINES 188-190 Plot the basic history view ^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 190-194 .. code-block:: default scenario.post_process( "BasicHistory", variable_names=["x_shared"], save=False, show=True ) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_007.png :alt: History plot :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_007.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 195-197 Plot the constraints and objective history ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 197-199 .. code-block:: default scenario.post_process("ObjConstrHist", save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_008.png :alt: Evolution of the objective and maximum constraint :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_008.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 200-202 Plot the constraints history ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 202-209 .. code-block:: default scenario.post_process( "ConstraintsHistory", constraint_names=["g_1", "g_2", "g_3"], save=False, show=True, ) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_009.png :alt: Evolution of the constraints w.r.t. iterations, g_1 (0) (inequality), g_1 (1) (inequality), g_1 (2) (inequality), g_1 (3) (inequality), g_1 (4) (inequality), g_1 (5) (inequality), g_1 (6) (inequality), g_2 (inequality), g_3 (0) (inequality), g_3 (1) (inequality), g_3 (2) (inequality), g_3 (3) (inequality) :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_009.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 210-212 Plot the constraints history using a radar chart ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 212-219 .. code-block:: default scenario.post_process( "RadarChart", constraint_names=["g_1", "g_2", "g_3"], save=False, show=True, ) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_010.png :alt: Constraints at iteration 2 (optimum) :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_010.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 220-222 Plot the quadratic approximation of the objective ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 222-224 .. code-block:: default scenario.post_process("QuadApprox", function="-y_4", save=False, show=True) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_011.png :alt: Hessian matrix SR1 approximation of -y_4 :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_011.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_012.png :alt: plot sobieski mdf example :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_012.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 225-227 Plot the functions using a SOM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 227-229 .. code-block:: default scenario.post_process("SOM", save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_013.png :alt: Self Organizing Maps of the design space, -y_4, g_1_0, g_1_1, g_1_2, g_1_3, g_1_4, g_1_5, g_1_6, g_2, g_3_0, g_3_1, g_3_2, g_3_3 :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_013.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 16:58:40: Building Self Organizing Map from optimization history: INFO - 16:58:40: Number of neurons in x direction = 4 INFO - 16:58:40: Number of neurons in y direction = 4 .. GENERATED FROM PYTHON SOURCE LINES 230-232 Plot the scatter matrix of variables of interest ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 232-240 .. code-block:: default scenario.post_process( "ScatterPlotMatrix", variable_names=["-y_4", "g_1"], save=False, show=True, fig_size=(14, 14), ) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_014.png :alt: plot sobieski mdf example :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_014.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 241-243 Plot the variables using the parallel coordinates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 243-245 .. code-block:: default scenario.post_process("ParallelCoordinates", save=False, show=True) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_015.png :alt: Design variables history colored by '-y_4' value :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_015.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_016.png :alt: Objective function and constraints history colored by '-y_4' value. :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_016.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 246-248 Plot the robustness of the solution ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 248-250 .. code-block:: default scenario.post_process("Robustness", save=True, show=True) .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 251-253 Plot the influence of the design variables ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 253-254 .. code-block:: default scenario.post_process("VariableInfluence", fig_size=(14, 14), save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_017.png :alt: Partial variation of the functions wrt design variables, 9 variables required to explain 99% of -y_4 variations, 5 variables required to explain 99% of g_1_0 variations, 5 variables required to explain 99% of g_1_1 variations, 5 variables required to explain 99% of g_1_2 variations, 5 variables required to explain 99% of g_1_3 variations, 5 variables required to explain 99% of g_1_4 variations, 4 variables required to explain 99% of g_1_5 variations, 4 variables required to explain 99% of g_1_6 variations, 1 variables required to explain 99% of g_2 variations, 7 variables required to explain 99% of g_3_0 variations, 7 variables required to explain 99% of g_3_1 variations, 3 variables required to explain 99% of g_3_2 variations, 3 variables required to explain 99% of g_3_3 variations :srcset: /examples/formulations/images/sphx_glr_plot_sobieski_mdf_example_017.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none WARNING - 16:58:45: Optimization found no feasible point ! The least infeasible point is selected. INFO - 16:58:45: VariableInfluence for function -y_4 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [1 4 3 2 5 9 7 8 0] /home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/4.3.0.post0/lib/python3.9/site-packages/gemseo/post/variable_influence.py:230: UserWarning: FixedFormatter should only be used together with FixedLocator axe.set_xticklabels(x_labels, fontsize=font_size, rotation=rotation) INFO - 16:58:45: VariableInfluence for function g_1_0 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [0 7 3 5 6] INFO - 16:58:45: VariableInfluence for function g_1_1 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [0 7 3 5 6] INFO - 16:58:45: VariableInfluence for function g_1_2 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [7 0 3 5 6] INFO - 16:58:45: VariableInfluence for function g_1_3 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [7 0 3 5 6] INFO - 16:58:45: VariableInfluence for function g_1_4 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [7 0 3 5 6] INFO - 16:58:45: VariableInfluence for function g_1_5 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [3 7 5 6] INFO - 16:58:45: VariableInfluence for function g_1_6 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [3 7 5 6] INFO - 16:58:45: VariableInfluence for function g_2 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [0] INFO - 16:58:45: VariableInfluence for function g_3_0 INFO - 16:58:45: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:45: [9 1 5 2 4 0 8] INFO - 16:58:46: VariableInfluence for function g_3_1 INFO - 16:58:46: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:46: [9 1 5 2 4 0 8] INFO - 16:58:46: VariableInfluence for function g_3_2 INFO - 16:58:46: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:46: [1 9 2] INFO - 16:58:46: VariableInfluence for function g_3_3 INFO - 16:58:46: Most influential variables indices to explain % of the function variation: 99 INFO - 16:58:46: [9 1 2] .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 10.355 seconds) .. _sphx_glr_download_examples_formulations_plot_sobieski_mdf_example.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_sobieski_mdf_example.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_sobieski_mdf_example.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_