PluginProbe
TablePress – Tables in WordPress made easy / 3.4
TablePress – Tables in WordPress made easy v3.4
3.4 3.3.4 3.3.3 3.3.2 3.3.1 trunk 1.12 1.14 1.9.2 2.0.4 2.1.7 2.1.8 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3 2.3.1 2.3.2 2.4 2.4.1 2.4.2 2.4.3 All 45 releases
tablepress / libraries / vendor / PhpSpreadsheet / Shared / Trend / ExponentialBestFit.php

ExponentialBestFit.php in TablePress – Tables in WordPress made easy 3.4, at libraries/vendor/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php

109 lines 2.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace TablePress\PhpOffice\PhpSpreadsheet\Shared\Trend;
4
5 class ExponentialBestFit extends BestFit
6 {
7 /**
8 * Algorithm type to use for best-fit
9 * (Name of this Trend class).
10 */
11 protected string $bestFitType = 'exponential';
12
13 /**
14 * Return the Y-Value for a specified value of X.
15 *
16 * @param float $xValue X-Value
17 *
18 * @return float Y-Value
19 */
20 public function getValueOfYForX(float $xValue): float
21 {
22 return $this->getIntersect() * $this->getSlope() ** ($xValue - $this->xOffset);
23 }
24
25 /**
26 * Return the X-Value for a specified value of Y.
27 *
28 * @param float $yValue Y-Value
29 *
30 * @return float X-Value
31 */
32 public function getValueOfXForY(float $yValue): float
33 {
34 return log(($yValue + $this->yOffset) / $this->getIntersect()) / log($this->getSlope());
35 }
36
37 /**
38 * Return the Equation of the best-fit line.
39 *
40 * @param int $dp Number of places of decimal precision to display
41 */
42 public function getEquation(int $dp = 0): string
43 {
44 $slope = $this->getSlope($dp);
45 $intersect = $this->getIntersect($dp);
46
47 return 'Y = ' . $intersect . ' * ' . $slope . '^X';
48 }
49
50 /**
51 * Return the Slope of the line.
52 *
53 * @param int $dp Number of places of decimal precision to display
54 */
55 public function getSlope(int $dp = 0): float
56 {
57 if ($dp != 0) {
58 return round(exp($this->slope), $dp);
59 }
60
61 return exp($this->slope);
62 }
63
64 /**
65 * Return the Value of X where it intersects Y = 0.
66 *
67 * @param int $dp Number of places of decimal precision to display
68 */
69 public function getIntersect(int $dp = 0): float
70 {
71 if ($dp != 0) {
72 return round(exp($this->intersect), $dp);
73 }
74
75 return exp($this->intersect);
76 }
77
78 /**
79 * Execute the regression and calculate the goodness of fit for a set of X and Y data values.
80 *
81 * @param float[] $yValues The set of Y-values for this regression
82 * @param float[] $xValues The set of X-values for this regression
83 */
84 private function exponentialRegression(array $yValues, array $xValues, bool $const): void
85 {
86 $adjustedYValues = array_map(
87 fn ($value): float => ($value < 0.0) ? 0 - log(abs($value)) : log($value),
88 $yValues
89 );
90
91 $this->leastSquareFit($adjustedYValues, $xValues, $const);
92 }
93
94 /**
95 * Define the regression and calculate the goodness of fit for a set of X and Y data values.
96 *
97 * @param float[] $yValues The set of Y-values for this regression
98 * @param float[] $xValues The set of X-values for this regression
99 */
100 public function __construct(array $yValues, array $xValues = [], bool $const = true)
101 {
102 parent::__construct($yValues, $xValues);
103
104 if (!$this->error) {
105 $this->exponentialRegression($yValues, $xValues, (bool) $const);
106 }
107 }
108 }
109