diff --git a/Math/Differential/FiniteDifference.php b/Math/Differential/FiniteDifference.php new file mode 100644 index 000000000..75ec8090a --- /dev/null +++ b/Math/Differential/FiniteDifference.php @@ -0,0 +1,31 @@ + $variables['x'] + self::EPSILON]) - Evaluator::evaluate($formula, ['x' => $variables['x']])) / self::EPSILON; + } + + public static function getSymmetricDifferenceQuotient(\string $formula, array $variables, \int $derivative = 1) : \float + { + return (Evaluator::evaluate($formula, ['x' => $variables['x'] + self::EPSILON]) - Evaluator::evaluate($formula, ['x' => $variables['x'] - self::EPSILON])) / (2 * self::EPSILON); + } + + public static function getFivePointStencil(\string $formula, array $variables, \int $derivative = 1) : \float + { + if ($derivative === 1) { + return (-Evaluator::evaluate($formula, ['x' => $variables['x'] + 2 * self::EPSILON]) + 8 * Evaluator::evaluate($formula, ['x' => $variables['x'] + self::EPSILON]) - 8 * Evaluator::evaluate($formula, ['x' => $variables['x'] - self::EPSILON]) + Evaluator::evaluate($formula, ['x' => $variables['x'] - 2 * self::EPSILON])) / (12 * self::EPSILON); + } elseif ($derivative === 2) { + return (-Evaluator::evaluate($formula, ['x' => $variables['x'] + 2 * self::EPSILON]) + 16 * Evaluator::evaluate($formula, ['x' => $variables['x'] + self::EPSILON]) - 30 * Evaluator::evaluate($formula, ['x' => $variables['x']]) + 16 * Evaluator::evaluate($formula, ['x' => $variables['x'] - self::EPSILON]) - Evaluator::evaluate($formula, ['x' => $variables['x'] - 2 * self::EPSILON])) / (12 * self::EPSILON ** 2); + } elseif ($derivative === 3) { + return (Evaluator::evaluate($formula, ['x' => $variables['x'] + 2 * self::EPSILON]) - 2 * Evaluator::evaluate($formula, ['x' => $variables['x'] + self::EPSILON]) + 2 * Evaluator::evaluate($formula, ['x' => $variables['x'] - self::EPSILON]) - Evaluator::evaluate($formula, ['x' => $variables['x'] - 2 * self::EPSILON])) / (2 * self::EPSILON ** 3); + } elseif ($derivative === 4) { + return (Evaluator::evaluate($formula, ['x' => $variables['x'] + 2 * self::EPSILON]) - 4 * Evaluator::evaluate($formula, ['x' => $variables['x'] + self::EPSILON]) + 6 * Evaluator::evaluate($formula, ['x' => $variables['x']]) - 4 * Evaluator::evaluate($formula, ['x' => $variables['x'] - self::EPSILON]) + Evaluator::evaluate($formula, ['x' => $variables['x'] - 2 * self::EPSILON])) / (self::EPSILON ** 4); + } + + throw new \Exception('Derivative too high'); + } +} diff --git a/Math/Integral/Gauss.php b/Math/Integral/Gauss.php new file mode 100644 index 000000000..e69de29bb diff --git a/Math/Parser/Evaluator.php b/Math/Parser/Evaluator.php new file mode 100644 index 000000000..e69de29bb