PageRenderTime 24ms CodeModel.GetById 17ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 1ms

/PHPExcel/Shared/JAMA/examples/LagrangeInterpolation.php

https://bitbucket.org/nfredricks/wp-employee-time
PHP | 59 lines | 28 code | 14 blank | 17 comment | 3 complexity | ae1fea6a12e182303a0b37f497c1ace0 MD5 | raw file
 1<?php
 2
 3require_once "../Matrix.php";
 4
 5/**
 6 * Given n points (x0,y0)...(xn-1,yn-1), the following methid computes
 7 * the polynomial factors of the n-1't degree polynomial passing through
 8 * the n points.
 9 *
10 * Example: Passing in three points (2,3) (1,4) and (3,7) will produce
11 * the results [2.5, -8.5, 10] which means that the points are on the
12 * curve y = 2.5x² - 8.5x + 10.
13 *
14 * @see http://geosoft.no/software/lagrange/LagrangeInterpolation.java.html
15 * @author Jacob Dreyer
16 * @author Paul Meagher (port to PHP and minor changes)
17 *
18 * @param x[] float
19 * @param y[] float
20 */
21class LagrangeInterpolation {
22
23	public function findPolynomialFactors($x, $y) {
24		$n = count($x);
25
26		$data = array();  // double[n][n];
27		$rhs  = array();  // double[n];
28
29		for ($i = 0; $i < $n; ++$i) {
30			$v = 1;
31			for ($j = 0; $j < $n; ++$j) {
32				$data[$i][$n-$j-1] = $v;
33				$v *= $x[$i];
34			}
35			$rhs[$i] = $y[$i];
36		}
37
38		// Solve m * s = b
39		$m = new Matrix($data);
40		$b = new Matrix($rhs, $n);
41
42		$s = $m->solve($b);
43
44		return $s->getRowPackedCopy();
45	}	//	function findPolynomialFactors()
46
47}	//	class LagrangeInterpolation
48
49
50$x = array(2.0, 1.0, 3.0);
51$y = array(3.0, 4.0, 7.0);
52
53$li = new LagrangeInterpolation;
54$f = $li->findPolynomialFactors($x, $y);
55
56
57for ($i = 0; $i < 3; ++$i) {
58	echo $f[$i]."<br />";
59}