How to build an analytic discipline?¶
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 class AnalyticDiscipline
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 = {'y_1': '2*x**2', 'y_2': '5+3*x**2+z**3'}
Create and instantiate the discipline¶
Then, we create and instantiate the corresponding AnalyticDiscipline
inheriting from MDODiscipline
by means of the API function create_discipline()
with:
discipline_name="AnalyticDiscipline"
,name="analytic"
,expressions=expr_dict
.
In practice, we write:
from gemseo import create_discipline
disc = create_discipline("AnalyticDiscipline", name="analytic", expressions=expressions)
Note
GEMSEO takes care of the grammars and MDODiscipline._run()
method generation from the expressions
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, this discipline can be executed as any other:
from numpy import array
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"])
which results in:
y_1 = [ 8.]
y_2 = [ 44.]
About the analytic jacobian¶
The discipline will provide analytic derivatives (Jacobian) automatically using the sympy library,
by means of the AnalyticDiscipline._compute_jacobian()
method.
This can be checked easily using MDODiscipline.check_jacobian()
:
disc.check_jacobian(input_data,
derr_approx=disc.ApproximationMode.FINITE_DIFFERENCES,
step=1e-5, threshold=1e-3)
which results in:
INFO - 10:34:33 : Jacobian: dp y_2/dp x succeeded!
INFO - 10:34:33 : Jacobian: dp y_2/dp z succeeded!
INFO - 10:34:33 : Jacobian: dp y_1/dp x succeeded!
INFO - 10:34:33 : Jacobian: dp y_1/dp z succeeded!
INFO - 10:34:33 : Linearization of MDODiscipline: AnalyticDiscipline is correct !
True