 509f27e5c6
			
		
	
	
		509f27e5c6
		
	
	
	
	
		
			
			git-svn-id: https://phpexcel.svn.codeplex.com/svn/trunk@59884 2327b42d-5241-43d6-9e2a-de5ac946f064
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * quadratic (p-o)'S'S(p-o)
 | |
|  * solve for o, S
 | |
|  * S is a single scale factor
 | |
|  */
 | |
| class LMQuadTest {
 | |
| 
 | |
| 	/**
 | |
| 	 * @param array[] $x
 | |
| 	 * @param array[] $a
 | |
| 	 */
 | |
| 	function val($x, $a) {
 | |
| 		if (count($a) != 3) die ("Wrong number of elements in array a");
 | |
| 		if (count($x) != 2) die ("Wrong number of elements in array x");
 | |
| 
 | |
| 		$ox = $a[0];
 | |
| 		$oy = $a[1];
 | |
| 		$s  = $a[2];
 | |
| 
 | |
| 		$sdx = $s * ($x[0] - $ox);
 | |
| 		$sdy = $s * ($x[1] - $oy);
 | |
| 
 | |
| 		return ($sdx * $sdx) + ($sdy * $sdy);
 | |
|    }	//	function val()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * z = (p-o)'S'S(p-o)
 | |
| 	 * dz/dp = 2S'S(p-o)
 | |
| 	 *
 | |
| 	 * z = (s*(px-ox))^2 + (s*(py-oy))^2
 | |
| 	 * dz/dox = -2(s*(px-ox))*s
 | |
| 	 * dz/ds = 2*s*[(px-ox)^2 + (py-oy)^2]
 | |
| 	 *
 | |
| 	 * z = (s*dx)^2 + (s*dy)^2
 | |
| 	 * dz/ds = 2(s*dx)*dx + 2(s*dy)*dy
 | |
| 	 *
 | |
| 	 * @param array[] $x
 | |
| 	 * @param array[] $a
 | |
| 	 * @param int $a_k
 | |
| 	 * @param array[] $a
 | |
| 	 */
 | |
| 	function grad($x, $a, $a_k) {
 | |
| 		if (count($a) != 3) die ("Wrong number of elements in array a");
 | |
| 		if (count($x) != 2) die ("Wrong number of elements in array x");
 | |
| 		if ($a_k < 3) die ("a_k=".$a_k);
 | |
| 
 | |
| 		$ox = $a[0];
 | |
| 		$oy = $a[1];
 | |
| 		$s  = $a[2];
 | |
| 
 | |
| 		$dx = ($x[0] - $ox);
 | |
| 		$dy = ($x[1] - $oy);
 | |
| 
 | |
| 		if ($a_k == 0)
 | |
| 			return -2.*$s*$s*$dx;
 | |
| 		elseif ($a_k == 1)
 | |
| 			return -2.*$s*$s*$dy;
 | |
| 		else
 | |
| 			return 2.*$s*($dx*$dx + $dy*$dy);
 | |
| 	}	//	function grad()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * @return array[] $a
 | |
| 	 */
 | |
| 	function initial() {
 | |
| 		$a[0] = 0.05;
 | |
| 		$a[1] = 0.1;
 | |
| 		$a[2] = 1.0;
 | |
| 
 | |
| 		return $a;
 | |
| 	}	//	function initial()
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * @return Object[] $a
 | |
| 	 */
 | |
| 	function testdata() {
 | |
| 		$npts = 25;
 | |
| 
 | |
| 		$a[0] = 0.;
 | |
| 		$a[1] = 0.;
 | |
| 		$a[2] = 0.9;
 | |
| 
 | |
| 		$i = 0;
 | |
| 
 | |
| 		for ($r = -2; $r <= 2; ++$r) {
 | |
| 			for ($c = -2; $c <= 2; ++$c) {
 | |
| 				$x[$i][0] = $c;
 | |
| 				$x[$i][1] = $r;
 | |
| 				$y[$i] = $this->val($x[$i], $a);
 | |
| 				print("Quad ".$c.",".$r." -> ".$y[$i]."<br />");
 | |
| 				$s[$i] = 1.;
 | |
| 				++$i;
 | |
| 			}
 | |
| 		}
 | |
| 		print("quad x= ");
 | |
| 
 | |
| 		$qx = new Matrix($x);
 | |
| 		$qx->print(10, 2);
 | |
| 
 | |
| 		print("quad y= ");
 | |
| 		$qy = new Matrix($y, $npts);
 | |
| 		$qy->print(10, 2);
 | |
| 
 | |
| 		$o[0] = $x;
 | |
| 		$o[1] = $a;
 | |
| 		$o[2] = $y;
 | |
| 		$o[3] = $s;
 | |
| 
 | |
| 		return $o;
 | |
| 	}	//	function testdata()
 | |
| 
 | |
| }	//	class LMQuadTest
 |