 509f27e5c6
			
		
	
	
		509f27e5c6
		
	
	
	
	
		
			
			git-svn-id: https://phpexcel.svn.codeplex.com/svn/trunk@59884 2327b42d-5241-43d6-9e2a-de5ac946f064
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| require_once "../Matrix.php";
 | |
| 
 | |
| /**
 | |
|  * Given n points (x0,y0)...(xn-1,yn-1), the following methid computes
 | |
|  * the polynomial factors of the n-1't degree polynomial passing through
 | |
|  * the n points.
 | |
|  *
 | |
|  * Example: Passing in three points (2,3) (1,4) and (3,7) will produce
 | |
|  * the results [2.5, -8.5, 10] which means that the points are on the
 | |
|  * curve y = 2.5x² - 8.5x + 10.
 | |
|  *
 | |
|  * @see http://geosoft.no/software/lagrange/LagrangeInterpolation.java.html
 | |
|  * @author Jacob Dreyer
 | |
|  * @author Paul Meagher (port to PHP and minor changes)
 | |
|  *
 | |
|  * @param x[] float
 | |
|  * @param y[] float
 | |
|  */
 | |
| class LagrangeInterpolation {
 | |
| 
 | |
| 	public function findPolynomialFactors($x, $y) {
 | |
| 		$n = count($x);
 | |
| 
 | |
| 		$data = array();  // double[n][n];
 | |
| 		$rhs  = array();  // double[n];
 | |
| 
 | |
| 		for ($i = 0; $i < $n; ++$i) {
 | |
| 			$v = 1;
 | |
| 			for ($j = 0; $j < $n; ++$j) {
 | |
| 				$data[$i][$n-$j-1] = $v;
 | |
| 				$v *= $x[$i];
 | |
| 			}
 | |
| 			$rhs[$i] = $y[$i];
 | |
| 		}
 | |
| 
 | |
| 		// Solve m * s = b
 | |
| 		$m = new Matrix($data);
 | |
| 		$b = new Matrix($rhs, $n);
 | |
| 
 | |
| 		$s = $m->solve($b);
 | |
| 
 | |
| 		return $s->getRowPackedCopy();
 | |
| 	}	//	function findPolynomialFactors()
 | |
| 
 | |
| }	//	class LagrangeInterpolation
 | |
| 
 | |
| 
 | |
| $x = array(2.0, 1.0, 3.0);
 | |
| $y = array(3.0, 4.0, 7.0);
 | |
| 
 | |
| $li = new LagrangeInterpolation;
 | |
| $f = $li->findPolynomialFactors($x, $y);
 | |
| 
 | |
| 
 | |
| for ($i = 0; $i < 3; ++$i) {
 | |
| 	echo $f[$i]."<br />";
 | |
| }
 |