В общем, у меня есть модель g, которая наблюдала входы X, параметры θ и наблюдаемые выходы Y. Однако в некоторых ситуациях у меня нет наблюдаемых входов X. В этом случае использование OpenTURNS кажется невозможным, поскольку конструктор, например, класса LinearLeastSquaresCalibration
требует входной выборки.
Для обеспечения базового варианта использования c, позвольте мне рассмотреть следующий пример, адаптированный из документации класса LinearLeastSquaresCalibration
.
Сначала мы определим модель g как откалиброван.
import numpy as np
import openturns as ot
# We define the model g which has 3 inputs and one output H.
def functionFlooding(X) :
L = 5.0e3
B = 300.0
Q, K_s, DeltaZ = X
alpha = DeltaZ/L
if alpha < 0.0 or K_s <= 0.0:
H = np.inf
else:
H = (Q/(K_s*B*np.sqrt(alpha)))**(3.0/5.0)
return [H]
g = ot.PythonFunction(3, 1, functionFlooding)
g = ot.MemoizeFunction(g)
g.setOutputDescription(["H (m)"])
Затем мы определяем входной случайный вектор. Это набор из 3 Dirac
распределений.
# Set the parameters to be calibrated.
Q = ot.Dirac(1013.0)
K_s = ot.Dirac(30.0)
DeltaZ = ot.Dirac(5.0)
# Create the joint input distribution.
inputRandomVector = ot.ComposedDistribution([Q, K_s, DeltaZ])
Затем мы создаем выборку Монте-Карло для вывода H. В этом случае это выборка, которая содержит постоянное значение.
nbobs = 100
inputSample = inputRandomVector.getSample(nbobs)
outputH = g(inputSample)
Затем мы генерируем наблюдение шума и добавить его к выходу модели.
sigmaObservationNoiseH = 0.1 # (m)
noiseH = ot.Normal(0.,sigmaObservationNoiseH)
sampleNoiseH = noiseH.getSample(nbobs)
Hobs = outputH + sampleNoiseH
Наконец, мы определяем значение опорных значений тета-параметра.
QInitial = 1000.
KsInitial = 20.
DeltaZInitial = 2.
thetaPrior = ot.Point([QInitial,KsInitial,DeltaZInitial])
Тогда мы подошли к сути примера. Следующее утверждение создает калиброванную функцию из модели.
calibratedIndices = [0,1,2]
mycf = ot.ParametricFunction(g, calibratedIndices, thetaPrior)
Следовательно, калиброванная функция не имеет ввода, и поэтому мы устанавливаем пустой список в качестве входного аргумента, чтобы проверить ее работу.
>>> print(mycf([]))
[3.56855]
Для конструктора класса требуется образец inputObservations
:
LinearLeastSquaresCalibration(model, inputObservations, outputObservations, candidate, methodName)
Однако в этом случае у нас нет такой входной выборки. Как я могу использовать калибровочный инструмент?