# 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.api 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.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
```