/var/www/enzatesting.onesolution.hk/inc/phpexcel_1.7.7/PHPExcel/Shared/JAMA/examples/LMQuadTest.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?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(102);

        print(
"quad y= ");
        
$qy = new Matrix($y$npts);
        
$qy->print(102);

        
$o[0] = $x;
        
$o[1] = $a;
        
$o[2] = $y;
        
$o[3] = $s;

        return 
$o;
    }    
//    function testdata()

}    //    class LMQuadTest