Create a discipline from analytical expressions

from __future__ import division, unicode_literals

Import

from numpy import array

from gemseo.api import configure_logger, create_discipline

configure_logger()

Out:

<RootLogger root (INFO)>

Introduction

A simple MDODiscipline can be created using analytic formulas, e.g. \(y_1=2x^2\) and \(y_2=5+3x^2z^3\), thanks to the AnalyticDiscipline class which is a quick alternative to model a simple analytic MDO problem.

Create the dictionary of analytic outputs

First of all, we have to define the output expressions in a dictionary where keys are output names and values are formula with string format:

expressions_dict = {"y_1": "2*x**2", "y_2": "5+3*x**2+z**3"}

Create the discipline

Then, we create and instantiate the corresponding AnalyticDiscipline, which is a particular MDODiscipline. For that, we use the API function create_discipline() with:

  • discipline_name="AnalyticDiscipline",

  • name="analytic",

  • expressions_dict=expr_dict.

In practice, we write:

disc = create_discipline("AnalyticDiscipline", expressions_dict=expressions_dict)

Note

GEMSEO takes care of the grammars and MDODiscipline._run() method generation from the expressions_dict argument. In the background, GEMSEO considers that x is a monodimensional float input parameter and y_1 and y_2 are monodimensional float output parameters.

Execute the discipline

Lastly, we can execute this discipline any other:

input_data = {"x": array([2.0]), "z": array([3.0])}
out = disc.execute(input_data)
print(("y_1 =", out["y_1"]))
print(("y_2 =", out["y_2"]))

Out:

('y_1 =', array([8.]))
('y_2 =', array([44.]))

About the analytic jacobian

The discipline will provide analytic derivatives (Jacobian) automatically using the sympy library.

This can be checked easily using MDODiscipline.check_jacobian():

disc.check_jacobian(
    input_data, derr_approx=disc.FINITE_DIFFERENCES, step=1e-5, threshold=1e-3
)

Out:

    INFO - 12:59:36: Jacobian:  dp y_1/dp x succeeded!
    INFO - 12:59:36: Jacobian:  dp y_1/dp z succeeded!
    INFO - 12:59:36: Jacobian:  dp y_2/dp x succeeded!
    INFO - 12:59:36: Jacobian:  dp y_2/dp z succeeded!
    INFO - 12:59:36: Linearization of MDODiscipline: AnalyticDiscipline is correct.

True

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

Gallery generated by Sphinx-Gallery