60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								require_once "../Matrix.php";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Given n points (x0,y0)...(xn-1,yn-1), the following method 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
							 | 
						||
| 
								 | 
							
								 * @see http://source.freehep.org/jcvsweb/ilc/LCSIM/wdview/lcsim/src/org/lcsim/fit/polynomial/PolynomialFitter.java
							 | 
						||
| 
								 | 
							
								 * @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 />";
							 | 
						||
| 
								 | 
							
								}
							 |