Source code for chaospy.distributions.collection.wald

"""Wald distribution."""
import numpy
from scipy import special
import chaospy

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class wald(SimpleDistribution):
    """Wald distribution."""

    def __init__(self, mu):
        super(wald, self).__init__(dict(mu=mu))

    def _pdf(self, x, mu):
        out = numpy.zeros(x.shape)
        indices = x > 0
        out[indices] = 1.0 / numpy.sqrt(2 * numpy.pi * x[indices])
        out[indices] *= numpy.exp(
            -((1 - mu * x[indices]) ** 2.0) / (2 * x[indices] * mu**2.0)
        )
        return out

    def _cdf(self, x, mu):
        trm1 = 1.0 / mu - x
        trm2 = 1.0 / mu + x
        isqx = numpy.full_like(x, numpy.inf)
        indices = x > 0
        isqx[indices] = 1.0 / numpy.sqrt(x[indices])
        out = 1.0 - special.ndtr(isqx * trm1)
        out -= numpy.exp(2.0 / mu) * special.ndtr(-isqx * trm2)
        out = numpy.where(x == numpy.inf, 1, out)
        out = numpy.where(x == -numpy.inf, 0, out)
        return out

    def _lower(self, mu):
        return 0.0

    def _upper(self, mu):
        qloc = numpy.repeat(1 - 1e-12, mu.size)
        out = chaospy.approximate_inverse(
            distribution=self,
            idx=0,
            qloc=qloc,
            parameters=dict(mu=mu),
            bounds=(0.0, 60 + numpy.e ** (1.0 / (mu + 0.1))),
            tolerance=1e-15,
        )
        return out


[docs]class Wald(ShiftScaleDistribution): """ Wald distribution. Reciprocal inverse Gaussian distribution. Args: mu (float, Distribution): Mean of the normal distribution scale (float, Distribution): Scaling parameter shift (float, Distribution): Location parameter Examples: >>> distribution = chaospy.Wald(0.5) >>> distribution Wald(0.5) >>> uloc = numpy.linspace(0, 1, 6) >>> uloc array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]) >>> xloc = distribution.inv(uloc) >>> xloc.round(3) array([ 0. , 1.416, 2.099, 2.94 , 4.287, 54.701]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([0. , 0.297, 0.275, 0.2 , 0.105, 0. ]) >>> distribution.sample(4).round(3) array([0.61 , 1.401, 1.274, 2.115]) """
[docs] def __init__(self, mu=1, scale=1, shift=0): super(Wald, self).__init__( dist=wald(mu), scale=scale, shift=shift, repr_args=[mu], )