# Validate a polynomial chaos¶

In this example, we show how to perform the draw validation of a polynomial chaos for the Ishigami function.

```import openturns as ot
import openturns.viewer as viewer
from matplotlib import pylab as plt
from math import pi
ot.Log.Show(ot.Log.NONE)
```

## Model description¶

We load the Ishigami test function from the usecases module :

```from openturns.usecases import ishigami_function as ishigami_function
im = ishigami_function.IshigamiModel()
```

The IshigamiModel data class contains the input distribution in im.distributionX and the Ishigami function in im.model. We also have access to the input variable names with

```input_names = im.distributionX.getDescription()
```
```N = 100
inputTrain = im.distributionX.getSample(N)
outputTrain = im.model(inputTrain)
```

## Create the chaos¶

We could use only the input and output training samples: in this case, the distribution of the input sample is computed by selecting the best distribution that fits the data.

```chaosalgo = ot.FunctionalChaosAlgorithm(inputTrain, outputTrain)
```

Since the input distribution is known in our particular case, we instead create the multivariate basis from the distribution, that is three independent variables X1, X2 and X3.

```multivariateBasis = ot.OrthogonalProductPolynomialFactory([im.X1, im.X2, im.X3])
totalDegree = 8
enumfunc = multivariateBasis.getEnumerateFunction()
P = enumfunc.getStrataCumulatedCardinal(totalDegree)
```
```selectionAlgorithm = ot.LeastSquaresMetaModelSelectionFactory()
projectionStrategy = ot.LeastSquaresStrategy(inputTrain, outputTrain, selectionAlgorithm)
```
```chaosalgo = ot.FunctionalChaosAlgorithm(inputTrain, outputTrain, im.distributionX, adaptiveStrategy, projectionStrategy)
```
```chaosalgo.run()
result = chaosalgo.getResult()
metamodel = result.getMetaModel()
```

## Validation of the metamodel¶

In order to validate the metamodel, we generate a test sample.

```n_valid = 1000
inputTest = im.distributionX.getSample(n_valid)
outputTest = im.model(inputTest)
val = ot.MetaModelValidation(inputTest, outputTest, metamodel)
Q2 = val.computePredictivityFactor()[0]
Q2
```

Out:

```0.9972078325177286
```

The Q2 is very close to 1: the metamodel is excellent.

```graph = val.drawValidation()
graph.setTitle("Q2=%.2f%%" % (Q2*100))
view = viewer.View(graph)
plt.show()
```

The metamodel has a good predictivity, since the points are almost on the first diagonal.

Total running time of the script: ( 0 minutes 0.192 seconds)

Gallery generated by Sphinx-Gallery