.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_functional_modeling/vectorial_functions/plot_quick_start_functions.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_auto_functional_modeling_vectorial_functions_plot_quick_start_functions.py: Defining Python and symbolic functions: a quick start introduction to functions =============================================================================== .. GENERATED FROM PYTHON SOURCE LINES 7-12 Abstract -------- In this example, we show how to define Python and symbolic functions. Such functions can be evaluated by the library and used, for example, to propagate uncertainties. We focus on functions which have a vector input and a vector output. .. GENERATED FROM PYTHON SOURCE LINES 14-46 Introduction ------------ We consider the following example: * three input variables, * two outputs. Moreover, we assume that the input distribution has independent Gaussian marginals. The function is defined by the equations: .. math:: Y_1 = X_1 + X_2 + X_3 and .. math:: Y_2 = X_1 - X_2 X_3 for any :math:`X_1,X_2,X_3 \in \mathbb{R}`. The exact expectation and standard deviation of the output random variable are presented in the following table. ============= =========== ================== Variable Expectation Standard deviation ============= =========== ================== :math:`Y_1` 0 1.732 :math:`Y_2` 0 1.415 ============= =========== ================== .. GENERATED FROM PYTHON SOURCE LINES 48-53 .. code-block:: Python import numpy as np import openturns as ot ot.Log.Show(ot.Log.NONE) .. GENERATED FROM PYTHON SOURCE LINES 54-55 We first define the input random vector of the function. .. GENERATED FROM PYTHON SOURCE LINES 57-64 .. code-block:: Python X0 = ot.Normal(0.0, 1.0) X1 = ot.Normal(0.0, 1.0) X2 = ot.Normal(0.0, 1.0) inputDistribution = ot.JointDistribution((X0, X1, X2)) inputRandomVector = ot.RandomVector(inputDistribution) .. GENERATED FROM PYTHON SOURCE LINES 65-84 The Python function ------------------- Based on a Python function defined with the `def` keyword, the `PythonFunction` class creates a function. The simplest constructor of the `PythonFunction` class is: `PythonFunction ( nbInputs , nbOutputs , myPythonFunc )` where * `nbInputs`: the number of inputs, * `nbOutputs`: the number of outputs, * `myPythonFunc`: a Python function. The goal of the `PythonFunction` class are: * to easily create a function in Python, * use all the power of the Python libraries in order to evaluate the function. .. GENERATED FROM PYTHON SOURCE LINES 86-90 The function `mySimulator` has the calling sequence `y=mySimulator(x)` where: * `x`: the input of the function, a vector with `nbInputs` dimensions, * `y`: the output of the function, a vector with `nbOutputs` dimensions. .. GENERATED FROM PYTHON SOURCE LINES 93-100 .. code-block:: Python def mySimulator(x): y0 = x[0] + x[1] + x[2] y1 = x[0] - x[1] * x[2] y = [y0, y1] return y .. GENERATED FROM PYTHON SOURCE LINES 101-102 We now define the `PythonFunction` object. .. GENERATED FROM PYTHON SOURCE LINES 104-106 .. code-block:: Python myfunction = ot.PythonFunction(3, 2, mySimulator) .. GENERATED FROM PYTHON SOURCE LINES 107-108 This function can be evaluated using parentheses. It produces the same outputs as the `mySimulator` function. .. GENERATED FROM PYTHON SOURCE LINES 110-112 .. code-block:: Python myfunction([1.0, 2.0, 3.0]) .. raw:: html
class=Point name=Unnamed dimension=2 values=[6,-5]


