Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
9 / 9
CRAP
100.00% covered (success)
100.00%
1 / 1
WeibullDistribution
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
9 / 9
11
100.00% covered (success)
100.00%
1 / 1
 getPdf
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getCdf
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 getMean
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getMedian
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getVariance
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getStandardDeviation
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getMode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSkewness
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 getEntropy
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\Math\Stochastic\Distribution
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\Math\Stochastic\Distribution;
16
17use phpOMS\Math\Functions\Gamma;
18
19/**
20 * Weibull distribution.
21 *
22 * @package phpOMS\Math\Stochastic\Distribution
23 * @license OMS License 2.0
24 * @link    https://jingga.app
25 * @since   1.0.0
26 */
27final class WeibullDistribution
28{
29    /**
30     * Get probability density function.
31     *
32     * @param float $x      Value x
33     * @param float $lambda Scale lambda
34     * @param float $k      Shape k
35     *
36     * @return float
37     *
38     * @since 1.0.0
39     */
40    public static function getPdf(float $x, float $lambda, float $k) : float
41    {
42        return $x < 0.0
43            ? 0.0
44            : $k / $lambda * \pow($x / $lambda, $k - 1) * \exp(-($x / $lambda) ** $k);
45    }
46
47    /**
48     * Get cumulative distribution function.
49     *
50     * @param float $x      Value x
51     * @param float $lambda Scale lambda
52     * @param float $k      Shape k
53     *
54     * @return float
55     *
56     * @since 1.0.0
57     */
58    public static function getCdf(float $x, float $lambda, float $k) : float
59    {
60        return $x < 0.0
61            ? 0.0
62            : 1 - \exp(-($x / $lambda) ** $k);
63    }
64
65    /**
66     * Get mean.
67     *
68     * @param float $lambda Scale lambda
69     * @param float $k      Shape k
70     *
71     * @return float
72     *
73     * @since 1.0.0
74     */
75    public static function getMean(float $lambda, float $k) : float
76    {
77        return $lambda * Gamma::gamma(1 + 1 / $k);
78    }
79
80    /**
81     * Get median.
82     *
83     * @param float $lambda Scale lambda
84     * @param float $k      Shape k
85     *
86     * @return float
87     *
88     * @since 1.0.0
89     */
90    public static function getMedian(float $lambda, float $k) : float
91    {
92        return $lambda * \pow(\log(2), 1 / $k);
93    }
94
95    /**
96     * Get the variance.
97     *
98     * @param float $lambda Scale lambda
99     * @param float $k      Shape k
100     *
101     * @return float
102     *
103     * @since 1.0.0
104     */
105    public static function getVariance(float $lambda, float $k) : float
106    {
107        return $lambda ** 2 * (Gamma::gamma(1 + 2 / $k) - Gamma::gamma(1 + 1 / $k) ** 2);
108    }
109
110    /**
111     * Get the standard deviation.
112     *
113     * @param float $lambda Scale lambda
114     * @param float $k      Shape k
115     *
116     * @return float
117     *
118     * @since 1.0.0
119     */
120    public static function getStandardDeviation(float $lambda, float $k) : float
121    {
122        return \sqrt(self::getVariance($lambda, $k));
123    }
124
125    /**
126     * Get mode.
127     *
128     * @param float $lambda Scale lambda
129     * @param float $k      Shape k
130     *
131     * @return float
132     *
133     * @since 1.0.0
134     */
135    public static function getMode(float $lambda, float $k) : float
136    {
137        return $lambda * \pow(($k - 1) / $k, 1 / $k);
138    }
139
140    /**
141     * Get skewness.
142     *
143     * @param float $lambda Scale lambda
144     * @param float $k      Shape k
145     *
146     * @return float
147     *
148     * @since 1.0.0
149     */
150    public static function getSkewness(float $lambda, float $k) : float
151    {
152        $mu  = self::getMean($lambda, $k);
153        $sig = self::getStandardDeviation($lambda, $k);
154
155        return (Gamma::gamma(1 + 3 / $k) * $lambda ** 3 - 3 * $mu * $sig ** 2 - $mu ** 3)
156            / ($sig ** 3);
157    }
158
159    /**
160     * Get entropy.
161     *
162     * @param float $lambda Scale lambda
163     * @param float $k      Shape k
164     *
165     * @return float
166     *
167     * @since 1.0.0
168     */
169    public static function getEntropy(float $lambda, float $k) : float
170    {
171        $gamma = 0.57721566490153286060651209008240243104215933593992;
172
173        return $gamma * (1 - 1 / $k) + \log($lambda / $k) + 1;
174    }
175}