Как выполнить калибровку с помощью OpenTURNS без наблюдаемых входов? - PullRequest
1 голос
/ 28 февраля 2020

В общем, у меня есть модель 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)

Однако в этом случае у нас нет такой входной выборки. Как я могу использовать калибровочный инструмент?

1 Ответ

1 голос
/ 28 февраля 2020

Поскольку у нас нет входного наблюдения, мы создаем пустой Sample в качестве входного.

emptyInputObservations = [[]]*len(Hobs)
algo = ot.LinearLeastSquaresCalibration(mycf, emptyInputObservations, Hobs, thetaPrior, "SVD")

Другие классы NonLinearLeastSquaresCalibration, GaussianLinearCalibration и GaussianNonLinearCalibration работают аналогичным образом.

...