1. Go to this page and download the library: Download markrogoyski/math-php library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use MathPHP\Finance;
// Financial payment for a loan or annuity with compound interest
$rate = 0.035 / 12; // 3.5% interest paid at the end of every month
$periods = 30 * 12; // 30-year mortgage
$present_value = 265000; // Mortgage note of $265,000.00
$future_value = 0;
$beginning = false; // Adjust the payment to the beginning or end of the period
$pmt = Finance::pmt($rate, $periods, $present_value, $future_value, $beginning);
// Interest on a financial payment for a loan or annuity with compound interest.
$period = 1; // First payment period
$ipmt = Finance::ipmt($rate, $period, $periods, $present_value, $future_value, $beginning);
// Principle on a financial payment for a loan or annuity with compound interest
$ppmt = Finance::ppmt($rate, $period, $periods, $present_value, $future_value = 0, $beginning);
// Number of payment periods of an annuity.
$periods = Finance::periods($rate, $payment, $present_value, $future_value, $beginning);
// Annual Equivalent Rate (AER) of an annual percentage rate (APR)
$nominal = 0.035; // APR 3.5% interest
$periods = 12; // Compounded monthly
$aer = Finance::aer($nominal, $periods);
// Annual nominal rate of an annual effective rate (AER)
$nomial = Finance::nominal($aer, $periods);
// Future value for a loan or annuity with compound interest
$payment = 1189.97;
$fv = Finance::fv($rate, $periods, $payment, $present_value, $beginning)
// Present value for a loan or annuity with compound interest
$pv = Finance::pv($rate, $periods, $payment, $future_value, $beginning)
// Net present value of cash flows
$values = [-1000, 100, 200, 300, 400];
$npv = Finance::npv($rate, $values);
// Interest rate per period of an annuity
$beginning = false; // Adjust the payment to the beginning or end of the period
$rate = Finance::rate($periods, $payment, $present_value, $future_value, $beginning);
// Internal rate of return
$values = [-100, 50, 40, 30];
$irr = Finance::irr($values); // Rate of return of an initial investment of $100 with returns of $50, $40, and $30
// Modified internal rate of return
$finance_rate = 0.05; // 5% financing
$reinvestment_rate = 0.10; // reinvested at 10%
$mirr = Finance::mirr($values, $finance_rate); // rate of return of an initial investment of $100 at 5% financing with returns of $50, $40, and $30 reinvested at 10%
// Discounted payback of an investment
$values = [-1000, 100, 200, 300, 400, 500];
$rate = 0.1;
$payback = Finance::payback($values, $rate); // The payback period of an investment with a $1,000 investment and future returns of $100, $200, $300, $400, $500 and a discount rate of 0.10
// Profitability index
$values = [-100, 50, 50, 50];
$profitability_index = Finance::profitabilityIndex($values, $rate); // The profitability index of an initial $100 investment with future returns of $50, $50, $50 with a 10% discount rate
use MathPHP\LinearAlgebra\Matrix;
use MathPHP\LinearAlgebra\MatrixFactory;
// Create an m × n matrix from an array of arrays
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
$A = MatrixFactory::create($matrix);
// Basic matrix data
$array = $A->getMatrix(); // Original array of arrays
$rows = $A->getM(); // number of rows
$cols = $A->getN(); // number of columns
// Basic matrix element getters (zero-based indexing)
$row = $A->getRow(2);
$col = $A->getColumn(2);
$Aᵢⱼ = $A->get(2, 2);
$Aᵢⱼ = $A[2][2];
// Row operations
[$mᵢ, $mⱼ, $k] = [1, 2, 5];
$R = $A->rowInterchange($mᵢ, $mⱼ);
$R = $A->rowExclude($mᵢ); // Exclude row $mᵢ
$R = $A->rowMultiply($mᵢ, $k); // Multiply row mᵢ by k
$R = $A->rowDivide($mᵢ, $k); // Divide row mᵢ by k
$R = $A->rowAdd($mᵢ, $mⱼ, $k); // Add k * row mᵢ to row mⱼ
$R = $A->rowAddScalar($mᵢ, $k); // Add k to each item of row mᵢ
$R = $A->rowAddVector($mᵢ, $V); // Add Vector V to row mᵢ
$R = $A->rowSubtract($mᵢ, $mⱼ, $k); // Subtract k * row mᵢ from row mⱼ
$R = $A->rowSubtractScalar($mᵢ, $k); // Subtract k from each item of row mᵢ
// Column operations
[$nᵢ, $nⱼ, $k] = [1, 2, 5];
$R = $A->columnInterchange($nᵢ, $nⱼ);
$R = $A->columnExclude($nᵢ); // Exclude column $nᵢ
$R = $A->columnMultiply($nᵢ, $k); // Multiply column nᵢ by k
$R = $A->columnAdd($nᵢ, $nⱼ, $k); // Add k * column nᵢ to column nⱼ
$R = $A->columnAddVector($nᵢ, $V); // Add Vector V to column nᵢ
// Matrix augmentations - return a new Matrix
$⟮A∣B⟯ = $A->augment($B); // Augment on the right - standard augmentation
$⟮A∣I⟯ = $A->augmentIdentity(); // Augment with the identity matrix
$⟮A∣B⟯ = $A->augmentBelow($B);
$⟮A∣B⟯ = $A->augmentAbove($B);
$⟮B∣A⟯ = $A->augmentLeft($B);
// Matrix arithmetic operations - return a new Matrix
$A+B = $A->add($B);
$A⊕B = $A->directSum($B);
$A⊕B = $A->kroneckerSum($B);
$A−B = $A->subtract($B);
$AB = $A->multiply($B);
$2A = $A->scalarMultiply(2);
$A/2 = $A->scalarDivide(2);
$−A = $A->negate();
$A∘B = $A->hadamardProduct($B);
$A⊗B = $A->kroneckerProduct($B);
// Matrix operations - return a new Matrix
$Aᵀ = $A->transpose();
$D = $A->diagonal();
$A⁻¹ = $A->inverse();
$Mᵢⱼ = $A->minorMatrix($mᵢ, $nⱼ); // Square matrix with row mᵢ and column nⱼ removed
$Mk = $A->leadingPrincipalMinor($k); // kᵗʰ-order leading principal minor
$CM = $A->cofactorMatrix();
$B = $A->meanDeviation(); // optional parameter to specify data direction (variables in 'rows' or 'columns')
$S = $A->covarianceMatrix(); // optional parameter to specify data direction (variables in 'rows' or 'columns')
$adj⟮A⟯ = $A->adjugate();
$Mᵢⱼ = $A->submatrix($mᵢ, $nᵢ, $mⱼ, $nⱼ) // Submatrix of A from row mᵢ, column nᵢ to row mⱼ, column nⱼ
$H = $A->householder();
// Matrix value operations - return a value
$tr⟮A⟯ = $A->trace();
$|A| = $a->det(); // Determinant
$Mᵢⱼ = $A->minor($mᵢ, $nⱼ); // First minor
$Cᵢⱼ = $A->cofactor($mᵢ, $nⱼ);
$rank⟮A⟯ = $A->rank();
// Matrix vector operations - return a new Vector
$AB = $A->vectorMultiply($X₁);
$M = $A->rowSums();
$M = $A->columnSums();
$M = $A->rowMeans();
$M = $A->columnMeans();
// Matrix norms - return a value
$‖A‖₁ = $A->oneNorm();
$‖A‖F = $A->frobeniusNorm(); // Hilbert–Schmidt norm
$‖A‖∞ = $A->infinityNorm();
$max = $A->maxNorm();
// Matrix reductions
$ref = $A->ref(); // Matrix in row echelon form
$rref = $A->rref(); // Matrix in reduced row echelon form
// Matrix decompositions
// LU decomposition
$LU = $A->luDecomposition();
$L = $LU->L; // lower triangular matrix
$U = $LU->U; // upper triangular matrix
$P = $LU-P; // permutation matrix
// QR decomposition
$QR = $A->qrDecomposition();
$Q = $QR->Q; // orthogonal matrix
$R = $QR->R; // upper triangular matrix
// SVD (Singular Value Decomposition)
$SVD = $A->svd();
$U = $A->U; // m x m orthogonal matrix
$V = $A->V; // n x n orthogonal matrix
$S = $A->S; // m x n diagonal matrix of singular values
$D = $A->D; // Vector of diagonal elements from S
// Crout decomposition
$LU = $A->croutDecomposition();
$L = $LU->L; // lower triangular matrix
$U = $LU->U; // normalized upper triangular matrix
// Cholesky decomposition
$LLᵀ = $A->choleskyDecomposition();
$L = $LLᵀ->L; // lower triangular matrix
$LT = $LLᵀ->LT; // transpose of lower triangular matrix
// Eigenvalues and eigenvectors
$eigenvalues = $A->eigenvalues(); // array of eigenvalues
$eigenvecetors = $A->eigenvectors(); // Matrix of eigenvectors
// Solve a linear system of equations: Ax = b
$b = new Vector(1, 2, 3);
$x = $A->solve($b);
// Map a function over each element
$func = function($x) {
return $x * 2;
};
$R = $A->map($func); // using closure
$R = $A->map('abs'); // using callable
// Map a function over each row
$array = $A->mapRows('array_reverse'); // using callable returns matrix-like array of arrays
$array = $A->mapRows('array_sum'); // using callable returns array of aggregate calculations
// Walk maps a function to all values without mutation or returning a value
$A->walk($func);
// Matrix comparisons
$bool = $A->isEqual($B);
// Matrix properties - return a bool
$bool = $A->isSquare();
$bool = $A->isSymmetric();
$bool = $A->isSkewSymmetric();
$bool = $A->isSingular();
$bool = $A->isNonsingular(); // Same as isInvertible
$bool = $A->isInvertible(); // Same as isNonsingular
$bool = $A->isPositiveDefinite();
$bool = $A->isPositiveSemidefinite();
$bool = $A->isNegativeDefinite();
$bool = $A->isNegativeSemidefinite();
$bool = $A->isLowerTriangular();
$bool = $A->isUpperTriangular();
$bool = $A->isTriangular();
$bool = $A->isDiagonal();
$bool = $A->isRectangularDiagonal();
$bool = $A->isUpperBidiagonal();
$bool = $A->isLowerBidiagonal();
$bool = $A->isBidiagonal();
$bool = $A->isTridiagonal();
$bool = $A->isUpperHessenberg();
$bool = $A->isLowerHessenberg();
$bool = $A->isOrthogonal();
$bool = $A->isNormal();
$bool = $A->isIdempotent();
$bool = $A->isNilpotent();
$bool = $A->isInvolutory();
$bool = $A->isSignature();
$bool = $A->isRef();
$bool = $A->isRref();
// Other representations of matrix data
$vectors = $A->asVectors(); // array of column vectors
$D = $A->getDiagonalElements(); // array of the diagonal elements
$d = $A->getSuperdiagonalElements(); // array of the superdiagonal elements
$d = $A->getSubdiagonalElements(); // array of the subdiagonal elements
// String representation - Print a matrix
print($A);
/*
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
*/
// PHP Predefined Interfaces
$json = json_encode($A); // JsonSerializable
$Aᵢⱼ = $A[$mᵢ][$nⱼ]; // ArrayAccess
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
// Matrix factory creates most appropriate matrix
$A = MatrixFactory::create($matrix);
// Matrix factory can create a matrix from an array of column vectors
use MathPHP\LinearAlgebra\Vector;
$X₁ = new Vector([1, 4, 7]);
$X₂ = new Vector([2, 5, 8]);
$X₃ = new Vector([3, 6, 9]);
$A = MatrixFactory::createFromVectors([$X₁, $X₂, $X₃]);
// Create from row or column vector
$A = MatrixFactory::createFromRowVector([1, 2, 3]); // 1 × n matrix consisting of a single row of n elements
$A = MatrixFactory::createFromColumnVector([1, 2, 3]); // m × 1 matrix consisting of a single column of m elements
// Specialized matrices
[$m, $n, $k, $angle, $size] = [4, 4, 2, 3.14159, 2];
$identity_matrix = MatrixFactory::identity($n); // Ones on the main diagonal
$zero_matrix = MatrixFactory::zero($m, $n); // All zeros
$ones_matrix = MatrixFactory::one($m, $n); // All ones
$eye_matrix = MatrixFactory::eye($m, $n, $k); // Ones (or other value) on the k-th diagonal
$exchange_matrix = MatrixFactory::exchange($n); // Ones on the reverse diagonal
$downshift_permutation_matrix = MatrixFactory::downshiftPermutation($n); // Permutation matrix that pushes the components of a vector down one notch with wraparound
$upshift_permutation_matrix = MatrixFactory::upshiftPermutation($n); // Permutation matrix that pushes the components of a vector up one notch with wraparound
$diagonal_matrix = MatrixFactory::diagonal([1, 2, 3]); // 3 x 3 diagonal matrix with zeros above and below the diagonal
$hilbert_matrix = MatrixFactory::hilbert($n); // Square matrix with entries being the unit fractions
$vandermonde_matrix = MatrixFactory::vandermonde([1, 2, 3], 4); // 4 x 3 Vandermonde matrix
$random_matrix = MatrixFactory::random($m, $n); // m x n matrix of random integers
$givens_matrix = MatrixFactory::givens($m, $n, $angle, $size); // givens rotation matrix
use MathPHP\LinearAlgebra\Vector;
// Vector
$A = new Vector([1, 2]);
$B = new Vector([2, 4]);
// Basic vector data
$array = $A->getVector();
$n = $A->getN(); // number of elements
$M = $A->asColumnMatrix(); // Vector as an nx1 matrix
$M = $A->asRowMatrix(); // Vector as a 1xn matrix
// Basic vector elements (zero-based indexing)
$item = $A->get(1);
// Vector numeric operations - return a value
$sum = $A->sum();
$│A│ = $A->length(); // same as l2Norm
$max = $A->max();
$min = $A->min();
$A⋅B = $A->dotProduct($B); // same as innerProduct
$A⋅B = $A->innerProduct($B); // same as dotProduct
$A⊥⋅B = $A->perpDotProduct($B);
$radAngle = $A->angleBetween($B); // angle in radians
$degAngle = $A->angleBetween($B, $inDegrees = true); // angle in degrees
$taxicabDistance = $A->l1Distance($B); // same as minkowskiDistance($B, 1)
$euclidDistance = $A->l2Distance($B); // same as minkowskiDistance($B, 2)
$minkowskiDistance = $A->minkowskiDistance($B, $p = 2);
// Vector arithmetic operations - return a Vector
$A+B = $A->add($B);
$A−B = $A->subtract($B);
$A×B = $A->multiply($B);
$A/B = $A->divide($B);
$kA = $A->scalarMultiply($k);
$A/k = $A->scalarDivide($k);
// Vector operations - return a Vector or Matrix
$A⨂B = $A->outerProduct($B); // Same as direct product
$AB = $A->directProduct($B); // Same as outer product
$AxB = $A->crossProduct($B);
$A⨂B = $A->kroneckerProduct($B);
$Â = $A->normalize();
$A⊥ = $A->perpendicular();
$projᵇA = $A->projection($B); // projection of A onto B
$perpᵇA = $A->perp($B); // perpendicular of A on B
// Vector norms - return a value
$l₁norm = $A->l1Norm();
$l²norm = $A->l2Norm();
$pnorm = $A->pNorm();
$max = $A->maxNorm();
// String representation
print($A); // [1, 2]
// PHP standard interfaces
$n = count($A); // Countable
$json = json_encode($A); // JsonSerializable
$Aᵢ = $A[$i]; // ArrayAccess
foreach ($A as $element) { ... } // Iterator
use MathPHP\NumberTheory\Integer;
$n = 225;
// Prime numbers
$bool = Integer::isPrime($n);
$factors = Integer::primeFactorization($n);
// Divisor function
$int = Integer::numberOfDivisors($n);
$int = Integer::sumOfDivisors($n);
// Aliquot sums
$int = Integer::aliquotSum($n); // sum-of-divisors - n
$bool = Integer::isPerfectNumber($n); // n = aliquot sum
$bool = Integer::isDeficientNumber($n); // n > aliquot sum
$bool = Integer::isAbundantNumber($n); // n < aliquot sum
// Totients
$int = Integer::totient($n); // Jordan's totient k=1 (Euler's totient)
$int = Integer::totient($n, 2); // Jordan's totient k=2
$int = Integer::cototient($n); // Cototient
$int = Integer::reducedTotient($n); // Carmichael's function
// Möbius function
$int = Integer::mobius($n);
// Radical/squarefree kernel
$int = Integer::radical($n);
// Squarefree
$bool = Integer::isSquarefree($n);
// Refactorable number
$bool = Integer::isRefactorableNumber($n);
// Sphenic number
$bool = Integer::isSphenicNumber($n);
// Perfect powers
$bool = Integer::isPerfectPower($n);
[$m, $k] = Integer::perfectPower($n);
// Coprime
$bool = Integer::coprime(4, 35);
// Even and odd
$bool = Integer::isEven($n);
$bool = Integer::isOdd($n);
use MathPHP\NumericalAnalysis\Interpolation;
// Interpolation is a method of constructing new data points with the range
// of a discrete set of known data points.
// Each integration method can take input in two ways:
// 1) As a set of points (inputs and outputs of a function)
// 2) As a callback function, and the number of function evaluations to
// perform on an interval between a start and end point.
// Input as a set of points
$points = [[0, 1], [1, 4], [2, 9], [3, 16]];
// Input as a callback function
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 4];
// Lagrange Polynomial
// Returns a function p(x) of x
$p = Interpolation\LagrangePolynomial::interpolate($points); // input as a set of points
$p = Interpolation\LagrangePolynomial::interpolate($f⟮x⟯, $start, $end, $n); // input as a callback function
$p(0) // 1
$p(3) // 16
// Nevilles Method
// More accurate than Lagrange Polynomial Interpolation given the same input
// Returns the evaluation of the interpolating polynomial at the $target point
$target = 2;
$result = Interpolation\NevillesMethod::interpolate($target, $points); // input as a set of points
$result = Interpolation\NevillesMethod::interpolate($target, $f⟮x⟯, $start, $end, $n); // input as a callback function
// Newton Polynomial (Forward)
// Returns a function p(x) of x
$p = Interpolation\NewtonPolynomialForward::interpolate($points); // input as a set of points
$p = Interpolation\NewtonPolynomialForward::interpolate($f⟮x⟯, $start, $end, $n); // input as a callback function
$p(0) // 1
$p(3) // 16
// Natural Cubic Spline
// Returns a piecewise polynomial p(x)
$p = Interpolation\NaturalCubicSpline::interpolate($points); // input as a set of points
$p = Interpolation\NaturalCubicSpline::interpolate($f⟮x⟯, $start, $end, $n); // input as a callback function
$p(0) // 1
$p(3) // 16
// Clamped Cubic Spline
// Returns a piecewise polynomial p(x)
// Input as a set of points
$points = [[0, 1, 0], [1, 4, -1], [2, 9, 4], [3, 16, 0]];
// Input as a callback function
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
$f’⟮x⟯ = function ($x) {
return 2*$x + 2;
};
[$start, $end, $n] = [0, 3, 4];
$p = Interpolation\ClampedCubicSpline::interpolate($points); // input as a set of points
$p = Interpolation\ClampedCubicSpline::interpolate($f⟮x⟯, $f’⟮x⟯, $start, $end, $n); // input as a callback function
$p(0); // 1
$p(3); // 16
// Regular Grid Interpolation
// Returns a scalar
// Points defining the regular grid
$xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
$ys = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
$zs = [110, 111, 112, 113, 114, 115, 116, 117, 118, 119];
// Data on the regular grid in n dimensions
$data = [];
$func = function ($x, $y, $z) {
return 2 * $x + 3 * $y - $z;
};
foreach ($xs as $i => $x) {
foreach ($ys as $j => $y) {
foreach ($zs as $k => $z) {
$data[$i][$j][$k] = $func($x, $y, $z);
}
}
}
// Constructing a RegularGridInterpolator
$rgi = new Interpolation\RegularGridInterpolator([$xs, $ys, $zs], $data, 'linear'); // 'nearest' method also available
// Interpolating coordinates on the regular grid
$coordinates = [2.21, 12.1, 115.9];
$interpolation = $rgi($coordinates); // -75.18
use MathPHP\NumericalAnalysis\NumericalDifferentiation;
// Numerical Differentiation approximates the derivative of a function.
// Each Differentiation method can take input in two ways:
// 1) As a set of points (inputs and outputs of a function)
// 2) As a callback function, and the number of function evaluations to
// perform on an interval between a start and end point.
// Input as a callback function
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
// Three Point Formula
// Returns an approximation for the derivative of our input at our target
// Input as a set of points
$points = [[0, 1], [1, 4], [2, 9]];
$target = 0;
[$start, $end, $n] = [0, 2, 3];
$derivative = NumericalDifferentiation\ThreePointFormula::differentiate($target, $points); // input as a set of points
$derivative = NumericalDifferentiation\ThreePointFormula::differentiate($target, $f⟮x⟯, $start, $end, $n); // input as a callback function
// Five Point Formula
// Returns an approximation for the derivative of our input at our target
// Input as a set of points
$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4, 25]];
$target = 0;
[$start, $end, $n] = [0, 4, 5];
$derivative = NumericalDifferentiation\FivePointFormula::differentiate($target, $points); // input as a set of points
$derivative = NumericalDifferentiation\FivePointFormula::differentiate($target, $f⟮x⟯, $start, $end, $n); // input as a callback function
// Second Derivative Midpoint Formula
// Returns an approximation for the second derivative of our input at our target
// Input as a set of points
$points = [[0, 1], [1, 4], [2, 9];
$target = 1;
[$start, $end, $n] = [0, 2, 3];
$derivative = NumericalDifferentiation\SecondDerivativeMidpointFormula::differentiate($target, $points); // input as a set of points
$derivative = NumericalDifferentiation\SecondDerivativeMidpointFormula::differentiate($target, $f⟮x⟯, $start, $end, $n); // input as a callback function
use MathPHP\NumericalAnalysis\NumericalIntegration;
// Numerical integration approximates the definite integral of a function.
// Each integration method can take input in two ways:
// 1) As a set of points (inputs and outputs of a function)
// 2) As a callback function, and the number of function evaluations to
// perform on an interval between a start and end point.
// Trapezoidal Rule (closed Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16]];
$∫f⟮x⟯dx = NumericalIntegration\TrapezoidalRule::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 4];
$∫f⟮x⟯dx = NumericalIntegration\TrapezoidalRule::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
// Simpsons Rule (closed Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4,3]];
$∫f⟮x⟯dx = NumericalIntegration\SimpsonsRule::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 5];
$∫f⟮x⟯dx = NumericalIntegration\SimpsonsRule::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
// Simpsons 3/8 Rule (closed Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16]];
$∫f⟮x⟯dx = NumericalIntegration\SimpsonsThreeEighthsRule::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 5];
$∫f⟮x⟯dx = NumericalIntegration\SimpsonsThreeEighthsRule::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
// Booles Rule (closed Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16], [4, 25]];
$∫f⟮x⟯dx = NumericalIntegration\BoolesRule::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**3 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 4, 5];
$∫f⟮x⟯dx = NumericalIntegration\BoolesRuleRule::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
// Rectangle Method (open Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16]];
$∫f⟮x⟯dx = NumericalIntegration\RectangleMethod::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 4];
$∫f⟮x⟯dx = NumericalIntegration\RectangleMethod::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
// Midpoint Rule (open Newton-Cotes formula)
$points = [[0, 1], [1, 4], [2, 9], [3, 16]];
$∫f⟮x⟯dx = NumericalIntegration\MidpointRule::approximate($points); // input as a set of points
$f⟮x⟯ = function ($x) {
return $x**2 + 2 * $x + 1;
};
[$start, $end, $n] = [0, 3, 4];
$∫f⟮x⟯dx = NumericalIntegration\MidpointRule::approximate($f⟮x⟯, $start, $end, $n); // input as a callback function
use MathPHP\NumericalAnalysis\RootFinding;
// Root-finding methods solve for a root of a polynomial.
// f(x) = x⁴ + 8x³ -13x² -92x + 96
$f⟮x⟯ = function($x) {
return $x**4 + 8 * $x**3 - 13 * $x**2 - 92 * $x + 96;
};
// Newton's Method
$args = [-4.1]; // Parameters to pass to callback function (initial guess, other parameters)
$target = 0; // Value of f(x) we a trying to solve for
$tol = 0.00001; // Tolerance; how close to the actual solution we would like
$position = 0; // Which element in the $args array will be changed; also serves as initial guess. Defaults to 0.
$x = RootFinding\NewtonsMethod::solve($f⟮x⟯, $args, $target, $tol, $position); // Solve for x where f(x) = $target
// Secant Method
$p₀ = -1; // First initial approximation
$p₁ = 2; // Second initial approximation
$tol = 0.00001; // Tolerance; how close to the actual solution we would like
$x = RootFinding\SecantMethod::solve($f⟮x⟯, $p₀, $p₁, $tol); // Solve for x where f(x) = 0
// Bisection Method
$a = 2; // The start of the interval which contains a root
$b = 5; // The end of the interval which contains a root
$tol = 0.00001; // Tolerance; how close to the actual solution we would like
$x = RootFinding\BisectionMethod::solve($f⟮x⟯, $a, $b, $tol); // Solve for x where f(x) = 0
// Fixed-Point Iteration
// f(x) = x⁴ + 8x³ -13x² -92x + 96
// Rewrite f(x) = 0 as (x⁴ + 8x³ -13x² + 96)/92 = x
// Thus, g(x) = (x⁴ + 8x³ -13x² + 96)/92
$g⟮x⟯ = function($x) {
return ($x**4 + 8 * $x**3 - 13 * $x**2 + 96)/92;
};
$a = 0; // The start of the interval which contains a root
$b = 2; // The end of the interval which contains a root
$p = 0; // The initial guess for our root
$tol = 0.00001; // Tolerance; how close to the actual solution we would like
$x = RootFinding\FixedPointIteration::solve($g⟮x⟯, $a, $b, $p, $tol); // Solve for x where f(x) = 0
use MathPHP\Probability\Combinatorics;
[$n, $x, $k] = [10, 3, 4];
// Factorials
$n! = Combinatorics::factorial($n);
$n‼︎ = Combinatorics::doubleFactorial($n);
$x⁽ⁿ⁾ = Combinatorics::risingFactorial($x, $n);
$x₍ᵢ₎ = Combinatorics::fallingFactorial($x, $n);
$!n = Combinatorics::subfactorial($n);
// Permutations
$nPn = Combinatorics::permutations($n); // Permutations of n things, taken n at a time (same as factorial)
$nPk = Combinatorics::permutations($n, $k); // Permutations of n things, taking only k of them
// Combinations
$nCk = Combinatorics::combinations($n, $k); // n choose k without repetition
$nC′k = Combinatorics::combinations($n, $k, Combinatorics::REPETITION); // n choose k with repetition (REPETITION const = true)
// Central binomial coefficient
$cbc = Combinatorics::centralBinomialCoefficient($n);
// Catalan number
$Cn = Combinatorics::catalanNumber($n);
// Lah number
$L⟮n、k⟯ = Combinatorics::lahNumber($n, $k)
// Multinomial coefficient
$groups = [5, 2, 3];
$divisions = Combinatorics::multinomial($groups);
use MathPHP\Probability\Distribution\Continuous;
$p = 0.1;
// Beta distribution
$α = 1; // shape parameter
$β = 1; // shape parameter
$x = 2;
$beta = new Continuous\Beta($α, $β);
$pdf = $beta->pdf($x);
$cdf = $beta->cdf($x);
$icdf = $beta->inverse($p);
$μ = $beta->mean();
$median = $beta->median();
$mode = $beta->mode();
$σ² = $beta->variance();
// Cauchy distribution
$x₀ = 2; // location parameter
$γ = 3; // scale parameter
$x = 1;
$cauchy = new Continuous\Cauchy(x₀, γ);
$pdf = $cauchy->pdf(x);
$cdf = $cauchy->cdf(x);
$icdf = $cauchy->inverse($p);
$μ = $cauchy->mean();
$median = $cauchy->median();
$mode = $cauchy->mode();
// χ²-distribution (Chi-Squared)
$k = 2; // degrees of freedom
$x = 1;
$χ² = new Continuous\ChiSquared($k);
$pdf = $χ²->pdf($x);
$cdf = $χ²->cdf($x);
$μ = $χ²->mean($x);
$median = $χ²->median();
$mode = $χ²->mode();
$σ² = $χ²->variance();
// Dirac delta distribution
$x = 1;
$dirac = new Continuous\DiracDelta();
$pdf = $dirac->pdf($x);
$cdf = $dirac->cdf($x);
$icdf = $dirac->inverse($p);
$μ = $dirac->mean();
// Exponential distribution
$λ = 1; // rate parameter
$x = 2;
$exponential = new Continuous\Exponential($λ);
$pdf = $exponential->pdf($x);
$cdf = $exponential->cdf($x);
$icdf = $exponential->inverse($p);
$μ = $exponential->mean();
$median = $exponential->median();
$σ² = $exponential->variance();
// F-distribution
$d₁ = 3; // degree of freedom v1
$d₂ = 4; // degree of freedom v2
$x = 2;
$f = new Continuous\F($d₁, $d₂);
$pdf = $f->pdf($x);
$cdf = $f->cdf($x);
$μ = $f->mean();
$mode = $f->mode();
$σ² = $f->variance();
// Gamma distribution
$k = 2; // shape parameter
$θ = 3; // scale parameter
$x = 4;
$gamma = new Continuous\Gamma($k, $θ);
$pdf = $gamma->pdf($x);
$cdf = $gamma->cdf($x);
$μ = $gamma->mean();
$median = $gamma->median();
$mode = $gamma->mode();
$σ² = $gamma->variance();
// Laplace distribution
$μ = 1; // location parameter
$b = 1.5; // scale parameter (diversity)
$x = 1;
$laplace = new Continuous\Laplace($μ, $b);
$pdf = $laplace->pdf($x);
$cdf = $laplace->cdf($x);
$icdf = $laplace->inverse($p);
$μ = $laplace->mean();
$median = $laplace->median();
$mode = $laplace->mode();
$σ² = $laplace->variance();
// Logistic distribution
$μ = 2; // location parameter
$s = 1.5; // scale parameter
$x = 3;
$logistic = new Continuous\Logistic($μ, $s);
$pdf = $logistic->pdf($x);
$cdf = $logistic->cdf($x);
$icdf = $logistic->inverse($p);
$μ = $logistic->mean();
$median = $logistic->median();
$mode = $logistic->mode();
$σ² = $logisitic->variance();
// Log-logistic distribution (Fisk distribution)
$α = 1; // scale parameter
$β = 1; // shape parameter
$x = 2;
$logLogistic = new Continuous\LogLogistic($α, $β);
$pdf = $logLogistic->pdf($x);
$cdf = $logLogistic->cdf($x);
$icdf = $logLogistic->inverse($p);
$μ = $logLogistic->mean();
$median = $logLogistic->median();
$mode = $logLogistic->mode();
$σ² = $logLogistic->variance();
// Log-normal distribution
$μ = 6; // scale parameter
$σ = 2; // location parameter
$x = 4.3;
$logNormal = new Continuous\LogNormal($μ, $σ);
$pdf = $logNormal->pdf($x);
$cdf = $logNormal->cdf($x);
$icdf = $logNormal->inverse($p);
$μ = $logNormal->mean();
$median = $logNormal->median();
$mode = $logNormal->mode();
$σ² = $logNormal->variance();
// Noncentral T distribution
$ν = 50; // degrees of freedom
$μ = 10; // noncentrality parameter
$x = 8;
$noncenetralT = new Continuous\NoncentralT($ν, $μ);
$pdf = $noncenetralT->pdf($x);
$cdf = $noncenetralT->cdf($x);
$μ = $noncenetralT->mean();
// Normal distribution
$σ = 1;
$μ = 0;
$x = 2;
$normal = new Continuous\Normal($μ, $σ);
$pdf = $normal->pdf($x);
$cdf = $normal->cdf($x);
$icdf = $normal->inverse($p);
$μ = $normal->mean();
$median = $normal->median();
$mode = $normal->mode();
$σ² = $normal->variance();
// Pareto distribution
$a = 1; // shape parameter
$b = 1; // scale parameter
$x = 2;
$pareto = new Continuous\Pareto($a, $b);
$pdf = $pareto->pdf($x);
$cdf = $pareto->cdf($x);
$icdf = $pareto->inverse($p);
$μ = $pareto->mean();
$median = $pareto->median();
$mode = $pareto->mode();
$σ² = $pareto->variance();
// Standard normal distribution
$z = 2;
$standardNormal = new Continuous\StandardNormal();
$pdf = $standardNormal->pdf($z);
$cdf = $standardNormal->cdf($z);
$icdf = $standardNormal->inverse($p);
$μ = $standardNormal->mean();
$median = $standardNormal->median();
$mode = $standardNormal->mode();
$σ² = $standardNormal->variance();
// Student's t-distribution
$ν = 3; // degrees of freedom
$p = 0.4; // proportion of area
$x = 2;
$studentT = new Continuous\StudentT::pdf($ν);
$pdf = $studentT->pdf($x);
$cdf = $studentT->cdf($x);
$t = $studentT->inverse2Tails($p); // t such that the area greater than t and the area beneath -t is p
$μ = $studentT->mean();
$median = $studentT->median();
$mode = $studentT->mode();
$σ² = $studentT->variance();
// Uniform distribution
$a = 1; // lower boundary of the distribution
$b = 4; // upper boundary of the distribution
$x = 2;
$uniform = new Continuous\Uniform($a, $b);
$pdf = $uniform->pdf($x);
$cdf = $uniform->cdf($x);
$μ = $uniform->mean();
$median = $uniform->median();
$mode = $uniform->mode();
$σ² = $uniform->variance();
// Weibull distribution
$k = 1; // shape parameter
$λ = 2; // scale parameter
$x = 2;
$weibull = new Continuous\Weibull($k, $λ);
$pdf = $weibull->pdf($x);
$cdf = $weibull->cdf($x);
$icdf = $weibull->inverse($p);
$μ = $weibull->mean();
$median = $weibull->median();
$mode = $weibull->mode();
// Other CDFs - All continuous distributions - Replace {$distribution} with desired distribution.
$between = $distribution->between($x₁, $x₂); // Probability of being between two points, x₁ and x₂
$outside = $distribution->outside($x₁, $x); // Probability of being between below x₁ and above x₂
$above = $distribution->above($x); // Probability of being above x to ∞
// Random Number Generator
$random = $distribution->rand(); // A random number with a given distribution
use MathPHP\Probability\Distribution\Discrete;
// Bernoulli distribution (special case of binomial where n = 1)
$p = 0.3;
$k = 0;
$bernoulli = new Discrete\Bernoulli($p);
$pmf = $bernoulli->pmf($k);
$cdf = $bernoulli->cdf($k);
$μ = $bernoulli->mean();
$median = $bernoulli->median();
$mode = $bernoulli->mode();
$σ² = $bernoulli->variance();
// Binomial distribution
$n = 2; // number of events
$p = 0.5; // probability of success
$r = 1; // number of successful events
$binomial = new Discrete\Binomial($n, $p);
$pmf = $binomial->pmf($r);
$cdf = $binomial->cdf($r);
$μ = $binomial->mean();
$σ² = $binomial->variance();
// Categorical distribution
$k = 3; // number of categories
$probabilities = ['a' => 0.3, 'b' => 0.2, 'c' => 0.5]; // probabilities for categorices a, b, and c
$categorical = new Discrete\Categorical($k, $probabilities);
$pmf_a = $categorical->pmf('a');
$mode = $categorical->mode();
// Geometric distribution (failures before the first success)
$p = 0.5; // success probability
$k = 2; // number of trials
$geometric = new Discrete\Geometric($p);
$pmf = $geometric->pmf($k);
$cdf = $geometric->cdf($k);
$μ = $geometric->mean();
$median = $geometric->median();
$mode = $geometric->mode();
$σ² = $geometric->variance();
// Hypergeometric distribution
$N = 50; // population size
$K = 5; // number of success states in the population
$n = 10; // number of draws
$k = 4; // number of observed successes
$hypergeo = new Discrete\Hypergeometric($N, $K, $n);
$pmf = $hypergeo->pmf($k);
$cdf = $hypergeo->cdf($k);
$μ = $hypergeo->mean();
$mode = $hypergeo->mode();
$σ² = $hypergeo->variance();
// Negative binomial distribution (Pascal)
$r = 1; // number of failures until the experiment is stopped
$P = 0.5; // probability of success on an individual trial
$x = 2; // number of successes
$negativeBinomial = new Discrete\NegativeBinomial($r, $p);
$pmf = $negativeBinomial->pmf($x);
$cdf = $negativeBinomial->cdf($x);
$μ = $negativeBinomial->mean();
$mode = $negativeBinomial->mode();
$σ² = $negativeBinomial->variance();
// Pascal distribution (Negative binomial)
$r = 1; // number of failures until the experiment is stopped
$P = 0.5; // probability of success on an individual trial
$x = 2; // number of successes
$pascal = new Discrete\Pascal($r, $p);
$pmf = $pascal->pmf($x);
$cdf = $pascal->cdf($x);
$μ = $pascal->mean();
$mode = $pascal->mode();
$σ² = $pascal->variance();
// Poisson distribution
$λ = 2; // average number of successful events per interval
$k = 3; // events in the interval
$poisson = new Discrete\Poisson($λ);
$pmf = $poisson->pmf($k);
$cdf = $poisson->cdf($k);
$μ = $poisson->mean();
$median = $poisson->median();
$mode = $poisson->mode();
$σ² = $poisson->variance();
// Shifted geometric distribution (probability to get one success)
$p = 0.5; // success probability
$k = 2; // number of trials
$shiftedGeometric = new Discrete\ShiftedGeometric($p);
$pmf = $shiftedGeometric->pmf($k);
$cdf = $shiftedGeometric->cdf($k);
$μ = $shiftedGeometric->mean();
$median = $shiftedGeometric->median();
$mode = $shiftedGeometric->mode();
$σ² = $shiftedGeometric->variance();
// Uniform distribution
$a = 1; // lower boundary of the distribution
$b = 4; // upper boundary of the distribution
$k = 2; // percentile
$uniform = new Discrete\Uniform($a, $b);
$pmf = $uniform->pmf();
$cdf = $uniform->cdf($k);
$μ = $uniform->mean();
$median = $uniform->median();
$σ² = $uniform->variance();
// Zipf distribution
$k = 2; // rank
$s = 3; // exponent
$N = 10; // number of elements
$zipf = new Discrete\Zipf($s, $N);
$pmf = $zipf->pmf($k);
$cdf = $zipf->cdf($k);
$μ = $zipf->mean();
$mode = $zipf->mode();
use MathPHP\Probability\Distribution\Multivariate;
// Dirichlet distribution
$αs = [1, 2, 3];
$xs = [0.07255081, 0.27811903, 0.64933016];
$dirichlet = new Multivariate\Dirichlet($αs);
$pdf = $dirichlet->pdf($xs);
// Normal distribution
$μ = [1, 1.1];
$∑ = MatrixFactory::create([
[1, 0],
[0, 1],
]);
$X = [0.7, 1.4];
$normal = new Multivariate\Normal($μ, $∑);
$pdf = $normal->pdf($X);
// Hypergeometric distribution
$quantities = [5, 10, 15]; // Suppose there are 5 black, 10 white, and 15 red marbles in an urn.
$choices = [2, 2, 2]; // If six marbles are chosen without replacement, the probability that exactly two of each color are chosen is:
$distribution = new Multivariate\Hypergeometric($quantities);
$probability = $distribution->pmf($choices); // 0.0795756
// Multinomial distribution
$frequencies = [7, 2, 3];
$probabilities = [0.40, 0.35, 0.25];
$multinomial = new Multivariate\Multinomial($probabilities);
$pmf = $multinomial->pmf($frequencies);
use MathPHP\Probability\Distribution\Table;
// Provided solely for completeness' sake.
// It is statistics tradition to provide these tables.
// MathPHP has dynamic distribution CDF functions you can use instead.
// Standard Normal Table (Z Table)
$table = Table\StandardNormal::Z_SCORES;
$probability = $table[1.5][0]; // Value for Z of 1.50
// t Distribution Tables
$table = Table\TDistribution::ONE_SIDED_CONFIDENCE_LEVEL;
$table = Table\TDistribution::TWO_SIDED_CONFIDENCE_LEVEL;
$ν = 5; // degrees of freedom
$cl = 99; // confidence level
$t = $table[$ν][$cl];
// t Distribution Tables
$table = Table\TDistribution::ONE_SIDED_ALPHA;
$table = Table\TDistribution::TWO_SIDED_ALPHA;
$ν = 5; // degrees of freedom
$α = 0.001; // alpha value
$t = $table[$ν][$α];
// χ² Distribution Table
$table = Table\ChiSquared::CHI_SQUARED_SCORES;
$df = 2; // degrees of freedom
$p = 0.05; // P value
$χ² = $table[$df][$p];
use MathPHP\Search;
// Search lists of numbers to find specific indexes
$list = [1, 2, 3, 4, 5];
$index = Search::sorted($list, 2); // Find the array index where an item should be inserted to maintain sorted order
$index = Search::argMax($list); // Find the array index of the maximum value
$index = Search::nanArgMax($list); // Find the array index of the maximum value, ignoring NANs
$index = Search::argMin($list); // Find the array index of the minimum value
$index = Search::nanArgMin($list); // Find the array index of the minimum value, ignoring NANs
$indices = Search::nonZero($list); // Find the array indices of the scalar values that are non-zero
use MathPHP\Sequence\Basic;
$n = 5; // Number of elements in the sequence
// Arithmetic progression
$d = 2; // Difference between the elements of the sequence
$a₁ = 1; // Starting number for the sequence
$progression = Basic::arithmeticProgression($n, $d, $a₁);
// [1, 3, 5, 7, 9] - Indexed from 1
// Geometric progression (arⁿ⁻¹)
$a = 2; // Scalar value
$r = 3; // Common ratio
$progression = Basic::geometricProgression($n, $a, $r);
// [2(3)⁰, 2(3)¹, 2(3)², 2(3)³] = [2, 6, 18, 54] - Indexed from 1
// Square numbers (n²)
$squares = Basic::squareNumber($n);
// [0², 1², 2², 3², 4²] = [0, 1, 4, 9, 16] - Indexed from 0
// Cubic numbers (n³)
$cubes = Basic::cubicNumber($n);
// [0³, 1³, 2³, 3³, 4³] = [0, 1, 8, 27, 64] - Indexed from 0
// Powers of 2 (2ⁿ)
$po2 = Basic::powersOfTwo($n);
// [2⁰, 2¹, 2², 2³, 2⁴] = [1, 2, 4, 8, 16] - Indexed from 0
// Powers of 10 (10ⁿ)
$po10 = Basic::powersOfTen($n);
// [10⁰, 10¹, 10², 10³, 10⁴] = [1, 10, 100, 1000, 10000] - Indexed from 0
// Factorial (n!)
$fact = Basic::factorial($n);
// [0!, 1!, 2!, 3!, 4!] = [1, 1, 2, 6, 24] - Indexed from 0
// Digit sum
$digit_sum = Basic::digitSum($n);
// [0, 1, 2, 3, 4] - Indexed from 0
// Digital root
$digit_root = Basic::digitalRoot($n);
// [0, 1, 2, 3, 4] - Indexed from 0
use MathPHP\Sequence\Advanced;
$n = 6; // Number of elements in the sequence
// Fibonacci (Fᵢ = Fᵢ₋₁ + Fᵢ₋₂)
$fib = Advanced::fibonacci($n);
// [0, 1, 1, 2, 3, 5] - Indexed from 0
// Lucas numbers
$lucas = Advanced::lucasNumber($n);
// [2, 1, 3, 4, 7, 11] - Indexed from 0
// Pell numbers
$pell = Advanced::pellNumber($n);
// [0, 1, 2, 5, 12, 29] - Indexed from 0
// Triangular numbers (figurate number)
$triangles = Advanced::triangularNumber($n);
// [1, 3, 6, 10, 15, 21] - Indexed from 1
// Pentagonal numbers (figurate number)
$pentagons = Advanced::pentagonalNumber($n);
// [1, 5, 12, 22, 35, 51] - Indexed from 1
// Hexagonal numbers (figurate number)
$hexagons = Advanced::hexagonalNumber($n);
// [1, 6, 15, 28, 45, 66] - Indexed from 1
// Heptagonal numbers (figurate number)
$heptagons = Advanced::heptagonalNumber($n);
// [1, 4, 7, 13, 18, 27] - Indexed from 1
// Look-and-say sequence (describe the previous term!)
$look_and_say = Advanced::lookAndSay($n);
// ['1', '11', '21', '1211', '111221', '312211'] - Indexed from 1
// Lazy caterer's sequence (central polygonal numbers)
$lazy_caterer = Advanced::lazyCaterers($n);
// [1, 2, 4, 7, 11, 16] - Indexed from 0
// Magic squares series (magic constants; magic sums)
$magic_squares = Advanced::magicSquares($n);
// [0, 1, 5, 15, 34, 65] - Indexed from 0
// Perfect numbers
$perfect_numbers = Advanced::perfectNumbers($n);
// [6, 28, 496, 8128, 33550336, 8589869056] - Indexed from 0
// Perfect powers sequence
$perfect_powers = Advanced::perfectPowers($n);
// [4, 8, 9, 16, 25, 27] - Indexed from 0
// Not perfect powers sequence
$not_perfect_powers = Advanced::notPerfectPowers($n);
// [2, 3, 5, 6, 7, 10] - Indexed from 0
// Prime numbers up to n (n is not the number of elements in the sequence)
$primes = Advanced::primesUpTo(30);
// [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] - Indexed from 0
use MathPHP\Sequence\NonInteger;
$n = 4; // Number of elements in the sequence
// Harmonic sequence
$harmonic = NonInteger::harmonic($n);
// [1, 3/2, 11/6, 25/12] - Indexed from 1
// Generalized harmonic sequence
$m = 2; // exponent
$generalized = NonInteger::generalizedHarmonic($n, $m);
// [1, 5 / 4, 49 / 36, 205 / 144] - Indexed from 1
// Hyperharmonic sequence
$r = 2; // depth of recursion
$hyperharmonic = NonInteger::hyperharmonic($n, $r);
// [1, 5/2, 26/6, 77/12] - Indexed from 1
use MathPHP\SetTheory\Set;
use MathPHP\SetTheory\ImmutableSet;
// Sets and immutable sets
$A = new Set([1, 2, 3]); // Can add and remove members
$B = new ImmutableSet([3, 4, 5]); // Cannot modify set once created
// Basic set data
$set = $A->asArray();
$cardinality = $A->length();
$bool = $A->isEmpty();
// Set membership
$true = $A->isMember(2);
$true = $A->isNotMember(8);
// Add and remove members
$A->add(4);
$A->add(new Set(['a', 'b']));
$A->addMulti([5, 6, 7]);
$A->remove(7);
$A->removeMulti([5, 6]);
$A->clear();
// Set properties against other sets - return boolean
$bool = $A->isDisjoint($B);
$bool = $A->isSubset($B); // A ⊆ B
$bool = $A->isProperSubset($B); // A ⊆ B & A ≠ B
$bool = $A->isSuperset($B); // A ⊇ B
$bool = $A->isProperSuperset($B); // A ⊇ B & A ≠ B
// Set operations with other sets - return a new Set
$A∪B = $A->union($B);
$A∩B = $A->intersect($B);
$A\B = $A->difference($B); // relative complement
$AΔB = $A->symmetricDifference($B);
$A×B = $A->cartesianProduct($B);
// Other set operations
$P⟮A⟯ = $A->powerSet();
$C = $A->copy();
// Print a set
print($A); // Set{1, 2, 3, 4, Set{a, b}}
// PHP Interfaces
$n = count($A); // Countable
foreach ($A as $member) { ... } // Iterator
// Fluent interface
$A->add(5)->add(6)->remove(4)->addMulti([7, 8, 9]);
use MathPHP\Statistics\ANOVA;
// One-way ANOVA
$sample1 = [1, 2, 3];
$sample2 = [3, 4, 5];
$sample3 = [5, 6, 7];
⋮ ⋮
$anova = ANOVA::oneWay($sample1, $sample2, $sample3);
print_r($anova);
/* Array (
[ANOVA] => Array ( // ANOVA hypothesis test summary data
[treatment] => Array (
[SS] => 24 // Sum of squares (between)
[df] => 2 // Degrees of freedom
[MS] => 12 // Mean squares
[F] => 12 // Test statistic
[P] => 0.008 // P value
)
[error] => Array (
[SS] => 6 // Sum of squares (within)
[df] => 6 // Degrees of freedom
[MS] => 1 // Mean squares
)
[total] => Array (
[SS] => 30 // Sum of squares (total)
[df] => 8 // Degrees of freedom
)
)
[total_summary] => Array ( // Total summary data
[n] => 9
[sum] => 36
[mean] => 4
[SS] => 174
[variance] => 3.75
[sd] => 1.9364916731037
[sem] => 0.6454972243679
)
[data_summary] => Array ( // Data summary (each input sample)
[0] => Array ([n] => 3 [sum] => 6 [mean] => 2 [SS] => 14 [variance] => 1 [sd] => 1 [sem] => 0.57735026918963)
[1] => Array ([n] => 3 [sum] => 12 [mean] => 4 [SS] => 50 [variance] => 1 [sd] => 1 [sem] => 0.57735026918963)
[2] => Array ([n] => 3 [sum] => 18 [mean] => 6 [SS] => 110 [variance] => 1 [sd] => 1 [sem] => 0.57735026918963)
)
) */
// Two-way ANOVA
/* | Factor B₁ | Factor B₂ | Factor B₃ | ⋯
Factor A₁ | 4, 6, 8 | 6, 6, 9 | 8, 9, 13 | ⋯
Factor A₂ | 4, 8, 9 | 7, 10, 13 | 12, 14, 16| ⋯
⋮ ⋮ ⋮ ⋮ */
$factorA₁ = [
[4, 6, 8], // Factor B₁
[6, 6, 9], // Factor B₂
[8, 9, 13], // Factor B₃
];
$factorA₂ = [
[4, 8, 9], // Factor B₁
[7, 10, 13], // Factor B₂
[12, 14, 16], // Factor B₃
];
⋮
$anova = ANOVA::twoWay($factorA₁, $factorA₂);
print_r($anova);
/* Array (
[ANOVA] => Array ( // ANOVA hypothesis test summary data
[factorA] => Array (
[SS] => 32 // Sum of squares
[df] => 1 // Degrees of freedom
[MS] => 32 // Mean squares
[F] => 5.6470588235294 // Test statistic
[P] => 0.034994350619895 // P value
)
[factorB] => Array (
[SS] => 93 // Sum of squares
[df] => 2 // Degrees of freedom
[MS] => 46.5 // Mean squares
[F] => 8.2058823529412 // Test statistic
[P] => 0.0056767297582031 // P value
)
[interaction] => Array (
[SS] => 7 // Sum of squares
[df] => 2 // Degrees of freedom
[MS] => 3.5 // Mean squares
[F] => 0.61764705882353 // Test statistic
[P] => 0.5555023440712 // P value
)
[error] => Array (
[SS] => 68 // Sum of squares (within)
[df] => 12 // Degrees of freedom
[MS] => 5.6666666666667 // Mean squares
)
[total] => Array (
[SS] => 200 // Sum of squares (total)
[df] => 17 // Degrees of freedom
)
)
[total_summary] => Array ( // Total summary data
[n] => 18
[sum] => 162
[mean] => 9
[SS] => 1658
[variance] => 11.764705882353
[sd] => 3.4299717028502
[sem] => 0.80845208345444
)
[summary_factorA] => Array ( ... ) // Summary data of factor A
[summary_factorB] => Array ( ... ) // Summary data of factor B
[summary_interaction] => Array ( ... ) // Summary data of interactions of factors A and B
) */
use MathPHP\Statistics\Average;
$numbers = [13, 18, 13, 14, 13, 16, 14, 21, 13];
// Mean, median, mode
$mean = Average::mean($numbers);
$median = Average::median($numbers);
$mode = Average::mode($numbers); // Returns an array — may be multimodal
// Weighted mean
$weights = [12, 1, 23, 6, 12, 26, 21, 12, 1];
$weighted_mean = Average::weightedMean($numbers, $weights)
// Other means of a list of numbers
$geometric_mean = Average::geometricMean($numbers);
$harmonic_mean = Average::harmonicMean($numbers);
$contraharmonic_mean = Average::contraharmonicMean($numbers);
$quadratic_mean = Average::quadraticMean($numbers); // same as rootMeanSquare
$root_mean_square = Average::rootMeanSquare($numbers); // same as quadraticMean
$trimean = Average::trimean($numbers);
$interquartile_mean = Average::interquartileMean($numbers); // same as iqm
$interquartile_mean = Average::iqm($numbers); // same as interquartileMean
$cubic_mean = Average::cubicMean($numbers);
// Truncated mean (trimmed mean)
$trim_percent = 25; // 25 percent of observations trimmed from each end of distribution
$truncated_mean = Average::truncatedMean($numbers, $trim_percent);
// Generalized mean (power mean)
$p = 2;
$generalized_mean = Average::generalizedMean($numbers, $p); // same as powerMean
$power_mean = Average::powerMean($numbers, $p); // same as generalizedMean
// Lehmer mean
$p = 3;
$lehmer_mean = Average::lehmerMean($numbers, $p);
// Moving averages
$n = 3;
$weights = [3, 2, 1];
$SMA = Average::simpleMovingAverage($numbers, $n); // 3 n-point moving average
$CMA = Average::cumulativeMovingAverage($numbers);
$WMA = Average::weightedMovingAverage($numbers, $n, $weights);
$EPA = Average::exponentialMovingAverage($numbers, $n);
// Means of two numbers
[$x, $y] = [24, 6];
$agm = Average::arithmeticGeometricMean($x, $y); // same as agm
$agm = Average::agm($x, $y); // same as arithmeticGeometricMean
$log_mean = Average::logarithmicMean($x, $y);
$heronian_mean = Average::heronianMean($x, $y);
$identric_mean = Average::identricMean($x, $y);
// Averages report
$averages = Average::describe($numbers);
print_r($averages);
/* Array (
[mean] => 15
[median] => 14
[mode] => Array ( [0] => 13 )
[geometric_mean] => 14.789726414533
[harmonic_mean] => 14.605077399381
[contraharmonic_mean] => 15.474074074074
[quadratic_mean] => 15.235193176035
[trimean] => 14.5
[iqm] => 14
[cubic_mean] => 15.492307432707
) */
use MathPHP\Statistics\KernelDensityEstimation
$data = [-2.76, -1.09, -0.5, -0.15, 0.22, 0.69, 1.34, 1.75];
$x = 0.5;
// Density estimator with default bandwidth (normal distribution approximation) and kernel function (standard normal)
$kde = new KernelDensityEstimation($data);
$density = $kde->evaluate($x)
// Custom bandwidth
$h = 0.1;
$kde->setBandwidth($h);
// Library of built-in kernel functions
$kde->setKernelFunction(KernelDensityEstimation::STANDARD_NORMAL);
$kde->setKernelFunction(KernelDensityEstimation::NORMAL);
$kde->setKernelFunction(KernelDensityEstimation::UNIFORM);
$kde->setKernelFunction(KernelDensityEstimation::TRIANGULAR);
$kde->setKernelFunction(KernelDensityEstimation::EPANECHNIKOV);
$kde->setKernelFunction(KernelDensityEstimation::TRICUBE);
// Set custom kernel function (user-provided callable)
$kernel = function ($x) {
if (abs($x) > 1) {
return 0;
} else {
return 70 / 81 * ((1 - abs($x) ** 3) ** 3);
}
};
$kde->setKernelFunction($kernel);
// All customization optionally can be done in the constructor
$kde = new KernelDesnsityEstimation($data, $h, $kernel);
use MathPHP\Statistics\Multivariate\PCA;
use MathPHP\LinearAlgebra\MatrixFactory;
// Given
$matrix = MatrixFactory::create($data); // observations of possibly correlated variables
$center = true; // do mean centering of data
$scale = true; // do standardization of data
// Build a principal component analysis model to explore
$model = new PCA($matrix, $center, $scale);
// Scores and loadings of the PCA model
$scores = $model->getScores(); // Matrix of transformed standardized data with the loadings matrix
$loadings = $model->getLoadings(); // Matrix of unit eigenvectors of the correlation matrix
$eigenvalues = $model->getEigenvalues(); // Vector of eigenvalues of components
// Residuals, limits, critical values and more
$R² = $model->getR2(); // array of R² values
$cumR² = $model->getCumR2(); // array of cummulative R² values
$Q = $model->getQResiduals(); // Matrix of Q residuals
$T² = $model->getT2Distances(); // Matrix of T² distances
$T²Critical = $model->getCriticalT2(); // array of critical limits of T²
$QCritical = $model->getCriticalQ(); // array of critical limits of Q
use MathPHP\Statistics\Multivariate\PLS;
use MathPHP\LinearAlgebra\MatrixFactory;
use MathPHP\SampleData;
// Given
$cereal = new SampleData\Cereal();
$X = MatrixFactory::createNumeric($cereal->getXData());
$Y = MatrixFactory::createNumeric($cereal->getYData());
// Build a partial least squares regression to explore
$numberOfComponents = 5;
$scale = true;
$pls = new PLS($X, $Y, $numberOfComponents, $scale);
// PLS model data
$C = $pls->getYLoadings(); // Loadings for Y values (each loading column transforms F to U)
$W = $pls->getXLoadings(); // Loadings for X values (each loading column transforms E into T)
$T = $pls->getXScores(); // Scores for the X values (latent variables of X)
$U = $pls->getYScores(); // Scores for the Y values (latent variables of Y)
$B = $pls->getCoefficients(); // Regression coefficients (matrix that best transforms E into F)
$P = $pls->getProjections(); // Projection matrix (each projection column transforms T into Ê)
// Predict values (use regression model to predict new values of Y given values for X)
$yPredictions = $pls->predict($xMatrix);
use MathPHP\Statistics\Outlier;
$data = [199.31, 199.53, 200.19, 200.82, 201.92, 201.95, 202.18, 245.57];
$n = 8; // size of data
$𝛼 = 0.05; // significance level
// Grubb's test - two sided test
$grubbsStatistic = Outlier::grubbsStatistic($data, Outlier::TWO_SIDED);
$criticalValue = Outlier::grubbsCriticalValue($𝛼, $n, Outlier::TWO_SIDED);
// Grubbs' test - one sided test of minimum value
$grubbsStatistic = Outlier::grubbsStatistic($data, Outlier::ONE_SIDED_LOWER);
$criticalValue = Outlier::grubbsCriticalValue($𝛼, $n, Outlier::ONE_SIDED);
// Grubbs' test - one sided test of maximum value
$grubbsStatistic = Outlier::grubbsStatistic($data, Outlier::ONE_SIDED_UPPER);
$criticalValue = Outlier::grubbsCriticalValue($𝛼, $n, Outlier::ONE_SIDED);
use MathPHP\Statistics\RandomVariable;
$X = [1, 2, 3, 4];
$Y = [2, 3, 4, 5];
// Central moment (nth moment)
$second_central_moment = RandomVariable::centralMoment($X, 2);
$third_central_moment = RandomVariable::centralMoment($X, 3);
// Skewness (population, sample, and alternative general method)
$skewness = RandomVariable::skewness($X); // Optional type parameter to choose skewness type calculation. Defaults to sample skewness (similar to Excel's SKEW).
$skewness = RandomVariable::sampleSkewness($X); // Same as RandomVariable::skewness($X, RandomVariable::SAMPLE_SKEWNESS) - Similar to Excel's SKEW, SAS and SPSS, R (e1071) skewness type 2
$skewness = RandomVariable::populationSkewness($X); // Same as RandomVariable::skewness($X, RandomVariable::POPULATION_SKEWNESS) - Similar to Excel's SKEW.P, classic textbook definition, R (e1071) skewness type 1
$skewness = RandomVariable::alternativeSkewness($X); // Same as RandomVariable::skewness($X, RandomVariable::ALTERNATIVE_SKEWNESS) - Alternative, classic definition of skewness
$SES = RandomVariable::ses(count($X)); // standard error of skewness
// Kurtosis (excess)
$kurtosis = RandomVariable::kurtosis($X); // Optional type parameter to choose kurtosis type calculation. Defaults to population kurtosis (similar to Excel's KURT).
$kurtosis = RandomVariable::sampleKurtosis($X); // Same as RandomVariable::kurtosis($X, RandomVariable::SAMPLE_KURTOSIS) - Similar to R (e1071) kurtosis type 1
$kurtosis = RandomVariable::populationKurtosis($X); // Same as RandomVariable::kurtosis($X, RandomVariable::POPULATION_KURTOSIS) - Similar to Excel's KURT, SAS and SPSS, R (e1071) kurtosis type 2
$platykurtic = RandomVariable::isPlatykurtic($X); // true if kurtosis is less than zero
$leptokurtic = RandomVariable::isLeptokurtic($X); // true if kurtosis is greater than zero
$mesokurtic = RandomVariable::isMesokurtic($X); // true if kurtosis is zero
$SEK = RandomVariable::sek(count($X)); // standard error of kurtosis
// Standard error of the mean (SEM)
$sem = RandomVariable::standardErrorOfTheMean($X); // same as sem
$sem = RandomVariable::sem($X); // same as standardErrorOfTheMean
// Confidence interval
$μ = 90; // sample mean
$n = 9; // sample size
$σ = 36; // standard deviation
$cl = 99; // confidence level
$ci = RandomVariable::confidenceInterval($μ, $n, $σ, $cl); // Array( [ci] => 30.91, [lower_bound] => 59.09, [upper_bound] => 120.91 )
use MathPHP\Statistics\Regression;
$points = [[1,2], [2,3], [4,5], [5,7], [6,8]];
// Simple linear regression (least squares method)
$regression = new Regression\Linear($points);
$parameters = $regression->getParameters(); // [m => 1.2209302325581, b => 0.6046511627907]
$equation = $regression->getEquation(); // y = 1.2209302325581x + 0.6046511627907
$y = $regression->evaluate(5); // Evaluate for y at x = 5 using regression equation
$ci = $regression->ci(5, 0.5); // Confidence interval for x = 5 with p-value of 0.5
$pi = $regression->pi(5, 0.5); // Prediction interval for x = 5 with p-value of 0.5; Optional number of trials parameter.
$Ŷ = $regression->yHat();
$r = $regression->r(); // same as correlationCoefficient
$r² = $regression->r2(); // same as coefficientOfDetermination
$se = $regression->standardErrors(); // [m => se(m), b => se(b)]
$t = $regression->tValues(); // [m => t, b => t]
$p = $regression->tProbability(); // [m => p, b => p]
$F = $regression->fStatistic();
$p = $regression->fProbability();
$h = $regression->leverages();
$e = $regression->residuals();
$D = $regression->cooksD();
$DFFITS = $regression->dffits();
$SStot = $regression->sumOfSquaresTotal();
$SSreg = $regression->sumOfSquaresRegression();
$SSres = $regression->sumOfSquaresResidual();
$MSR = $regression->meanSquareRegression();
$MSE = $regression->meanSquareResidual();
$MSTO = $regression->meanSquareTotal();
$error = $regression->errorSd(); // Standard error of the residuals
$V = $regression->regressionVariance();
$n = $regression->getSampleSize(); // 5
$points = $regression->getPoints(); // [[1,2], [2,3], [4,5], [5,7], [6,8]]
$xs = $regression->getXs(); // [1, 2, 4, 5, 6]
$ys = $regression->getYs(); // [2, 3, 5, 7, 8]
$ν = $regression->degreesOfFreedom();
// Linear regression through a fixed point (least squares method)
$force_point = [0,0];
$regression = new Regression\LinearThroughPoint($points, $force_point);
$parameters = $regression->getParameters();
$equation = $regression->getEquation();
$y = $regression->evaluate(5);
$Ŷ = $regression->yHat();
$r = $regression->r();
$r² = $regression->r2();
⋮ ⋮
// Theil–Sen estimator (Sen's slope estimator, Kendall–Theil robust line)
$regression = new Regression\TheilSen($points);
$parameters = $regression->getParameters();
$equation = $regression->getEquation();
$y = $regression->evaluate(5);
⋮ ⋮
// Use Lineweaver-Burk linearization to fit data to the Michaelis–Menten model: y = (V * x) / (K + x)
$regression = new Regression\LineweaverBurk($points);
$parameters = $regression->getParameters(); // [V, K]
$equation = $regression->getEquation(); // y = Vx / (K + x)
$y = $regression->evaluate(5);
⋮ ⋮
// Use Hanes-Woolf linearization to fit data to the Michaelis–Menten model: y = (V * x) / (K + x)
$regression = new Regression\HanesWoolf($points);
$parameters = $regression->getParameters(); // [V, K]
$equation = $regression->getEquation(); // y = Vx / (K + x)
$y = $regression->evaluate(5);
⋮ ⋮
// Power law regression - power curve (least squares fitting)
$regression = new Regression\PowerLaw($points);
$parameters = $regression->getParameters(); // [a => 56.483375436574, b => 0.26415375648621]
$equation = $regression->getEquation(); // y = 56.483375436574x^0.26415375648621
$y = $regression->evaluate(5);
⋮ ⋮
// LOESS - Locally Weighted Scatterplot Smoothing (Local regression)
$α = 1/3; // Smoothness parameter
$λ = 1; // Order of the polynomial fit
$regression = new Regression\LOESS($points, $α, $λ);
$y = $regression->evaluate(5);
$Ŷ = $regression->yHat();
⋮ ⋮
use MathPHP\Statistics\Significance;
// Z test - One sample (z and p values)
$Hₐ = 20; // Alternate hypothesis (M Sample mean)
$n = 200; // Sample size
$H₀ = 19.2; // Null hypothesis (μ Population mean)
$σ = 6; // SD of population (Standard error of the mean)
$z = Significance:zTest($Hₐ, $n, $H₀, $σ); // Same as zTestOneSample
$z = Significance:zTestOneSample($Hₐ, $n, $H₀, $σ); // Same as zTest
/* [
'z' => 1.88562, // Z score
'p1' => 0.02938, // one-tailed p value
'p2' => 0.0593, // two-tailed p value
] */
// Z test - Two samples (z and p values)
$μ₁ = 27; // Sample mean of population 1
$μ₂ = 33; // Sample mean of population 2
$n₁ = 75; // Sample size of population 1
$n₂ = 50; // Sample size of population 2
$σ₁ = 14.1; // Standard deviation of sample mean 1
$σ₂ = 9.5; // Standard deviation of sample mean 2
$z = Significance::zTestTwoSample($μ₁, $μ₂, $n₁, $n₂, $σ₁, $σ₂);
/* [
'z' => -2.36868418147285, // z score
'p1' => 0.00893, // one-tailed p value
'p2' => 0.0179, // two-tailed p value
] */
// Z score
$M = 8; // Sample mean
$μ = 7; // Population mean
$σ = 1; // Population SD
$z = Significance::zScore($M, $μ, $σ);
// T test - One sample (from sample data)
$a = [3, 4, 4, 5, 5, 5, 6, 6, 7, 8]; // Data set
$H₀ = 300; // Null hypothesis (μ₀ Population mean)
$tTest = Significance::tTest($a, $H₀)
print_r($tTest);
/* Array (
[t] => 0.42320736951516 // t score
[df] => 9 // degrees of freedom
[p1] => 0.34103867713806 // one-tailed p value
[p2] => 0.68207735427613 // two-tailed p value
[mean] => 5.3 // sample mean
[sd] => 1.4944341180973 // standard deviation
) */
// T test - One sample (from summary data)
$Hₐ = 280; // Alternate hypothesis (M Sample mean)
$s = 50; // Standard deviation of sample
$n = 15; // Sample size
$H₀ = 300; // Null hypothesis (μ₀ Population mean)
$tTest = Significance::tTestOneSampleFromSummaryData($Hₐ, $s, $n, $H₀);
print_r($tTest);
/* Array (
[t] => -1.549193338483 // t score
[df] => 14 // degreees of freedom
[p1] => 0.071820000122611 // one-tailed p value
[p2] => 0.14364000024522 // two-tailed p value
[mean] => 280 // sample mean
[sd] => 50 // standard deviation
) */
// T test - Two samples (from sample data)
$x₁ = [27.5, 21.0, 19.0, 23.6, 17.0, 17.9, 16.9, 20.1, 21.9, 22.6, 23.1, 19.6, 19.0, 21.7, 21.4];
$x₂ = [27.1, 22.0, 20.8, 23.4, 23.4, 23.5, 25.8, 22.0, 24.8, 20.2, 21.9, 22.1, 22.9, 20.5, 24.4];
$tTest = Significance::tTest($x₁, $x₂);
print_r($tTest);
/* Array (
[t] => -2.4553600286929 // t score
[df] => 24.988527070145 // degrees of freedom
[p1] => 0.010688914613979 // one-tailed p value
[p2] => 0.021377829227958 // two-tailed p value
[mean1] => 20.82 // mean of sample x₁
[mean2] => 22.98667 // mean of sample x₂
[sd1] => 2.804894 // standard deviation of x₁
[sd2] => 1.952605 // standard deviation of x₂
) */
// T test - Two samples (from summary data)
$μ₁ = 42.14; // Sample mean of population 1
$μ₂ = 43.23; // Sample mean of population 2
$n₁ = 10; // Sample size of population 1
$n₂ = 10; // Sample size of population 2
$σ₁ = 0.683; // Standard deviation of sample mean 1
$σ₂ = 0.750; // Standard deviation of sample mean 2
$tTest = Significance::tTestTwoSampleFromSummaryData($μ₁, $μ₂, $n₁, $n₂, $σ₁, $σ₂);
print_r($tTest);
/* Array (
[t] => -3.3972305988708 // t score
[df] => 17.847298548027 // degrees of freedom
[p1] => 0.0016211251126198 // one-tailed p value
[p2] => 0.0032422502252396 // two-tailed p value
[mean1] => 42.14
[mean2] => 43.23
[sd1] => 0.6834553
[sd2] => 0.7498889
] */
// T score
$Hₐ = 280; // Alternate hypothesis (M Sample mean)
$s = 50; // SD of sample
$n = 15; // Sample size
$H₀ = 300; // Null hypothesis (μ₀ Population mean)
$t = Significance::tScore($Hₐ, $s, $n, $H);
// χ² test (chi-squared goodness of fit test)
$observed = [4, 6, 17, 16, 8, 9];
$expected = [10, 10, 10, 10, 10, 10];
$χ² = Significance::chiSquaredTest($observed, $expected);
// ['chi-square' => 14.2, 'p' => 0.014388]
use MathPHP\Trigonometry;
$n = 9;
$points = Trigonometry::unitCircle($n); // Produce n number of points along the unit circle
javascript
{
"oyski/math-php": "2.*"
}
}
bash
$ php composer.phar install
$ php composer.phar
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.