.. 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_auto_functional_modeling_field_functions_plot_function_manipulation.py: Function manipulation ===================== In this example we are going to exhibit some of the generic function services such as: - to ask the dimension of its input and output vectors - to evaluate itself, its gradient and hessian - to set a finite difference method for the evaluation of the gradient or the hessian - to evaluate the number of times the function or its gradient or its hessian have been evaluated - to disable or enable (enabled by default) the history mechanism - to disable or enable the cache mechanism - to get all the values evaluated by the function and the associated inputs with the methods - to clear the history - to ask the description of its input and output vectors - to extract output components - to get a graphical representation .. code-block:: default from __future__ import print_function import openturns as ot import openturns.viewer as viewer from matplotlib import pylab as plt import math as m ot.Log.Show(ot.Log.NONE) Create a vectorial function R ^n --> R^p for example R^2 --> R^2 .. code-block:: default f = ot.SymbolicFunction(['x1', 'x2'], ['1+2*x1+x2', '2+x1+2*x2']) # Create a scalar function R --> R func1 = ot.SymbolicFunction(['x'], ['x^2']) # Create another function R^2 --> R func2 = ot.SymbolicFunction(['x', 'y'], ['x*y']) # Create a vectorial function R ^3 --> R^2 func3 = ot.SymbolicFunction(['x1', 'x2', 'x3'], ['1+2*x1+x2+x3^3', '2+sin(x1+2*x2)-sin(x3) * x3^4']) # Create a second vectorial function R ^n --> R^p # for example R^2 --> R^2 g = ot.SymbolicFunction(['x1', 'x2'], ['x1+x2', 'x1^2+2*x2^2']) def python_eval(X): a, b = X y = a+b return [y] func4 = ot.PythonFunction(2, 1, python_eval) Ask for the dimension of the input and output vectors .. code-block:: default print(f.getInputDimension()) print(f.getOutputDimension()) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none 2 2 Enable the history mechanism .. code-block:: default f = ot.MemoizeFunction(f) Evaluate the function at a particular point .. code-block:: default x = [1.0] * f.getInputDimension() y = f(x) print('x=', x, 'y=', y) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none x= [1.0, 1.0] y= [4,5] Get the history .. code-block:: default samplex = f.getInputHistory() sampley = f.getOutputHistory() print('evaluation history = ', samplex, sampley) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none evaluation history = 0 : [ 1 1 ] 0 : [ 4 5 ] Clear the history mechanism .. code-block:: default f.clearHistory() Disable the history mechanism .. code-block:: default f.disableHistory() Enable the cache mecanism .. code-block:: default f4 = ot.MemoizeFunction(func4) f4.enableCache() for i in range(10): f4(x) Get the number of times cached values are reused .. code-block:: default f4.getCacheHits() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none 9 Evaluate the gradient of the function at a particular point .. code-block:: default gradientMatrix = f.gradient(x) gradientMatrix .. raw:: html

[[ 2 1 ]
[ 1 2 ]]



Evaluate the hessian of the function at a particular point .. code-block:: default hessianMatrix = f.hessian(x) hessianMatrix .. raw:: html

sheet #0
[[ 0 0 ]
[ 0 0 ]]
sheet #1
[[ 0 0 ]
[ 0 0 ]]



Change the gradient method to a non centered finite difference method .. code-block:: default step = [1e-7] * f.getInputDimension() gradient = ot.NonCenteredFiniteDifferenceGradient(step, f.getEvaluation()) f.setGradient(gradient) gradient .. raw:: html

NonCenteredFiniteDifferenceGradient epsilon : [1e-07,1e-07]



Change the hessian method to a centered finite difference method .. code-block:: default step = [1e-7] * f.getInputDimension() hessian = ot.CenteredFiniteDifferenceHessian(step, f.getEvaluation()) f.setHessian(hessian) hessian .. raw:: html

CenteredFiniteDifferenceHessian epsilon : [1e-07,1e-07]



