SPDE for Markovian Model¶
In [1]:
import gstlearn as gl
import gstlearn.plot as gp
import numpy as np
import matplotlib.pyplot as plt
In [2]:
Markov = True
In [3]:
dx = [0.5, 0.5]
nx = [400, 400]
db = gl.DbGrid.create(nx, dx)
In [4]:
mesh = gl.MeshETurbo(db, False)
In [5]:
scale = 1
sill = 5.0
param = 2.0
ranges = [1.8 * scale, 1.0 * scale]
angles = [30.0, 0]
if Markov:
model = gl.Model.createFromParam(
gl.ECov.MARKOV, ranges=ranges, angles=angles, sill=sill, flagRange=False
)
cova = model.getCovAniso(0)
cova.setMarkovCoeffsBySquaredPolynomials([1, -1.5], [1, -1], 0.001)
# coeffs = np.array(cova.getMarkovCoeffs())
# for i in range(len(coeffs)):
# coeffs[i]*= scale**(2*i)
# cova.setMarkovCoeffs(coeffs)
else:
model = gl.Model.createFromParam(
gl.ECov.MATERN,
param=param,
ranges=ranges,
sill=sill,
angles=angles,
flagRange=False,
)
model
Out[5]:
Model characteristics
=====================
Space dimension = 2
Number of variable(s) = 1
Number of basic structure(s) = 1
Number of drift function(s) = 0
Number of drift equation(s) = 0
Covariance Part
---------------
Markov (Third Parameter = 1)
- Sill = 5.000
- Ranges = 12.471 6.928
- Theo. Ranges = 1.800 1.000
- Angles = 30.000 0.000
- Rotation Matrix
[, 0] [, 1]
[ 0,] 0.866 -0.500
[ 1,] 0.500 0.866
Total Sill = 5.000
Known Mean(s) 0.000
In [6]:
Q = gl.PrecisionOp(mesh, model.getCovAniso(0))
In [7]:
indx = int(nx[0] / 2)
indy = int(nx[1] / 2)
ind = indy + nx[1] * indx
covy = np.array(Q.computeCov(ind)).reshape(nx)
In [8]:
xx = np.arange(len(covy) / 2) * dx[0]
if not Markov:
covM = [model.evalCov(gl.SpacePoint([0, 0]), gl.SpacePoint([i, 0])) for i in xx]
plt.plot(xx, covM, "--", label="Covariance")
plt.plot(
xx, covy[indx, indy : (indy + nx[1])], label="discretized"
) # /covy[indx,indx])
covy[indx, indx]
ax = plt.legend()
plt.show()
i = plt.imshow(covy.reshape(nx), origin="lower")
In [9]:
dbg = gl.DbGrid.create(nx, dx)
x = Q.simulateOne()
dbg["simu"] = x
res = gp.plot(dbg)
aa = plt.axis("equal")
In [10]:
N = 2**8
cova = model.getCovAniso(0)
mH1 = 3.5 * np.max(cova.getRanges())
mH2 = 3.5 * np.max(cova.getRanges())
result = np.array(cova.evalCovFFT([mH1, mH2], N).getValues())
res = np.array(result).reshape((N, N))
i = plt.imshow(res, extent=[-mH1, mH1, -mH2, mH2], origin="lower")
c = plt.colorbar()
In [11]:
X1 = np.linspace(-mH1, mH1, N)
X2 = np.linspace(-mH2, mH2, N)
plt.plot(X1, res[int(N / 2), :], label="FFT")
uu = covy[indx, indy : (indy + 100)]
plt.plot(np.arange(len(uu)) * dx[0], uu, "--", label="Discretized covariance")
ax = plt.legend()
In [12]:
print(round(res[int(N / 2), int(N / 2)] / uu[0], 3))
1.009