diff --git a/src/theoretical/transiogram/exponential.jl b/src/theoretical/transiogram/exponential.jl index f454781..c629bbb 100644 --- a/src/theoretical/transiogram/exponential.jl +++ b/src/theoretical/transiogram/exponential.jl @@ -28,5 +28,6 @@ function (t::ExponentialTransiogram)(h) h′, r′ = unitless(h, r) v = 1 - exp(-3(h′ / r′)) T = typeof(p[1] * v) - SMatrix{L,L}(i == j ? T(1 - (1 - p[j]) * v) : T((p[j] * v)) for i in 1:L, j in 1:L) + ϵ = T(1e-6) # add small eps for numerical stability + SMatrix{L,L}(i == j ? T(1 - (1 - p[j]) * v) - ϵ * (L - 1) : T(p[j] * v) + ϵ for i in 1:L, j in 1:L) end diff --git a/src/theoretical/transiogram/gaussian.jl b/src/theoretical/transiogram/gaussian.jl index 0028a7a..77b8c1c 100644 --- a/src/theoretical/transiogram/gaussian.jl +++ b/src/theoretical/transiogram/gaussian.jl @@ -28,5 +28,6 @@ function (t::GaussianTransiogram)(h) h′, r′ = unitless(h, r) v = 1 - exp(-3(h′ / r′)^2) T = typeof(p[1] * v) - SMatrix{L,L}(i == j ? T(1 - (1 - p[j]) * v) : T((p[j] * v)) for i in 1:L, j in 1:L) + ϵ = T(1e-6) # add small eps for numerical stability + SMatrix{L,L}(i == j ? T(1 - (1 - p[j]) * v) - ϵ * (L - 1) : T(p[j] * v) + ϵ for i in 1:L, j in 1:L) end diff --git a/src/theoretical/transiogram/linear.jl b/src/theoretical/transiogram/linear.jl index 69abcab..5821e41 100644 --- a/src/theoretical/transiogram/linear.jl +++ b/src/theoretical/transiogram/linear.jl @@ -26,8 +26,11 @@ function (t::LinearTransiogram)(h) p = t.prop L = length(p) h′, r′ = unitless(h, r) + v = h′ / r′ + T = typeof(p[1] * v) + ϵ = T(1e-6) # add small eps for numerical stability SMatrix{L,L}( - i == j ? (h′ < r′) * (1 - (1 - p[j]) * (h′ / r′)) + (h′ ≥ r′) * p[j] : - (h′ < r′) * (p[j] * (h′ / r′)) + (h′ ≥ r′) * p[j] for i in 1:L, j in 1:L + i == j ? (h′ < r′) * T(1 - (1 - p[j]) * v) + (h′ ≥ r′) * T(p[j]) - ϵ * (L - 1) : + (h′ < r′) * T(p[j] * v) + (h′ ≥ r′) * T(p[j]) + ϵ for i in 1:L, j in 1:L ) end diff --git a/src/theoretical/transiogram/spherical.jl b/src/theoretical/transiogram/spherical.jl index 1292974..2e8f087 100644 --- a/src/theoretical/transiogram/spherical.jl +++ b/src/theoretical/transiogram/spherical.jl @@ -28,8 +28,9 @@ function (t::SphericalTransiogram)(h) h′, r′ = unitless(h, r) v = 3(h′ / r′) / 2 - (h′ / r′)^3 / 2 T = typeof(p[1] * v) + ϵ = T(1e-6) # add small eps for numerical stability SMatrix{L,L}( - i == j ? (h′ < r′) * T(1 - (1 - p[j]) * v) + (h′ ≥ r′) * T(p[j]) : (h′ < r′) * T((p[j] * v)) + (h′ ≥ r′) * T(p[j]) - for i in 1:L, j in 1:L + i == j ? (h′ < r′) * T(1 - (1 - p[j]) * v) + (h′ ≥ r′) * T(p[j]) - ϵ * (L - 1) : + (h′ < r′) * T(p[j] * v) + (h′ ≥ r′) * T(p[j]) + ϵ for i in 1:L, j in 1:L ) end