.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_reliability_sensitivity/sensitivity_analysis/plot_functional_chaos_sensitivity.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_reliability_sensitivity_sensitivity_analysis_plot_functional_chaos_sensitivity.py: Sobol' sensitivity indices from chaos ===================================== .. GENERATED FROM PYTHON SOURCE LINES 6-23 In this example we are going to compute global sensitivity indices from a functional chaos decomposition. We study the Borehole function that models water flow through a borehole: .. math:: \frac{2 \pi T_u (H_u - H_l)}{\ln{r/r_w}(1+\frac{2 L T_u}{\ln(r/r_w) r^2_w K_w}\frac{T_u}{T_l})} With parameters: - :math:`r_w`: radius of borehole (m) - :math:`r`: radius of influence (m) - :math:`T_u`: transmissivity of upper aquifer (:math:`m^2/yr`) - :math:`H_u`: potentiometric head of upper aquifer (m) - :math:`T_l`: transmissivity of lower aquifer (:math:`m^2/yr`) - :math:`H_l`: potentiometric head of lower aquifer (m) - :math:`L`: length of borehole (m) - :math:`K_w`: hydraulic conductivity of borehole (:math:`m/yr`) .. GENERATED FROM PYTHON SOURCE LINES 25-32 .. code-block:: Python import openturns as ot from operator import itemgetter import openturns.viewer as viewer from matplotlib import pylab as plt ot.Log.Show(ot.Log.NONE) .. GENERATED FROM PYTHON SOURCE LINES 33-34 borehole model .. GENERATED FROM PYTHON SOURCE LINES 34-52 .. code-block:: Python dimension = 8 input_names = ["rw", "r", "Tu", "Hu", "Tl", "Hl", "L", "Kw"] model = ot.SymbolicFunction( input_names, ["(2*pi_*Tu*(Hu-Hl))/(ln(r/rw)*(1+(2*L*Tu)/(ln(r/rw)*rw^2*Kw)+Tu/Tl))"] ) coll = [ ot.Normal(0.1, 0.0161812), ot.LogNormal(7.71, 1.0056), ot.Uniform(63070.0, 115600.0), ot.Uniform(990.0, 1110.0), ot.Uniform(63.1, 116.0), ot.Uniform(700.0, 820.0), ot.Uniform(1120.0, 1680.0), ot.Uniform(9855.0, 12045.0), ] distribution = ot.JointDistribution(coll) distribution.setDescription(input_names) .. GENERATED FROM PYTHON SOURCE LINES 53-54 Freeze r, Tu, Tl from model to go faster .. GENERATED FROM PYTHON SOURCE LINES 54-64 .. code-block:: Python selection = [1, 2, 4] complement = ot.Indices(selection).complement(dimension) distribution = distribution.getMarginal(complement) model = ot.ParametricFunction( model, selection, distribution.getMarginal(selection).getMean() ) input_names_copy = list(input_names) input_names = itemgetter(*complement)(input_names) dimension = len(complement) .. GENERATED FROM PYTHON SOURCE LINES 65-66 design of experiment .. GENERATED FROM PYTHON SOURCE LINES 66-70 .. code-block:: Python size = 1000 X = distribution.getSample(size) Y = model(X) .. GENERATED FROM PYTHON SOURCE LINES 71-72 create a functional chaos model .. GENERATED FROM PYTHON SOURCE LINES 72-78 .. code-block:: Python algo = ot.FunctionalChaosAlgorithm(X, Y) algo.run() result = algo.getResult() print(result.getResiduals()) print(result.getRelativeErrors()) .. rst-class:: sphx-glr-script-out .. code-block:: none [0.00175769] [3.70801e-06] .. GENERATED FROM PYTHON SOURCE LINES 79-80 Quick summary of sensitivity analysis .. GENERATED FROM PYTHON SOURCE LINES 80-83 .. code-block:: Python sensitivityAnalysis = ot.FunctionalChaosSobolIndices(result) sensitivityAnalysis .. raw:: html
FunctionalChaosSobolIndices
Input Variable Sobol' index Total index
0 rw 0.698383 0.726572
1 Hu 0.084703 0.095073
2 Hl 0.084747 0.095132
3 L 0.081092 0.092178
4 Kw 0.019748 0.022672
Index Multi-index Part of variance
1 [1,0,0,0,0] 0.623730
3 [0,0,1,0,0] 0.084747
2 [0,1,0,0,0] 0.084703
4 [0,0,0,1,0] 0.080217
5 [0,0,0,0,1] 0.019748
56 [6,0,0,0,0] 0.019191
31 [5,0,0,0,0] 0.018039
61 [7,0,0,0,0] 0.011068
6 [2,0,0,0,0] 0.010331


.. GENERATED FROM PYTHON SOURCE LINES 84-85 draw Sobol' indices .. GENERATED FROM PYTHON SOURCE LINES 85-90 .. code-block:: Python first_order = [sensitivityAnalysis.getSobolIndex(i) for i in range(dimension)] total_order = [sensitivityAnalysis.getSobolTotalIndex(i) for i in range(dimension)] graph = ot.SobolIndicesAlgorithm.DrawSobolIndices(input_names, first_order, total_order) view = viewer.View(graph) .. image-sg:: /auto_reliability_sensitivity/sensitivity_analysis/images/sphx_glr_plot_functional_chaos_sensitivity_001.png :alt: Sobol' indices :srcset: /auto_reliability_sensitivity/sensitivity_analysis/images/sphx_glr_plot_functional_chaos_sensitivity_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 91-93 We saw that total order indices are close to first order, so the higher order indices must be all quite close to 0 .. GENERATED FROM PYTHON SOURCE LINES 93-99 .. code-block:: Python for i in range(dimension): for j in range(i): sij = sensitivityAnalysis.getSobolIndex([i, j]) print(f"{input_names[i]} & {input_names[j]}: {sij:.4f}") plt.show() .. rst-class:: sphx-glr-script-out .. code-block:: none Hu & rw: 0.0088 Hl & rw: 0.0088 Hl & Hu: 0.0000 L & rw: 0.0083 L & Hu: 0.0012 L & Hl: 0.0011 Kw & rw: 0.0020 Kw & Hu: 0.0003 Kw & Hl: 0.0003 Kw & L: 0.0003 .. _sphx_glr_download_auto_reliability_sensitivity_sensitivity_analysis_plot_functional_chaos_sensitivity.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_functional_chaos_sensitivity.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_functional_chaos_sensitivity.py `