.. GENERATED FROM PYTHON SOURCE LINES 113-115 However, the newly created `myfunction` has services that the basic Python function did not have. For example, we can create a `CompositeRandomVector` on top of it, by associating it to the input random vector. .. GENERATED FROM PYTHON SOURCE LINES 117-119 .. code-block:: Python outputVect = ot.CompositeRandomVector(myfunction, inputRandomVector) .. GENERATED FROM PYTHON SOURCE LINES 120-121 In the following example, we estimate the output mean based on a simple Monte-Carlo experiment using 10000 function evaluations. .. GENERATED FROM PYTHON SOURCE LINES 123-126 .. code-block:: Python montecarlosize = 10000 outputSample = outputVect.getSample(montecarlosize) .. GENERATED FROM PYTHON SOURCE LINES 127-132 .. code-block:: Python empiricalMean = outputSample.computeMean() print(empiricalMean) empiricalSd = outputSample.computeStandardDeviation() print(empiricalSd) .. rst-class:: sphx-glr-script-out .. code-block:: none [0.0100558,0.0131208] [1.73571,1.42052] .. GENERATED FROM PYTHON SOURCE LINES 133-149 What types for x and for y ? ---------------------------- Not all types are possible for the inputs and outputs of the `mySimulator` function. The following table present some of the available types. All in all, any type which can be converted to or from a "vector" can be managed by the `PythonFunction` class. ==================== ======= ======== Type Input X Output Y ==================== ======= ======== `list` (Python) NO YES `tuple` (Python) NO YES `array` (NumPy) NO YES `Point` (OpenTURNS) YES YES ==================== ======= ======== .. GENERATED FROM PYTHON SOURCE LINES 151-159 The vectorized Python function ------------------------------ The `PythonFunction` class has a `func_sample` option which vectorizes the computation so that all the output values in the sample are computed from a single function call, without any `for` loop. To make this possible, the input and output is then a `Sample` instead of a `Point`. This often boosts performance (but not always). .. GENERATED FROM PYTHON SOURCE LINES 161-176 The calling sequence of a vectorized Python function is: def mySimulator (x): [...] return y myfunction = PythonFunction(nbInputs, nbOutputs, func_sample = mySimulator) where * x: the input of the function, a `Sample` with size `nbExperiments` (`getSize`) and dimension `nbInputs` (`getDimension`), * y: the output of the function * a numpy `array` with `nbExperiments` rows and `nbOutputs` columns * or a `Sample` with size `nbExperiments` and dimension `nbOutputs` .. GENERATED FROM PYTHON SOURCE LINES 178-179 In the following, we present an vectorization example based on the `numpy` module. .. GENERATED FROM PYTHON SOURCE LINES 184-198 .. code-block:: Python def mySimulatorVect(x): # Convert NumericalSample > Array Numpy x = np.array(x) x0 = x[:, 0] # Extract column 0 x1 = x[:, 1] x2 = x[:, 2] y0 = x0 + x1 + x2 y1 = x0 - x1 * x2 # Stack the two rows y = np.vstack((y0, y1)) y = y.transpose() return y .. GENERATED FROM PYTHON SOURCE LINES 199-201 .. code-block:: Python myfunctionVect = ot.PythonFunction(3, 2, func_sample=mySimulatorVect) .. GENERATED FROM PYTHON SOURCE LINES 202-204 .. code-block:: Python outputVect = ot.CompositeRandomVector(myfunctionVect, inputRandomVector) .. GENERATED FROM PYTHON SOURCE LINES 205-213 .. code-block:: Python montecarlosize = 10000 outputSample = outputVect.getSample(montecarlosize) empiricalMean = outputSample.computeMean() print(empiricalMean) empiricalSd = outputSample.computeStandardDeviation() print(empiricalSd) .. rst-class:: sphx-glr-script-out .. code-block:: none [-0.000347844,0.00361285] [1.7322,1.43513] .. GENERATED FROM PYTHON SOURCE LINES 214-228 How to manage the history ------------------------- The `MemoizeFunction` class defines a history system to store the calls to the function. ==================== =============================================== Methods Description ==================== =============================================== `enableHistory()` enables the history (it is enabled by default) `disableHistory()` disables the history `clearHistory()` deletes the content of the history `getHistoryInput()` a `Sample`, the history of inputs X `getHistoryOutput()` a `Sample`, the history of outputs Y ==================== =============================================== .. GENERATED FROM PYTHON SOURCE LINES 230-233 .. code-block:: Python myfunction = ot.PythonFunction(3, 2, mySimulator) myfunction = ot.MemoizeFunction(myfunction) .. GENERATED FROM PYTHON SOURCE LINES 234-238 .. code-block:: Python outputVariableOfInterest = ot.CompositeRandomVector(myfunction, inputRandomVector) montecarlosize = 10 outputSample = outputVariableOfInterest.getSample(montecarlosize) .. GENERATED FROM PYTHON SOURCE LINES 239-240 Get the history of input points. .. GENERATED FROM PYTHON SOURCE LINES 242-245 .. code-block:: Python inputs = myfunction.getInputHistory() inputs .. raw:: html
v0v1v2
00.027486641.4733541.198018
10.0056564230.2260928-0.7136331
2-0.8894321-0.82866381.724369
3-0.38431360.75252652.491491
40.0012025771.0902910.0425131
5-0.70160020.82224330.0195793
60.60765130.98648380.4238989
7-1.087585-0.3901163-0.2559523
80.60675161.460728-0.592297
90.40182811.8267820.7757831


