From 040aebd836e0ef162e5e7e8b7b4d5e79a3b9f227 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 25 Dec 2015 18:41:48 +0100 Subject: [PATCH] Preparing for differentiation and integration --- Math/Differential/FiniteDifference.php | 31 ++++++++++++++++++++++++++ Math/Integral/Gauss.php | 0 Math/Parser/Evaluator.php | 0 3 files changed, 31 insertions(+) create mode 100644 Math/Differential/FiniteDifference.php create mode 100644 Math/Integral/Gauss.php create mode 100644 Math/Parser/Evaluator.php 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