MathPHP\NumericalAnalysis\NumericalDifferentiation\SecondDerivativeMidpointFormula::differentiate PHP Method

differentiate() public static method

The Second Derivative Midpoint Formula requires we supply 3 points that are evenly spaced apart, and that our target equals the x-components of the midpoint. Example: differentiate(2, function($x) {return $x**2;}, 0, 4 ,3) will produce a set of arrays by evaluating the callback at 3 evenly spaced points between 0 and 4. Then, this array will be used in our approximation. Second Derivative Midpoint Formula: 1 h² f″(x₀) = - [f(x₀-h) - 2f(x₀) + f(x₀+h)] - - f⁽⁴⁾(ζ) h² 12 where ζ lies between x₀ - h and x₀ + h
public static differentiate ( numbers $target, $source, $args ) : number
$target numbers The value at which we are approximating the derivative
$source The source of our approximation. Should be either a callback function or a set of arrays. Each array (point) contains precisely two numbers, an x and y. Example array: [[1,2], [2,3], [3,4]]. Example callback: function($x) {return $x**2;}
return number The approximation of f'($target), i.e. the derivative of our input at our target point
    public static function differentiate($target, $source, ...$args)
    {
        // Get an array of points from our $source argument
        $points = self::getPoints($source, $args);
        // Validate input, sort points, make sure spacing is constant, and make
        // sure our target is contained in an interval supplied by our $source
        self::validate($points, $degree = 3);
        $sorted = self::sort($points);
        self::isSpacingConstant($sorted);
        // Descriptive constants
        $x = self::X;
        $y = self::Y;
        // Initialize
        $n = count($sorted);
        $h = ($sorted[2][$x] - $sorted[0][$x]) / 2;
        /*
         *          1                                h²
         * f″(x₀) = - [f(x₀-h) - 2f(x₀) + f(x₀+h)] - - f⁽⁴⁾(ζ)
         *          h²                               12
         *
         *     where ζ lies between x₀ - h and x₀ + h
         */
        if ($sorted[1][$x] == $target) {
            $f⟮x₀⧿h⟯ = $sorted[0][$y];
            $f⟮x₀⟯ = $sorted[1][$y];
            $f⟮x₀⧾h⟯ = $sorted[2][$y];
            $derivative = ($f⟮x₀⧿h⟯ - 2 * $f⟮x₀⟯ + $f⟮x₀⧾h⟯) / $h ** 2;
        } else {
            throw new Exception\BadDataException('Your target must be the midpoint of your input');
        }
        return $derivative;
    }
SecondDerivativeMidpointFormula