.. GENERATED FROM PYTHON SOURCE LINES 246-257 Symbolic functions ------------------ The `SymbolicFunction` class can create symbolic functions whenever the function is simple enough to be expressed as a string. This has at least two significant advantages. * It generally improves the performance. * This allows one to automatically evaluate the exact gradient and Hessian matrix. In practice, some functions cannot be expressed as a symbolic function: in this case, the Python function cannot be avoided. .. GENERATED FROM PYTHON SOURCE LINES 259-269 The calling sequence is the following: ` myfunction = SymbolicFunction( list_of_inputs, list_of_formulas) ` where * list_of_inputs: a `list` of `nbInputs` strings, the names of the input variables, * list_of_formulas: a `list` of `nbOutputs` strings, the equations. .. GENERATED FROM PYTHON SOURCE LINES 271-273 .. code-block:: Python myfunction = ot.SymbolicFunction(("x0", "x1", "x2"), ("x0 + x1 + x2", "x0 - x1 * x2")) .. GENERATED FROM PYTHON SOURCE LINES 274-275 A `SymbolicFunction`, like any other function, can also have a history. .. GENERATED FROM PYTHON SOURCE LINES 277-279 .. code-block:: Python myfunction = ot.MemoizeFunction(myfunction) .. GENERATED FROM PYTHON SOURCE LINES 280-282 .. code-block:: Python outputVect = ot.CompositeRandomVector(myfunction, inputRandomVector) .. GENERATED FROM PYTHON SOURCE LINES 283-288 .. code-block:: Python montecarlosize = 10000 outputSample = outputVect.getSample(montecarlosize) empiricalMean = outputSample.computeMean() print(empiricalMean) .. rst-class:: sphx-glr-script-out .. code-block:: none [0.0315746,0.00570587] .. GENERATED FROM PYTHON SOURCE LINES 289-290 Since the history is enabled, we can get the history of outputs of the function. .. GENERATED FROM PYTHON SOURCE LINES 292-294 .. code-block:: Python outputs = myfunction.getOutputHistory() outputs[1:10, :] .. raw:: html
v0v1
0-0.1981320.7061179
1-1.044350.009464736
2-1.007573-0.7812285
3-1.938332-1.006561
41.255671-2.073448
50.76162992.624662
6-0.5887596-1.087181
7-0.4644172.018825
81.7431721.632171


.. _sphx_glr_download_auto_functional_modeling_vectorial_functions_plot_quick_start_functions.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_quick_start_functions.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_quick_start_functions.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_quick_start_functions.zip `