/** * Tests LU, QR, SVD and symmetric Eig decompositions. * * n = order of magic square. * trace = diagonal sum, should be the magic sum, (n^3 + n)/2. * max_eig = maximum eigenvalue of (A + A')/2, should equal trace. * rank = linear algebraic rank, should equal n if n is odd, * be less than n if n is even. * cond = L_2 condition number, ratio of singular values. * lu_res = test of LU factorization, norm1(L*U-A(p,:))/(n*eps). * qr_res = test of QR factorization, norm1(Q*R-A)/(n*eps). */ function main() { ?> <p>Test of Matrix Class, using magic squares.</p> <p>See MagicSquareExample.main() for an explanation.</p> <table border='1' cellspacing='0' cellpadding='4'> <tr> <th>n</th> <th>trace</th> <th>max_eig</th> <th>rank</th> <th>cond</th> <th>lu_res</th> <th>qr_res</th> </tr> <?php $start_time = $this->microtime_float(); $eps = pow(2.0, -52.0); for ($n = 3; $n <= 6; $n++) { echo "<tr>"; echo "<td align='right'>{$n}</td>"; $M = $this->magic($n); $t = (int) $M->trace(); echo "<td align='right'>{$t}</td>"; $O = $M->plus($M->transpose()); $E = new EigenvalueDecomposition($O->times(0.5)); $d = $E->getRealEigenvalues(); echo "<td align='right'>" . $d[$n - 1] . "</td>"; $r = $M->rank(); echo "<td align='right'>" . $r . "</td>"; $c = $M->cond(); if ($c < 1 / $eps) { echo "<td align='right'>" . sprintf("%.3f", $c) . "</td>"; } else { echo "<td align='right'>Inf</td>"; } $LU = new LUDecomposition($M); $L = $LU->getL(); $U = $LU->getU(); $p = $LU->getPivot(); // Java version: R = L.times(U).minus(M.getMatrix(p,0,n-1)); $S = $L->times($U); $R = $S->minus($M->getMatrix($p, 0, $n - 1)); $res = $R->norm1() / ($n * $eps); echo "<td align='right'>" . sprintf("%.3f", $res) . "</td>"; $QR = new QRDecomposition($M); $Q = $QR->getQ(); $R = $QR->getR(); $S = $Q->times($R); $R = $S->minus($M); $res = $R->norm1() / ($n * $eps); echo "<td align='right'>" . sprintf("%.3f", $res) . "</td>"; echo "</tr>"; } echo "<table>"; echo "<br />"; $stop_time = $this->microtime_float(); $etime = $stop_time - $start_time; echo "<p>Elapsed time is " . sprintf("%.4f", $etime) . " seconds.</p>"; }
/** * Solve A*X = B. * @param Matrix $B Right hand side * @return Matrix ... Solution if A is square, least squares solution otherwise */ function solve($B) { if ($this->m == $this->n) { $LU = new LUDecomposition($this); return $LU->solve($B); } else { $QR = new QRDecomposition($this); return $QR->solve($B); } }
/** * Solve A*X = B. * * @param Matrix $B Right hand side * @return Matrix ... Solution if A is square, least squares solution otherwise */ public function solve($B) { if ($this->m == $this->n) { $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this); return $LU->solve($B); } else { $QR = new QRDecomposition($this); return $QR->solve($B); } }