Get the number of times the function has been evaluated .. code-block:: default f.getEvaluationCallsNumber() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none 1 Get the number of times the gradient has been evaluated .. code-block:: default f.getGradientCallsNumber() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none 0 Get the number of times the hessian has been evaluated .. code-block:: default f.getHessianCallsNumber() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none 0 Get the component i .. code-block:: default f.getMarginal(1) .. raw:: html

[x1,x2]->[2+x1+2*x2]



Compose two functions : h = f o g .. code-block:: default ot.ComposedFunction(f, g) .. raw:: html

([x1,x2]->[1+2*x1+x2,2+x1+2*x2])o([x1,x2]->[x1+x2,x1^2+2*x2^2])



Get the valid symbolic constants .. code-block:: default ot.SymbolicFunction.GetValidConstants() .. raw:: html

[e_ -> Euler's constant (2.71828...),pi_ -> Pi constant (3.14159...)]



Graph 1 : z --> f_2(x_0,y_0,z) for z in [-1.5, 1.5] and y_0 = 2. and z_0 = 2.5 Specify the input component that varies Care : numerotation begins at 0 .. code-block:: default inputMarg = 2 # Give its variation intervall zMin = -1.5 zMax = 1.5 # Give the coordinates of the fixed input components centralPt = [1.0, 2.0, 2.5] # Specify the output marginal function # Care : numerotation begins at 0 outputMarg = 1 # Specify the point number of the final curve ptNb = 101 # Draw the curve! graph = func3.draw(inputMarg, outputMarg, centralPt, zMin, zMax, ptNb) view = viewer.View(graph) .. image:: /auto_functional_modeling/field_functions/images/sphx_glr_plot_function_manipulation_001.png :alt: y1 as a function of x3 around [1,2,2.5] :class: sphx-glr-single-img Graph 2 : (x,z) --> f_1(x,y_0,z) for x in [-1.5, 1.5], z in [-2.5, 2.5] and y_0 = 2.5 Specify the input components that vary .. code-block:: default firstInputMarg = 0 secondInputMarg = 2 # Give their variation interval inputMin2 = [-1.5, -2.5] inputMax2 = [1.5, 2.5] # Give the coordinates of the fixed input components centralPt = [0.0, 2., 2.5] # Specify the output marginal function outputMarg = 1 # Specify the point number of the final curve ptNb = [101, 101] graph = func3.draw(firstInputMarg, secondInputMarg, outputMarg, centralPt, inputMin2, inputMax2, ptNb) view = viewer.View(graph) .. image:: /auto_functional_modeling/field_functions/images/sphx_glr_plot_function_manipulation_002.png :alt: y1 as a function of (x1,x3) around [0,2,2.5] :class: sphx-glr-single-img Graph 3 : simplified method for x --> func1(x) for x in [-1.5, 1.5] Give the variation interval .. code-block:: default xMin3 = -1.5 xMax3 = 1.5 # Specify the point number of the final curve ptNb = 101 # Draw the curve! graph = func1.draw(xMin3, xMax3, ptNb) view = viewer.View(graph) .. image:: /auto_functional_modeling/field_functions/images/sphx_glr_plot_function_manipulation_003.png :alt: y0 as a function of x :class: sphx-glr-single-img Graph 4 : (x,y) --> func2(x,y) for x in [-1.5, 1.5], y in [-2.5, 2.5] Give their variation interval .. code-block:: default inputMin4 = [-1.5, -2.5] inputMax4 = [1.5, 2.5] # Give the coordinates of the fixed input components centralPt = [0.0, 2., 2.5] # Specify the output marginal function outputMarg = 1 # Specify the point number of the final curve ptNb = [101, 101] graph = func2.draw(inputMin4, inputMax4, ptNb) view = viewer.View(graph) .. image:: /auto_functional_modeling/field_functions/images/sphx_glr_plot_function_manipulation_004.png :alt: y0 as a function of (x,y) :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 0.368 seconds) .. _sphx_glr_download_auto_functional_modeling_field_functions_plot_function_manipulation.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_function_manipulation.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_function_manipulation.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_