Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Shared\Trend;
   4  
   5  class LogarithmicBestFit extends BestFit
   6  {
   7      /**
   8       * Algorithm type to use for best-fit
   9       * (Name of this Trend class).
  10       *
  11       * @var string
  12       */
  13      protected $bestFitType = 'logarithmic';
  14  
  15      /**
  16       * Return the Y-Value for a specified value of X.
  17       *
  18       * @param float $xValue X-Value
  19       *
  20       * @return float Y-Value
  21       */
  22      public function getValueOfYForX($xValue)
  23      {
  24          return $this->getIntersect() + $this->getSlope() * log($xValue - $this->xOffset);
  25      }
  26  
  27      /**
  28       * Return the X-Value for a specified value of Y.
  29       *
  30       * @param float $yValue Y-Value
  31       *
  32       * @return float X-Value
  33       */
  34      public function getValueOfXForY($yValue)
  35      {
  36          return exp(($yValue - $this->getIntersect()) / $this->getSlope());
  37      }
  38  
  39      /**
  40       * Return the Equation of the best-fit line.
  41       *
  42       * @param int $dp Number of places of decimal precision to display
  43       *
  44       * @return string
  45       */
  46      public function getEquation($dp = 0)
  47      {
  48          $slope = $this->getSlope($dp);
  49          $intersect = $this->getIntersect($dp);
  50  
  51          return 'Y = ' . $slope . ' * log(' . $intersect . ' * X)';
  52      }
  53  
  54      /**
  55       * Execute the regression and calculate the goodness of fit for a set of X and Y data values.
  56       *
  57       * @param float[] $yValues The set of Y-values for this regression
  58       * @param float[] $xValues The set of X-values for this regression
  59       */
  60      private function logarithmicRegression(array $yValues, array $xValues, bool $const): void
  61      {
  62          $adjustedYValues = array_map(
  63              function ($value) {
  64                  return ($value < 0.0) ? 0 - log(abs($value)) : log($value);
  65              },
  66              $yValues
  67          );
  68  
  69          $this->leastSquareFit($adjustedYValues, $xValues, $const);
  70      }
  71  
  72      /**
  73       * Define the regression and calculate the goodness of fit for a set of X and Y data values.
  74       *
  75       * @param float[] $yValues The set of Y-values for this regression
  76       * @param float[] $xValues The set of X-values for this regression
  77       * @param bool $const
  78       */
  79      public function __construct($yValues, $xValues = [], $const = true)
  80      {
  81          parent::__construct($yValues, $xValues);
  82  
  83          if (!$this->error) {
  84              $this->logarithmicRegression($yValues, $xValues, (bool) $const);
  85          }
  86      }
  87  }