1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
#! /usr/bin/env python
import openturns as ot
import openturns.testing as ott
import math as m
ot.TESTPREAMBLE()
# First 8 points of Faure sequence in dimension 1
expected = ot.Sample(
[
[1.0 / 2.0],
[1.0 / 4.0],
[3.0 / 4.0],
[1.0 / 8.0],
[5.0 / 8.0],
[3.0 / 8.0],
[7.0 / 8.0],
[1.0 / 16.0],
]
)
sequence = ot.FaureSequence(1)
print(sequence)
faureSample = sequence.generate(8)
ott.assert_almost_equal(faureSample, expected)
# First 8 points of Faure sequence in dimension 2
expected = ot.Sample(
[
[0.5, 0.5],
[0.25, 0.75],
[0.75, 0.25],
[0.125, 0.625],
[0.625, 0.125],
[0.375, 0.375],
[0.875, 0.875],
[0.0625, 0.9375],
]
)
sequence = ot.FaureSequence(2)
print(sequence)
faureSample = sequence.generate(8)
ott.assert_almost_equal(faureSample, expected)
# First 8 points of Faure sequence in dimension 3
expected = ot.Sample(
[
[1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0],
[2.0 / 3.0, 2.0 / 3.0, 2.0 / 3.0],
[1.0 / 9.0, 4.0 / 9.0, 7.0 / 9.0],
[4.0 / 9.0, 7.0 / 9.0, 1.0 / 9.0],
[7.0 / 9.0, 1.0 / 9.0, 4.0 / 9.0],
[2.0 / 9.0, 8.0 / 9.0, 5.0 / 9.0],
[5.0 / 9.0, 2.0 / 9.0, 8.0 / 9.0],
[8.0 / 9.0, 5.0 / 9.0, 2.0 / 9.0],
]
)
sequence = ot.FaureSequence(3)
print(sequence)
faureSample = sequence.generate(8)
ott.assert_almost_equal(faureSample, expected)
# Create a Faure sequence in dimension 15
sequence = ot.FaureSequence(15)
print(sequence)
faureSample = sequence.generate(10)
# Create another Faure' sequence of dimension 2 to estimate Pi in [0 1)^2
dimension = 2
sequence = ot.FaureSequence(dimension)
pointInsideCircle = 0
sampleSize = 3**7 # This is significant!
for i in range(sampleSize):
faurePoint = sequence.generate()
if faurePoint.norm() < 1.0:
pointInsideCircle += 1
probabilityEstimate = (1.0 * pointInsideCircle) / sampleSize
probability = m.pi / 4.0
print("sample size=", sampleSize)
print("computed probability =", probabilityEstimate)
print("expected probability =", probability)
rtol = 10.0 / sampleSize
ott.assert_almost_equal(probability, probabilityEstimate, rtol)
# Test against GSobol' test function
# https://github.com/openturns/openturns/issues/2653
a = [0.0, 9.0, 99.0]
def GSobolModel(X):
X = ot.Point(X)
d = X.getDimension()
Y = 1.0
for i in range(d):
Y *= (abs(4.0 * X[i] - 2.0) + a[i]) / (1.0 + a[i])
return ot.Point([Y])
dimension = 3
gSobolFunction = ot.PythonFunction(dimension, 1, GSobolModel)
gSobolFunction.setOutputDescription(["Y"])
# Define the distribution
distributionList = [ot.Uniform(0.0, 1.0) for i in range(dimension)]
distribution = ot.ComposedDistribution(distributionList)
# Compute Mean
gSobolMean = 1.0
basis = 3 # ie the smallest prime number greater or equal to the dimension
sampleSize = basis**7 # This is significant!
sequence = ot.FaureSequence()
experiment_QMC = ot.LowDiscrepancyExperiment(sequence, distribution, sampleSize, False)
inputSample = experiment_QMC.generate()
outputSample = gSobolFunction(inputSample)
computedMean = outputSample.computeMean()[0]
print("sample size=", sampleSize)
print("computed mean =", computedMean)
print("expected mean =", gSobolMean)
rtol = 10.0 / sampleSize
ott.assert_almost_equal(computedMean, gSobolMean, rtol)
|