81 $this->d = $this->V[$this->
n-1];
83 for (
$i = $this->
n-1;
$i > 0; --
$i) {
87 $scale += array_sum(array_map(abs, $this->d));
89 $this->
e[
$i] = $this->d[$i_];
90 $this->d = array_slice($this->V[$i_], 0, $i_);
91 for ($j = 0; $j <
$i; ++$j) {
92 $this->V[$j][
$i] = $this->V[
$i][$j] = 0.0;
96 for ($k = 0; $k <
$i; ++$k) {
97 $this->d[$k] /= $scale;
98 $h += pow($this->d[$k], 2);
105 $this->
e[
$i] = $scale * $g;
107 $this->d[$i_] = $f - $g;
108 for ($j = 0; $j <
$i; ++$j) {
112 for ($j = 0; $j <
$i; ++$j) {
114 $this->V[$j][
$i] = $f;
115 $g = $this->
e[$j] + $this->V[$j][$j] * $f;
116 for ($k = $j+1; $k <= $i_; ++$k) {
117 $g += $this->V[$k][$j] * $this->d[$k];
118 $this->
e[$k] += $this->V[$k][$j] * $f;
123 for ($j = 0; $j <
$i; ++$j) {
125 $f += $this->
e[$j] * $this->d[$j];
128 for ($j=0; $j <
$i; ++$j) {
129 $this->
e[$j] -= $hh * $this->d[$j];
131 for ($j = 0; $j <
$i; ++$j) {
134 for ($k = $j; $k <= $i_; ++$k) {
135 $this->V[$k][$j] -= ($f * $this->
e[$k] + $g * $this->d[$k]);
137 $this->d[$j] = $this->V[$i-1][$j];
138 $this->V[
$i][$j] = 0.0;
145 for (
$i = 0;
$i < $this->
n-1; ++
$i) {
146 $this->V[$this->n-1][
$i] = $this->V[
$i][
$i];
147 $this->V[
$i][
$i] = 1.0;
150 for ($k = 0; $k <=
$i; ++$k) {
151 $this->d[$k] = $this->V[$k][
$i+1] /
$h;
153 for ($j = 0; $j <=
$i; ++$j) {
155 for ($k = 0; $k <=
$i; ++$k) {
156 $g += $this->V[$k][
$i+1] * $this->V[$k][$j];
158 for ($k = 0; $k <=
$i; ++$k) {
159 $this->V[$k][$j] -= $g * $this->d[$k];
163 for ($k = 0; $k <=
$i; ++$k) {
164 $this->V[$k][
$i+1] = 0.0;
168 $this->d = $this->V[$this->n-1];
169 $this->V[$this->n-1] = array_fill(0, $j, 0.0);
170 $this->V[$this->n-1][$this->n-1] = 1.0;
187 $this->
e[
$i-1] = $this->
e[
$i];
189 $this->
e[$this->n-1] = 0.0;
192 $eps = pow(2.0,-52.0);
196 $tst1 = max($tst1, abs($this->d[
$l]) + abs($this->
e[$l]));
198 while ($m < $this->n) {
199 if (abs($this->
e[
$m]) <=
$eps * $tst1)
212 $p = ($this->d[$l+1] - $g) / (2.0 * $this->
e[$l]);
216 $this->d[
$l] = $this->
e[
$l] / ($p +
$r);
217 $this->d[$l+1] = $this->
e[
$l] * ($p +
$r);
218 $dl1 = $this->d[$l+1];
219 $h = $g - $this->d[
$l];
227 $el1 = $this->
e[$l + 1];
233 $g = $c * $this->
e[
$i];
236 $this->e[$i+1] =
$s *
$r;
239 $p = $c * $this->d[
$i] -
$s * $g;
240 $this->d[$i+1] =
$h +
$s * ($c * $g +
$s * $this->d[
$i]);
243 $h = $this->V[$k][$i+1];
244 $this->V[$k][$i+1] =
$s * $this->V[$k][
$i] + $c *
$h;
245 $this->V[$k][
$i] = $c * $this->V[$k][
$i] -
$s *
$h;
248 $p = -
$s * $s2 * $c3 * $el1 * $this->
e[
$l] / $dl1;
249 $this->
e[
$l] =
$s * $p;
250 $this->d[
$l] = $c * $p;
252 }
while (abs($this->
e[$l]) >
$eps * $tst1);
254 $this->d[
$l] = $this->d[
$l] + $f;
259 for (
$i = 0;
$i < $this->n - 1; ++
$i) {
263 if ($this->d[$j] < $p) {
269 $this->d[$k] = $this->d[
$i];
272 $p = $this->V[$j][
$i];
273 $this->V[$j][
$i] = $this->V[$j][$k];
274 $this->V[$j][$k] = $p;
295 for (
$m = $low+1;
$m <= $high-1; ++
$m) {
299 $scale = $scale + abs($this->H[
$i][
$m-1]);
305 $this->ort[
$i] = $this->H[
$i][
$m-1] / $scale;
306 $h += $this->ort[
$i] * $this->ort[
$i];
309 if ($this->ort[
$m] > 0) {
312 $h -= $this->ort[
$m] * $g;
313 $this->ort[
$m] -= $g;
319 $f += $this->ort[
$i] * $this->H[
$i][$j];
323 $this->H[
$i][$j] -= $f * $this->ort[
$i];
326 for (
$i = 0;
$i <= $high; ++
$i) {
328 for ($j = $high; $j >=
$m; --$j) {
329 $f += $this->ort[$j] * $this->H[
$i][$j];
332 for ($j =
$m; $j <= $high; ++$j) {
333 $this->H[
$i][$j] -= $f * $this->ort[$j];
336 $this->ort[
$m] = $scale * $this->ort[
$m];
337 $this->H[
$m][
$m-1] = $scale * $g;
344 $this->V[
$i][$j] = (
$i == $j ? 1.0 : 0.0);
347 for (
$m = $high-1;
$m >= $low+1; --
$m) {
348 if ($this->H[
$m][
$m-1] != 0.0) {
349 for (
$i =
$m+1;
$i <= $high; ++
$i) {
350 $this->ort[
$i] = $this->H[
$i][
$m-1];
352 for ($j =
$m; $j <= $high; ++$j) {
355 $g += $this->ort[
$i] * $this->V[
$i][$j];
358 $g = ($g / $this->ort[
$m]) / $this->H[
$m][
$m-1];
360 $this->V[
$i][$j] += $g * $this->ort[
$i];
373 private function cdiv($xr, $xi, $yr, $yi) {
374 if (abs($yr) > abs($yi)) {
377 $this->cdivr = ($xr +
$r * $xi) /
$d;
378 $this->cdivi = ($xi -
$r * $xr) /
$d;
382 $this->cdivr = (
$r * $xr + $xi) /
$d;
383 $this->cdivi = (
$r * $xi - $xr) /
$d;
404 $eps = pow(2.0, -52.0);
406 $p = $q =
$r =
$s = $z = 0;
410 for (
$i = 0;
$i < $nn; ++
$i) {
411 if ((
$i < $low) OR (
$i > $high)) {
412 $this->d[
$i] = $this->H[
$i][
$i];
415 for ($j = max(
$i-1, 0); $j < $nn; ++$j) {
416 $norm = $norm + abs($this->H[
$i][$j]);
426 $s = abs($this->H[
$l-1][
$l-1]) + abs($this->H[
$l][
$l]);
430 if (abs($this->H[$l][$l-1]) <
$eps *
$s) {
438 $this->H[
$n][
$n] = $this->H[
$n][
$n] + $exshift;
439 $this->d[
$n] = $this->H[
$n][
$n];
444 }
else if (
$l ==
$n-1) {
446 $p = ($this->H[
$n-1][
$n-1] - $this->H[
$n][
$n]) / 2.0;
449 $this->H[
$n][
$n] = $this->H[
$n][
$n] + $exshift;
450 $this->H[
$n-1][
$n-1] = $this->H[
$n-1][
$n-1] + $exshift;
459 $this->d[
$n-1] =
$x + $z;
460 $this->d[
$n] = $this->d[
$n-1];
462 $this->d[
$n] =
$x - $w / $z;
464 $this->
e[
$n-1] = 0.0;
467 $s = abs(
$x) + abs($z);
470 $r = sqrt($p * $p + $q * $q);
474 for ($j =
$n-1; $j < $nn; ++$j) {
475 $z = $this->H[
$n-1][$j];
476 $this->H[
$n-1][$j] = $q * $z + $p * $this->H[
$n][$j];
477 $this->H[
$n][$j] = $q * $this->H[
$n][$j] - $p * $z;
481 $z = $this->H[
$i][
$n-1];
482 $this->H[
$i][
$n-1] = $q * $z + $p * $this->H[
$i][
$n];
483 $this->H[
$i][
$n] = $q * $this->H[
$i][
$n] - $p * $z;
486 for (
$i = $low;
$i <= $high; ++
$i) {
487 $z = $this->V[
$i][
$n-1];
488 $this->V[
$i][
$n-1] = $q * $z + $p * $this->V[
$i][
$n];
489 $this->V[
$i][
$n] = $q * $this->V[
$i][
$n] - $p * $z;
493 $this->d[
$n-1] =
$x + $p;
494 $this->d[
$n] =
$x + $p;
507 $y = $this->H[
$n-1][
$n-1];
516 $s = abs($this->H[
$n][
$n-1]) + abs($this->H[
$n-1][
$n-2]);
534 $x =
$y = $w = 0.964;
542 $z = $this->H[
$m][
$m];
546 $q = $this->H[
$m+1][
$m+1] - $z -
$r -
$s;
547 $r = $this->H[
$m+2][
$m+1];
548 $s = abs($p) + abs($q) + abs(
$r);
555 if (abs($this->H[
$m][
$m-1]) * (abs($q) + abs(
$r)) <
556 $eps * (abs($p) * (abs($this->H[
$m-1][
$m-1]) + abs($z) + abs($this->H[
$m+1][
$m+1])))) {
562 $this->H[
$i][
$i-2] = 0.0;
564 $this->H[
$i][
$i-3] = 0.0;
568 for ($k =
$m; $k <=
$n-1; ++$k) {
569 $notlast = ($k !=
$n-1);
571 $p = $this->H[$k][$k-1];
572 $q = $this->H[$k+1][$k-1];
573 $r = ($notlast ? $this->H[$k+2][$k-1] : 0.0);
574 $x = abs($p) + abs($q) + abs(
$r);
584 $s = sqrt($p * $p + $q * $q +
$r *
$r);
590 $this->H[$k][$k-1] = -
$s *
$x;
591 } elseif (
$l !=
$m) {
592 $this->H[$k][$k-1] = -$this->H[$k][$k-1];
601 for ($j = $k; $j < $nn; ++$j) {
602 $p = $this->H[$k][$j] + $q * $this->H[$k+1][$j];
604 $p = $p + $r * $this->H[$k+2][$j];
605 $this->H[$k+2][$j] = $this->H[$k+2][$j] - $p * $z;
607 $this->H[$k][$j] = $this->H[$k][$j] - $p *
$x;
608 $this->H[$k+1][$j] = $this->H[$k+1][$j] - $p *
$y;
611 for (
$i = 0;
$i <= min(
$n, $k+3); ++
$i) {
612 $p =
$x * $this->H[
$i][$k] +
$y * $this->H[
$i][$k+1];
614 $p = $p + $z * $this->H[
$i][$k+2];
615 $this->H[
$i][$k+2] = $this->H[
$i][$k+2] - $p *
$r;
617 $this->H[
$i][$k] = $this->H[
$i][$k] - $p;
618 $this->H[
$i][$k+1] = $this->H[
$i][$k+1] - $p * $q;
621 for (
$i = $low;
$i <= $high; ++
$i) {
622 $p =
$x * $this->V[
$i][$k] +
$y * $this->V[
$i][$k+1];
624 $p = $p + $z * $this->V[
$i][$k+2];
625 $this->V[
$i][$k+2] = $this->V[
$i][$k+2] - $p *
$r;
627 $this->V[
$i][$k] = $this->V[
$i][$k] - $p;
628 $this->V[
$i][$k+1] = $this->V[
$i][$k+1] - $p * $q;
640 for (
$n = $nn-1;
$n >= 0; --
$n) {
646 $this->H[
$n][
$n] = 1.0;
648 $w = $this->H[
$i][
$i] - $p;
650 for ($j =
$l; $j <=
$n; ++$j) {
651 $r =
$r + $this->H[
$i][$j] * $this->H[$j][
$n];
653 if ($this->
e[
$i] < 0.0) {
658 if ($this->
e[
$i] == 0.0) {
668 $q = ($this->d[
$i] - $p) * ($this->d[
$i] - $p) + $this->
e[
$i] * $this->
e[
$i];
671 if (abs(
$x) > abs($z)) {
678 $t = abs($this->H[
$i][
$n]);
679 if ((
$eps *
$t) * $t > 1) {
680 for ($j =
$i; $j <=
$n; ++$j) {
681 $this->H[$j][
$n] = $this->H[$j][
$n] /
$t;
690 if (abs($this->H[
$n][
$n-1]) > abs($this->H[
$n-1][
$n])) {
691 $this->H[
$n-1][
$n-1] = $q / $this->H[
$n][
$n-1];
692 $this->H[
$n-1][
$n] = -($this->H[
$n][
$n] - $p) / $this->H[
$n][
$n-1];
694 $this->
cdiv(0.0, -$this->H[
$n-1][
$n], $this->H[
$n-1][
$n-1] - $p, $q);
698 $this->H[
$n][
$n-1] = 0.0;
699 $this->H[
$n][
$n] = 1.0;
704 for ($j =
$l; $j <=
$n; ++$j) {
705 $ra = $ra + $this->H[
$i][$j] * $this->H[$j][
$n-1];
706 $sa = $sa + $this->H[
$i][$j] * $this->H[$j][
$n];
708 $w = $this->H[
$i][
$i] - $p;
709 if ($this->
e[
$i] < 0.0) {
715 if ($this->
e[
$i] == 0) {
716 $this->
cdiv(-$ra, -$sa,
$w, $q);
723 $vr = ($this->d[
$i] - $p) * ($this->d[
$i] - $p) + $this->
e[
$i] * $this->
e[
$i] - $q * $q;
724 $vi = ($this->d[
$i] - $p) * 2.0 * $q;
725 if ($vr == 0.0 & $vi == 0.0) {
726 $vr =
$eps * $norm * (abs(
$w) + abs($q) + abs(
$x) + abs(
$y) + abs($z));
728 $this->
cdiv(
$x *
$r - $z * $ra + $q * $sa,
$x *
$s - $z * $sa - $q * $ra, $vr, $vi);
731 if (abs(
$x) > (abs($z) + abs($q))) {
732 $this->H[
$i+1][
$n-1] = (-$ra -
$w * $this->H[
$i][
$n-1] + $q * $this->H[
$i][
$n]) /
$x;
733 $this->H[
$i+1][
$n] = (-$sa -
$w * $this->H[
$i][
$n] - $q * $this->H[
$i][
$n-1]) /
$x;
741 $t = max(abs($this->H[
$i][
$n-1]),abs($this->H[
$i][
$n]));
742 if ((
$eps *
$t) * $t > 1) {
743 for ($j =
$i; $j <=
$n; ++$j) {
744 $this->H[$j][$n-1] = $this->H[$j][$n-1] /
$t;
745 $this->H[$j][
$n] = $this->H[$j][
$n] /
$t;
754 for (
$i = 0;
$i < $nn; ++
$i) {
755 if ($i < $low | $i > $high) {
756 for ($j =
$i; $j < $nn; ++$j) {
757 $this->V[
$i][$j] = $this->H[
$i][$j];
763 for ($j = $nn-1; $j >= $low; --$j) {
764 for (
$i = $low;
$i <= $high; ++
$i) {
766 for ($k = $low; $k <= min($j,$high); ++$k) {
767 $z = $z + $this->V[
$i][$k] * $this->H[$k][$j];
769 $this->V[
$i][$j] = $z;
783 $this->A = $Arg->getArray();
784 $this->
n = $Arg->getColumnDimension();
801 $this->ort =
array();
817 return new Matrix($this->V, $this->
n, $this->
n);
851 $D[
$i] = array_fill(0, $this->n, 0.0);
852 $D[
$i][
$i] = $this->d[
$i];
853 if ($this->
e[
$i] == 0) {
856 $o = ($this->
e[
$i] > 0) ?
$i + 1 :
$i - 1;
857 $D[
$i][$o] = $this->
e[
$i];
859 return new Matrix($D);
tred2()
Symmetric Householder reduction to tridiagonal form.
__construct($Arg)
Constructor: Check for symmetry, then construct the eigenvalue decomposition.
tql2()
Symmetric tridiagonal QL algorithm.
getImagEigenvalues()
Return the imaginary parts of the eigenvalues.
hqr2()
Nonsymmetric reduction from Hessenberg to real Schur form.
getD()
Return the block diagonal eigenvalue matrix.
orthes()
Nonsymmetric reduction to Hessenberg form.
if(! $in) print Initializing normalization quick check tables n
getRealEigenvalues()
Return the real parts of the eigenvalues.
Create styles array
The data for the language used.
getV()
Return the eigenvector matrix.
cdiv($xr, $xi, $yr, $yi)
Performs complex division.