LMQuadTest.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. /**
  3. * quadratic (p-o)'S'S(p-o)
  4. * solve for o, S
  5. * S is a single scale factor
  6. */
  7. class LMQuadTest {
  8. /**
  9. * @param array[] $x
  10. * @param array[] $a
  11. */
  12. function val($x, $a) {
  13. if (count($a) != 3) die ("Wrong number of elements in array a");
  14. if (count($x) != 2) die ("Wrong number of elements in array x");
  15. $ox = $a[0];
  16. $oy = $a[1];
  17. $s = $a[2];
  18. $sdx = $s * ($x[0] - $ox);
  19. $sdy = $s * ($x[1] - $oy);
  20. return ($sdx * $sdx) + ($sdy * $sdy);
  21. } // function val()
  22. /**
  23. * z = (p-o)'S'S(p-o)
  24. * dz/dp = 2S'S(p-o)
  25. *
  26. * z = (s*(px-ox))^2 + (s*(py-oy))^2
  27. * dz/dox = -2(s*(px-ox))*s
  28. * dz/ds = 2*s*[(px-ox)^2 + (py-oy)^2]
  29. *
  30. * z = (s*dx)^2 + (s*dy)^2
  31. * dz/ds = 2(s*dx)*dx + 2(s*dy)*dy
  32. *
  33. * @param array[] $x
  34. * @param array[] $a
  35. * @param int $a_k
  36. * @param array[] $a
  37. */
  38. function grad($x, $a, $a_k) {
  39. if (count($a) != 3) die ("Wrong number of elements in array a");
  40. if (count($x) != 2) die ("Wrong number of elements in array x");
  41. if ($a_k < 3) die ("a_k=".$a_k);
  42. $ox = $a[0];
  43. $oy = $a[1];
  44. $s = $a[2];
  45. $dx = ($x[0] - $ox);
  46. $dy = ($x[1] - $oy);
  47. if ($a_k == 0)
  48. return -2.*$s*$s*$dx;
  49. elseif ($a_k == 1)
  50. return -2.*$s*$s*$dy;
  51. else
  52. return 2.*$s*($dx*$dx + $dy*$dy);
  53. } // function grad()
  54. /**
  55. * @return array[] $a
  56. */
  57. function initial() {
  58. $a[0] = 0.05;
  59. $a[1] = 0.1;
  60. $a[2] = 1.0;
  61. return $a;
  62. } // function initial()
  63. /**
  64. * @return Object[] $a
  65. */
  66. function testdata() {
  67. $npts = 25;
  68. $a[0] = 0.;
  69. $a[1] = 0.;
  70. $a[2] = 0.9;
  71. $i = 0;
  72. for ($r = -2; $r <= 2; ++$r) {
  73. for ($c = -2; $c <= 2; ++$c) {
  74. $x[$i][0] = $c;
  75. $x[$i][1] = $r;
  76. $y[$i] = $this->val($x[$i], $a);
  77. print("Quad ".$c.",".$r." -> ".$y[$i]."<br />");
  78. $s[$i] = 1.;
  79. ++$i;
  80. }
  81. }
  82. print("quad x= ");
  83. $qx = new Matrix($x);
  84. $qx->print(10, 2);
  85. print("quad y= ");
  86. $qy = new Matrix($y, $npts);
  87. $qy->print(10, 2);
  88. $o[0] = $x;
  89. $o[1] = $a;
  90. $o[2] = $y;
  91. $o[3] = $s;
  92. return $o;
  93. } // function testdata()
  94. } // class LMQuadTest