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
|