1 Clazz.declarePackage ("JU");
2 Clazz.load (["javajs.api.EigenInterface"], "JU.Eigen", ["JU.V3"], function () {
3 c$ = Clazz.decorateAsClass (function () {
8 Clazz.instantialize (this, arguments);
9 }, JU, "Eigen", null, javajs.api.EigenInterface);
10 Clazz.makeConstructor (c$,
13 Clazz.defineMethod (c$, "set",
16 this.V = Clazz.newDoubleArray (n, n, 0);
17 this.d = Clazz.newDoubleArray (n, 0);
18 this.e = Clazz.newDoubleArray (n, 0);
21 Clazz.overrideMethod (c$, "setM",
27 Clazz.overrideMethod (c$, "getEigenvalues",
31 Clazz.overrideMethod (c$, "fillFloatArrays",
32 function (eigenVectors, eigenValues) {
33 for (var i = 0; i < 3; i++) {
34 if (eigenVectors != null) {
35 if (eigenVectors[i] == null) eigenVectors[i] = new JU.V3 ();
36 eigenVectors[i].set (this.V[0][i], this.V[1][i], this.V[2][i]);
37 }if (eigenValues != null) eigenValues[i] = this.d[i];
40 Clazz.overrideMethod (c$, "getEigenvectorsFloatTransposed",
42 var f = Clazz.newFloatArray (this.n, this.n, 0);
43 for (var i = this.n; --i >= 0; ) for (var j = this.n; --j >= 0; ) f[j][i] = this.V[i][j];
48 Clazz.defineMethod (c$, "calc",
50 for (var i = 0; i < this.n; i++) {
51 for (var j = 0; j < this.n; j++) {
52 this.V[i][j] = A[i][j];
58 Clazz.defineMethod (c$, "getRealEigenvalues",
62 Clazz.defineMethod (c$, "getImagEigenvalues",
66 Clazz.defineMethod (c$, "tred2",
68 for (var j = 0; j < this.n; j++) {
69 this.d[j] = this.V[this.n - 1][j];
71 for (var i = this.n - 1; i > 0; i--) {
74 for (var k = 0; k < i; k++) {
75 scale = scale + Math.abs (this.d[k]);
78 this.e[i] = this.d[i - 1];
79 for (var j = 0; j < i; j++) {
80 this.d[j] = this.V[i - 1][j];
85 for (var k = 0; k < i; k++) {
87 h += this.d[k] * this.d[k];
89 var f = this.d[i - 1];
90 var g = Math.sqrt (h);
93 }this.e[i] = scale * g;
95 this.d[i - 1] = f - g;
96 for (var j = 0; j < i; j++) {
99 for (var j = 0; j < i; j++) {
102 g = this.e[j] + this.V[j][j] * f;
103 for (var k = j + 1; k <= i - 1; k++) {
104 g += this.V[k][j] * this.d[k];
105 this.e[k] += this.V[k][j] * f;
110 for (var j = 0; j < i; j++) {
112 f += this.e[j] * this.d[j];
114 var hh = f / (h + h);
115 for (var j = 0; j < i; j++) {
116 this.e[j] -= hh * this.d[j];
118 for (var j = 0; j < i; j++) {
121 for (var k = j; k <= i - 1; k++) {
122 this.V[k][j] -= (f * this.e[k] + g * this.d[k]);
124 this.d[j] = this.V[i - 1][j];
129 for (var i = 0; i < this.n - 1; i++) {
130 this.V[this.n - 1][i] = this.V[i][i];
132 var h = this.d[i + 1];
134 for (var k = 0; k <= i; k++) {
135 this.d[k] = this.V[k][i + 1] / h;
137 for (var j = 0; j <= i; j++) {
139 for (var k = 0; k <= i; k++) {
140 g += this.V[k][i + 1] * this.V[k][j];
142 for (var k = 0; k <= i; k++) {
143 this.V[k][j] -= g * this.d[k];
146 }for (var k = 0; k <= i; k++) {
147 this.V[k][i + 1] = 0.0;
150 for (var j = 0; j < this.n; j++) {
151 this.d[j] = this.V[this.n - 1][j];
152 this.V[this.n - 1][j] = 0.0;
154 this.V[this.n - 1][this.n - 1] = 1.0;
157 Clazz.defineMethod (c$, "tql2",
159 for (var i = 1; i < this.n; i++) {
160 this.e[i - 1] = this.e[i];
162 this.e[this.n - 1] = 0.0;
165 var eps = Math.pow (2.0, -52.0);
166 for (var l = 0; l < this.n; l++) {
167 tst1 = Math.max (tst1, Math.abs (this.d[l]) + Math.abs (this.e[l]));
170 if (Math.abs (this.e[m]) <= eps * tst1) {
179 var p = (this.d[l + 1] - g) / (2.0 * this.e[l]);
180 var r = JU.Eigen.hypot (p, 1.0);
183 }this.d[l] = this.e[l] / (p + r);
184 this.d[l + 1] = this.e[l] * (p + r);
185 var dl1 = this.d[l + 1];
186 var h = g - this.d[l];
187 for (var i = l + 2; i < this.n; i++) {
195 var el1 = this.e[l + 1];
198 for (var i = m - 1; i >= l; i--) {
204 r = JU.Eigen.hypot (p, this.e[i]);
205 this.e[i + 1] = s * r;
208 p = c * this.d[i] - s * g;
209 this.d[i + 1] = h + s * (c * g + s * this.d[i]);
210 for (var k = 0; k < this.n; k++) {
211 h = this.V[k][i + 1];
212 this.V[k][i + 1] = s * this.V[k][i] + c * h;
213 this.V[k][i] = c * this.V[k][i] - s * h;
216 p = -s * s2 * c3 * el1 * this.e[l] / dl1;
219 } while (Math.abs (this.e[l]) > eps * tst1);
220 }this.d[l] = this.d[l] + f;
223 for (var i = 0; i < this.n - 1; i++) {
226 for (var j = i + 1; j < this.n; j++) {
232 this.d[k] = this.d[i];
234 for (var j = 0; j < this.n; j++) {
236 this.V[j][i] = this.V[j][k];
241 c$.hypot = Clazz.defineMethod (c$, "hypot",
244 if (Math.abs (a) > Math.abs (b)) {
246 r = Math.abs (a) * Math.sqrt (1 + r * r);
249 r = Math.abs (b) * Math.sqrt (1 + r * r);