mathjs 11.11.2 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +48 -0
- package/README.md +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +2 -2
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/create.js +2 -2
- package/lib/cjs/defaultInstance.js +2 -2
- package/lib/cjs/entry/allFactoriesAny.js +2 -2
- package/lib/cjs/entry/allFactoriesNumber.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesDistance.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesLsolve.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesLsolveAll.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesLup.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesQr.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesStirlingS2.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesSubtract.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesSubtractScalar.generated.js +17 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesUsolve.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesUsolveAll.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny.generated.js +7 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -2
- package/lib/cjs/entry/dependenciesNumber/dependenciesSubtractScalar.generated.js +17 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +7 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +4 -3
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +2 -1
- package/lib/cjs/entry/pureFunctionsAny.generated.js +43 -37
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +16 -13
- package/lib/cjs/expression/embeddedDocs/function/matrix/eigs.js +2 -2
- package/lib/cjs/expression/node/AssignmentNode.js +1 -1
- package/lib/cjs/expression/node/FunctionAssignmentNode.js +1 -1
- package/lib/cjs/expression/parse.js +50 -69
- package/lib/cjs/factoriesAny.js +7 -0
- package/lib/cjs/factoriesNumber.js +2 -1
- package/lib/cjs/function/algebra/decomposition/lup.js +3 -3
- package/lib/cjs/function/algebra/decomposition/qr.js +5 -5
- package/lib/cjs/function/algebra/solver/lsolve.js +4 -4
- package/lib/cjs/function/algebra/solver/lsolveAll.js +6 -6
- package/lib/cjs/function/algebra/solver/usolve.js +4 -4
- package/lib/cjs/function/algebra/solver/usolveAll.js +6 -6
- package/lib/cjs/function/arithmetic/subtract.js +7 -37
- package/lib/cjs/function/arithmetic/subtractScalar.js +52 -0
- package/lib/cjs/function/combinatorics/stirlingS2.js +2 -2
- package/lib/cjs/function/geometry/distance.js +10 -10
- package/lib/cjs/function/matrix/det.js +4 -4
- package/lib/cjs/function/matrix/eigs/complexEigs.js +73 -68
- package/lib/cjs/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +57 -51
- package/lib/cjs/function/matrix/eigs.js +118 -45
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/type/unit/Unit.js +5 -5
- package/lib/cjs/utils/number.js +1 -1
- package/lib/cjs/utils/object.js +4 -2
- package/lib/cjs/utils/snapshot.js +3 -3
- package/lib/cjs/utils/string.js +12 -16
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesDistance.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesLsolve.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesLsolveAll.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesLup.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesQr.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesStirlingS2.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesSubtract.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesSubtractScalar.generated.js +10 -0
- package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesUsolve.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny/dependenciesUsolveAll.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny.generated.js +1 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -2
- package/lib/esm/entry/dependenciesNumber/dependenciesSubtractScalar.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +5 -4
- package/lib/esm/entry/impureFunctionsNumber.generated.js +3 -2
- package/lib/esm/entry/pureFunctionsAny.generated.js +42 -37
- package/lib/esm/entry/pureFunctionsNumber.generated.js +16 -13
- package/lib/esm/expression/embeddedDocs/function/matrix/eigs.js +2 -2
- package/lib/esm/expression/node/AssignmentNode.js +1 -1
- package/lib/esm/expression/node/FunctionAssignmentNode.js +1 -1
- package/lib/esm/expression/parse.js +50 -69
- package/lib/esm/factoriesAny.js +1 -0
- package/lib/esm/factoriesNumber.js +1 -0
- package/lib/esm/function/algebra/decomposition/lup.js +3 -3
- package/lib/esm/function/algebra/decomposition/qr.js +5 -5
- package/lib/esm/function/algebra/solver/lsolve.js +4 -4
- package/lib/esm/function/algebra/solver/lsolveAll.js +6 -6
- package/lib/esm/function/algebra/solver/usolve.js +4 -4
- package/lib/esm/function/algebra/solver/usolveAll.js +6 -6
- package/lib/esm/function/arithmetic/subtract.js +7 -27
- package/lib/esm/function/arithmetic/subtractScalar.js +46 -0
- package/lib/esm/function/combinatorics/stirlingS2.js +2 -2
- package/lib/esm/function/geometry/distance.js +10 -10
- package/lib/esm/function/matrix/det.js +4 -4
- package/lib/esm/function/matrix/eigs/complexEigs.js +73 -68
- package/lib/esm/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +55 -51
- package/lib/esm/function/matrix/eigs.js +119 -47
- package/lib/esm/type/unit/Unit.js +5 -5
- package/lib/esm/utils/number.js +1 -1
- package/lib/esm/utils/object.js +5 -3
- package/lib/esm/utils/snapshot.js +1 -1
- package/lib/esm/utils/string.js +12 -16
- package/lib/esm/version.js +1 -1
- package/package.json +14 -14
- package/types/EXPLANATION.md +54 -0
- package/types/index.d.ts +6797 -6446
|
@@ -27,25 +27,29 @@ function createRealSymmetric(_ref) {
|
|
|
27
27
|
function main(arr, N) {
|
|
28
28
|
var prec = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : config.epsilon;
|
|
29
29
|
var type = arguments.length > 3 ? arguments[3] : undefined;
|
|
30
|
+
var computeVectors = arguments.length > 4 ? arguments[4] : undefined;
|
|
30
31
|
if (type === 'number') {
|
|
31
|
-
return diag(arr, prec);
|
|
32
|
+
return diag(arr, prec, computeVectors);
|
|
32
33
|
}
|
|
33
34
|
if (type === 'BigNumber') {
|
|
34
|
-
return diagBig(arr, prec);
|
|
35
|
+
return diagBig(arr, prec, computeVectors);
|
|
35
36
|
}
|
|
36
37
|
throw TypeError('Unsupported data type: ' + type);
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
// diagonalization implementation for number (efficient)
|
|
40
|
-
function diag(x, precision) {
|
|
41
|
+
function diag(x, precision, computeVectors) {
|
|
41
42
|
var N = x.length;
|
|
42
43
|
var e0 = Math.abs(precision / N);
|
|
43
44
|
var psi;
|
|
44
|
-
var Sij
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Sij
|
|
48
|
-
|
|
45
|
+
var Sij;
|
|
46
|
+
if (computeVectors) {
|
|
47
|
+
Sij = new Array(N);
|
|
48
|
+
// Sij is Identity Matrix
|
|
49
|
+
for (var i = 0; i < N; i++) {
|
|
50
|
+
Sij[i] = Array(N).fill(0);
|
|
51
|
+
Sij[i][i] = 1.0;
|
|
52
|
+
}
|
|
49
53
|
}
|
|
50
54
|
// initial error
|
|
51
55
|
var Vab = getAij(x);
|
|
@@ -54,26 +58,29 @@ function createRealSymmetric(_ref) {
|
|
|
54
58
|
var j = Vab[0][1];
|
|
55
59
|
psi = getTheta(x[_i][_i], x[j][j], x[_i][j]);
|
|
56
60
|
x = x1(x, psi, _i, j);
|
|
57
|
-
Sij = Sij1(Sij, psi, _i, j);
|
|
61
|
+
if (computeVectors) Sij = Sij1(Sij, psi, _i, j);
|
|
58
62
|
Vab = getAij(x);
|
|
59
63
|
}
|
|
60
|
-
var Ei =
|
|
64
|
+
var Ei = Array(N).fill(0); // eigenvalues
|
|
61
65
|
for (var _i2 = 0; _i2 < N; _i2++) {
|
|
62
66
|
Ei[_i2] = x[_i2][_i2];
|
|
63
67
|
}
|
|
64
|
-
return sorting((0, _object.clone)(Ei),
|
|
68
|
+
return sorting((0, _object.clone)(Ei), Sij, computeVectors);
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
// diagonalization implementation for bigNumber
|
|
68
|
-
function diagBig(x, precision) {
|
|
72
|
+
function diagBig(x, precision, computeVectors) {
|
|
69
73
|
var N = x.length;
|
|
70
74
|
var e0 = abs(precision / N);
|
|
71
75
|
var psi;
|
|
72
|
-
var Sij
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
Sij
|
|
76
|
-
|
|
76
|
+
var Sij;
|
|
77
|
+
if (computeVectors) {
|
|
78
|
+
Sij = new Array(N);
|
|
79
|
+
// Sij is Identity Matrix
|
|
80
|
+
for (var i = 0; i < N; i++) {
|
|
81
|
+
Sij[i] = Array(N).fill(0);
|
|
82
|
+
Sij[i][i] = 1.0;
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
85
|
// initial error
|
|
79
86
|
var Vab = getAijBig(x);
|
|
@@ -82,15 +89,15 @@ function createRealSymmetric(_ref) {
|
|
|
82
89
|
var j = Vab[0][1];
|
|
83
90
|
psi = getThetaBig(x[_i3][_i3], x[j][j], x[_i3][j]);
|
|
84
91
|
x = x1Big(x, psi, _i3, j);
|
|
85
|
-
Sij = Sij1Big(Sij, psi, _i3, j);
|
|
92
|
+
if (computeVectors) Sij = Sij1Big(Sij, psi, _i3, j);
|
|
86
93
|
Vab = getAijBig(x);
|
|
87
94
|
}
|
|
88
|
-
var Ei =
|
|
95
|
+
var Ei = Array(N).fill(0); // eigenvalues
|
|
89
96
|
for (var _i4 = 0; _i4 < N; _i4++) {
|
|
90
97
|
Ei[_i4] = x[_i4][_i4];
|
|
91
98
|
}
|
|
92
99
|
// return [clone(Ei), clone(Sij)]
|
|
93
|
-
return sorting((0, _object.clone)(Ei),
|
|
100
|
+
return sorting((0, _object.clone)(Ei), Sij, computeVectors);
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
// get angle
|
|
@@ -118,8 +125,8 @@ function createRealSymmetric(_ref) {
|
|
|
118
125
|
var N = Sij.length;
|
|
119
126
|
var c = Math.cos(theta);
|
|
120
127
|
var s = Math.sin(theta);
|
|
121
|
-
var Ski =
|
|
122
|
-
var Skj =
|
|
128
|
+
var Ski = Array(N).fill(0);
|
|
129
|
+
var Skj = Array(N).fill(0);
|
|
123
130
|
for (var k = 0; k < N; k++) {
|
|
124
131
|
Ski[k] = c * Sij[k][i] - s * Sij[k][j];
|
|
125
132
|
Skj[k] = s * Sij[k][i] + c * Sij[k][j];
|
|
@@ -135,8 +142,8 @@ function createRealSymmetric(_ref) {
|
|
|
135
142
|
var N = Sij.length;
|
|
136
143
|
var c = cos(theta);
|
|
137
144
|
var s = sin(theta);
|
|
138
|
-
var Ski =
|
|
139
|
-
var Skj =
|
|
145
|
+
var Ski = Array(N).fill(bignumber(0));
|
|
146
|
+
var Skj = Array(N).fill(bignumber(0));
|
|
140
147
|
for (var k = 0; k < N; k++) {
|
|
141
148
|
Ski[k] = subtract(multiplyScalar(c, Sij[k][i]), multiplyScalar(s, Sij[k][j]));
|
|
142
149
|
Skj[k] = addScalar(multiplyScalar(s, Sij[k][i]), multiplyScalar(c, Sij[k][j]));
|
|
@@ -155,8 +162,8 @@ function createRealSymmetric(_ref) {
|
|
|
155
162
|
var s = bignumber(sin(theta));
|
|
156
163
|
var c2 = multiplyScalar(c, c);
|
|
157
164
|
var s2 = multiplyScalar(s, s);
|
|
158
|
-
var Aki =
|
|
159
|
-
var Akj =
|
|
165
|
+
var Aki = Array(N).fill(bignumber(0));
|
|
166
|
+
var Akj = Array(N).fill(bignumber(0));
|
|
160
167
|
// 2cs Hij
|
|
161
168
|
var csHij = multiply(bignumber(2), c, s, Hij[i][j]);
|
|
162
169
|
// Aii
|
|
@@ -191,8 +198,8 @@ function createRealSymmetric(_ref) {
|
|
|
191
198
|
var s = Math.sin(theta);
|
|
192
199
|
var c2 = c * c;
|
|
193
200
|
var s2 = s * s;
|
|
194
|
-
var Aki =
|
|
195
|
-
var Akj =
|
|
201
|
+
var Aki = Array(N).fill(0);
|
|
202
|
+
var Akj = Array(N).fill(0);
|
|
196
203
|
// Aii
|
|
197
204
|
var Aii = c2 * Hij[i][i] - 2 * c * s * Hij[i][j] + s2 * Hij[j][j];
|
|
198
205
|
var Ajj = s2 * Hij[i][i] + 2 * c * s * Hij[i][j] + c2 * Hij[j][j];
|
|
@@ -251,12 +258,15 @@ function createRealSymmetric(_ref) {
|
|
|
251
258
|
}
|
|
252
259
|
|
|
253
260
|
// sort results
|
|
254
|
-
function sorting(E, S) {
|
|
261
|
+
function sorting(E, S, computeVectors) {
|
|
255
262
|
var N = E.length;
|
|
256
263
|
var values = Array(N);
|
|
257
|
-
var
|
|
258
|
-
|
|
259
|
-
|
|
264
|
+
var vecs;
|
|
265
|
+
if (computeVectors) {
|
|
266
|
+
vecs = Array(N);
|
|
267
|
+
for (var k = 0; k < N; k++) {
|
|
268
|
+
vecs[k] = Array(N);
|
|
269
|
+
}
|
|
260
270
|
}
|
|
261
271
|
for (var i = 0; i < N; i++) {
|
|
262
272
|
var minID = 0;
|
|
@@ -268,30 +278,26 @@ function createRealSymmetric(_ref) {
|
|
|
268
278
|
}
|
|
269
279
|
}
|
|
270
280
|
values[i] = E.splice(minID, 1)[0];
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
281
|
+
if (computeVectors) {
|
|
282
|
+
for (var _k5 = 0; _k5 < N; _k5++) {
|
|
283
|
+
vecs[i][_k5] = S[_k5][minID];
|
|
284
|
+
S[_k5].splice(minID, 1);
|
|
285
|
+
}
|
|
274
286
|
}
|
|
275
287
|
}
|
|
288
|
+
if (!computeVectors) return {
|
|
289
|
+
values: values
|
|
290
|
+
};
|
|
291
|
+
var eigenvectors = vecs.map(function (vector, i) {
|
|
292
|
+
return {
|
|
293
|
+
value: values[i],
|
|
294
|
+
vector: vector
|
|
295
|
+
};
|
|
296
|
+
});
|
|
276
297
|
return {
|
|
277
298
|
values: values,
|
|
278
|
-
|
|
299
|
+
eigenvectors: eigenvectors
|
|
279
300
|
};
|
|
280
301
|
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Create an array of a certain size and fill all items with an initial value
|
|
284
|
-
* @param {number} size
|
|
285
|
-
* @param {number} value
|
|
286
|
-
* @return {number[]}
|
|
287
|
-
*/
|
|
288
|
-
function createArray(size, value) {
|
|
289
|
-
// TODO: as soon as all browsers support Array.fill, use that instead (IE doesn't support it)
|
|
290
|
-
var array = new Array(size);
|
|
291
|
-
for (var i = 0; i < size; i++) {
|
|
292
|
-
array[i] = value;
|
|
293
|
-
}
|
|
294
|
-
return array;
|
|
295
|
-
}
|
|
296
302
|
return main;
|
|
297
303
|
}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.createEigs = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
7
9
|
var _factory = require("../../utils/factory.js");
|
|
8
10
|
var _string = require("../../utils/string.js");
|
|
9
11
|
var _complexEigs = require("./eigs/complexEigs.js");
|
|
10
|
-
var
|
|
12
|
+
var _realSymmetric = require("./eigs/realSymmetric.js");
|
|
11
13
|
var _is = require("../../utils/is.js");
|
|
12
14
|
var name = 'eigs';
|
|
13
15
|
|
|
14
16
|
// The absolute state of math.js's dependency system:
|
|
15
|
-
var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
|
|
17
|
+
var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'size', 'reshape', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
|
|
16
18
|
var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
17
19
|
var config = _ref.config,
|
|
18
20
|
typed = _ref.typed,
|
|
@@ -37,6 +39,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
37
39
|
complex = _ref.complex,
|
|
38
40
|
sqrt = _ref.sqrt,
|
|
39
41
|
diag = _ref.diag,
|
|
42
|
+
size = _ref.size,
|
|
43
|
+
reshape = _ref.reshape,
|
|
40
44
|
qr = _ref.qr,
|
|
41
45
|
usolve = _ref.usolve,
|
|
42
46
|
usolveAll = _ref.usolveAll,
|
|
@@ -45,7 +49,7 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
45
49
|
smaller = _ref.smaller,
|
|
46
50
|
matrixFromColumns = _ref.matrixFromColumns,
|
|
47
51
|
dot = _ref.dot;
|
|
48
|
-
var
|
|
52
|
+
var doRealSymmetric = (0, _realSymmetric.createRealSymmetric)({
|
|
49
53
|
config: config,
|
|
50
54
|
addScalar: addScalar,
|
|
51
55
|
subtract: subtract,
|
|
@@ -75,6 +79,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
75
79
|
abs: abs,
|
|
76
80
|
bignumber: bignumber,
|
|
77
81
|
diag: diag,
|
|
82
|
+
size: size,
|
|
83
|
+
reshape: reshape,
|
|
78
84
|
qr: qr,
|
|
79
85
|
inv: inv,
|
|
80
86
|
usolve: usolve,
|
|
@@ -88,26 +94,54 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
88
94
|
});
|
|
89
95
|
|
|
90
96
|
/**
|
|
91
|
-
* Compute eigenvalues and eigenvectors of a matrix.
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
97
|
+
* Compute eigenvalues and optionally eigenvectors of a square matrix.
|
|
98
|
+
* The eigenvalues are sorted by their absolute value, ascending, and
|
|
99
|
+
* returned as a vector in the `values` property of the returned project.
|
|
100
|
+
* An eigenvalue with algebraic multiplicity k will be listed k times, so
|
|
101
|
+
* that the returned `values` vector always has length equal to the size
|
|
102
|
+
* of the input matrix.
|
|
103
|
+
*
|
|
104
|
+
* The `eigenvectors` property of the return value provides the eigenvectors.
|
|
105
|
+
* It is an array of plain objects: the `value` property of each gives the
|
|
106
|
+
* associated eigenvalue, and the `vector` property gives the eigenvector
|
|
107
|
+
* itself. Note that the same `value` property will occur as many times in
|
|
108
|
+
* the list provided by `eigenvectors` as the geometric multiplicity of
|
|
109
|
+
* that value.
|
|
110
|
+
*
|
|
111
|
+
* If the algorithm fails to converge, it will throw an error –
|
|
112
|
+
* in that case, however, you may still find useful information
|
|
95
113
|
* in `err.values` and `err.vectors`.
|
|
96
114
|
*
|
|
115
|
+
* Note that the 'precision' option does not directly specify the _accuracy_
|
|
116
|
+
* of the returned eigenvalues. Rather, it determines how small an entry
|
|
117
|
+
* of the iterative approximations to an upper triangular matrix must be
|
|
118
|
+
* in order to be considered zero. The actual accuracy of the returned
|
|
119
|
+
* eigenvalues may be greater or less than the precision, depending on the
|
|
120
|
+
* conditioning of the matrix and how far apart or close the actual
|
|
121
|
+
* eigenvalues are. Note that currently, relatively simple, "traditional"
|
|
122
|
+
* methods of eigenvalue computation are being used; this is not a modern,
|
|
123
|
+
* high-precision eigenvalue computation. That said, it should typically
|
|
124
|
+
* produce fairly reasonable results.
|
|
125
|
+
*
|
|
97
126
|
* Syntax:
|
|
98
127
|
*
|
|
99
128
|
* math.eigs(x, [prec])
|
|
129
|
+
* math.eigs(x, {options})
|
|
100
130
|
*
|
|
101
131
|
* Examples:
|
|
102
132
|
*
|
|
103
|
-
* const { eigs, multiply, column, transpose } = math
|
|
133
|
+
* const { eigs, multiply, column, transpose, matrixFromColumns } = math
|
|
104
134
|
* const H = [[5, 2.3], [2.3, 1]]
|
|
105
|
-
* const ans = eigs(H) // returns {values: [E1,E2...sorted],
|
|
135
|
+
* const ans = eigs(H) // returns {values: [E1,E2...sorted], eigenvectors: [{value: E1, vector: v2}, {value: e, vector: v2}, ...]
|
|
106
136
|
* const E = ans.values
|
|
107
|
-
* const
|
|
108
|
-
* multiply(H,
|
|
109
|
-
* const
|
|
110
|
-
*
|
|
137
|
+
* const V = ans.eigenvectors
|
|
138
|
+
* multiply(H, V[0].vector)) // returns multiply(E[0], V[0].vector))
|
|
139
|
+
* const U = matrixFromColumns(...V.map(obj => obj.vector))
|
|
140
|
+
* const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H if possible
|
|
141
|
+
* E[0] == UTxHxU[0][0] // returns true always
|
|
142
|
+
*
|
|
143
|
+
* // Compute only approximate eigenvalues:
|
|
144
|
+
* const {values} = eigs(H, {eigenvectors: false, precision: 1e-6})
|
|
111
145
|
*
|
|
112
146
|
* See also:
|
|
113
147
|
*
|
|
@@ -115,57 +149,96 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
115
149
|
*
|
|
116
150
|
* @param {Array | Matrix} x Matrix to be diagonalized
|
|
117
151
|
*
|
|
118
|
-
* @param {number | BigNumber} [
|
|
119
|
-
* @return {{values: Array|Matrix,
|
|
152
|
+
* @param {number | BigNumber | OptsObject} [opts] Object with keys `precision`, defaulting to config.epsilon, and `eigenvectors`, defaulting to true and specifying whether to compute eigenvectors. If just a number, specifies precision.
|
|
153
|
+
* @return {{values: Array|Matrix, eigenvectors?: Array<EVobj>}} Object containing an array of eigenvalues and an array of {value: number|BigNumber, vector: Array|Matrix} objects. The eigenvectors property is undefined if eigenvectors were not requested.
|
|
120
154
|
*
|
|
121
155
|
*/
|
|
122
156
|
return typed('eigs', {
|
|
157
|
+
// The conversion to matrix in the first two implementations,
|
|
158
|
+
// just to convert back to an array right away in
|
|
159
|
+
// computeValuesAndVectors, is unfortunate, and should perhaps be
|
|
160
|
+
// streamlined. It is done because the Matrix object carries some
|
|
161
|
+
// type information about its entries, and so constructing the matrix
|
|
162
|
+
// is a roundabout way of doing type detection.
|
|
123
163
|
Array: function Array(x) {
|
|
124
|
-
|
|
125
|
-
return computeValuesAndVectors(mat);
|
|
164
|
+
return doEigs(matrix(x));
|
|
126
165
|
},
|
|
127
166
|
'Array, number|BigNumber': function ArrayNumberBigNumber(x, prec) {
|
|
128
|
-
|
|
129
|
-
|
|
167
|
+
return doEigs(matrix(x), {
|
|
168
|
+
precision: prec
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
'Array, Object': function ArrayObject(x, opts) {
|
|
172
|
+
return doEigs(matrix(x), opts);
|
|
130
173
|
},
|
|
131
174
|
Matrix: function Matrix(mat) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
values: matrix(values),
|
|
137
|
-
vectors: matrix(vectors)
|
|
138
|
-
};
|
|
175
|
+
return doEigs(mat, {
|
|
176
|
+
matricize: true
|
|
177
|
+
});
|
|
139
178
|
},
|
|
140
179
|
'Matrix, number|BigNumber': function MatrixNumberBigNumber(mat, prec) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
180
|
+
return doEigs(mat, {
|
|
181
|
+
precision: prec,
|
|
182
|
+
matricize: true
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
'Matrix, Object': function MatrixObject(mat, opts) {
|
|
186
|
+
var useOpts = {
|
|
187
|
+
matricize: true
|
|
147
188
|
};
|
|
189
|
+
(0, _extends2["default"])(useOpts, opts);
|
|
190
|
+
return doEigs(mat, useOpts);
|
|
148
191
|
}
|
|
149
192
|
});
|
|
150
|
-
function
|
|
151
|
-
|
|
152
|
-
|
|
193
|
+
function doEigs(mat) {
|
|
194
|
+
var _opts$precision;
|
|
195
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
196
|
+
var computeVectors = 'eigenvectors' in opts ? opts.eigenvectors : true;
|
|
197
|
+
var prec = (_opts$precision = opts.precision) !== null && _opts$precision !== void 0 ? _opts$precision : config.epsilon;
|
|
198
|
+
var result = computeValuesAndVectors(mat, prec, computeVectors);
|
|
199
|
+
if (opts.matricize) {
|
|
200
|
+
result.values = matrix(result.values);
|
|
201
|
+
if (computeVectors) {
|
|
202
|
+
result.eigenvectors = result.eigenvectors.map(function (_ref2) {
|
|
203
|
+
var value = _ref2.value,
|
|
204
|
+
vector = _ref2.vector;
|
|
205
|
+
return {
|
|
206
|
+
value: value,
|
|
207
|
+
vector: matrix(vector)
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (computeVectors) {
|
|
213
|
+
Object.defineProperty(result, 'vectors', {
|
|
214
|
+
enumerable: false,
|
|
215
|
+
// to make sure that the eigenvectors can still be
|
|
216
|
+
// converted to string.
|
|
217
|
+
get: function get() {
|
|
218
|
+
throw new Error('eigs(M).vectors replaced with eigs(M).eigenvectors');
|
|
219
|
+
}
|
|
220
|
+
});
|
|
153
221
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
function computeValuesAndVectors(mat, prec, computeVectors) {
|
|
225
|
+
var arr = mat.toArray(); // NOTE: arr is guaranteed to be unaliased
|
|
226
|
+
// and so safe to modify in place
|
|
227
|
+
var asize = mat.size();
|
|
228
|
+
if (asize.length !== 2 || asize[0] !== asize[1]) {
|
|
229
|
+
throw new RangeError("Matrix must be square (size: ".concat((0, _string.format)(asize), ")"));
|
|
157
230
|
}
|
|
158
|
-
var
|
|
159
|
-
var N = size[0];
|
|
231
|
+
var N = asize[0];
|
|
160
232
|
if (isReal(arr, N, prec)) {
|
|
161
|
-
coerceReal(arr, N);
|
|
233
|
+
coerceReal(arr, N); // modifies arr by side effect
|
|
234
|
+
|
|
162
235
|
if (isSymmetric(arr, N, prec)) {
|
|
163
|
-
var _type = coerceTypes(mat, arr, N);
|
|
164
|
-
return
|
|
236
|
+
var _type = coerceTypes(mat, arr, N); // modifies arr by side effect
|
|
237
|
+
return doRealSymmetric(arr, N, prec, _type, computeVectors);
|
|
165
238
|
}
|
|
166
239
|
}
|
|
167
|
-
var type = coerceTypes(mat, arr, N);
|
|
168
|
-
return doComplexEigs(arr, N, prec, type);
|
|
240
|
+
var type = coerceTypes(mat, arr, N); // modifies arr by side effect
|
|
241
|
+
return doComplexEigs(arr, N, prec, type, computeVectors);
|
|
169
242
|
}
|
|
170
243
|
|
|
171
244
|
/** @return {boolean} */
|
package/lib/cjs/header.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* It features real and complex numbers, units, matrices, a large set of
|
|
7
7
|
* mathematical functions, and a flexible expression parser.
|
|
8
8
|
*
|
|
9
|
-
* @version
|
|
10
|
-
* @date 2023-10-
|
|
9
|
+
* @version 12.0.0
|
|
10
|
+
* @date 2023-10-26
|
|
11
11
|
*
|
|
12
12
|
* @license
|
|
13
13
|
* Copyright (C) 2013-2023 Jos de Jong <wjosdejong@gmail.com>
|
|
@@ -17,12 +17,12 @@ var _constants = require("../../utils/bignumber/constants.js");
|
|
|
17
17
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
18
18
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
19
19
|
var name = 'Unit';
|
|
20
|
-
var dependencies = ['?on', 'config', 'addScalar', '
|
|
20
|
+
var dependencies = ['?on', 'config', 'addScalar', 'subtractScalar', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'number', 'Complex', 'BigNumber', 'Fraction'];
|
|
21
21
|
var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
22
22
|
var on = _ref.on,
|
|
23
23
|
config = _ref.config,
|
|
24
24
|
addScalar = _ref.addScalar,
|
|
25
|
-
|
|
25
|
+
subtractScalar = _ref.subtractScalar,
|
|
26
26
|
multiplyScalar = _ref.multiplyScalar,
|
|
27
27
|
divideScalar = _ref.divideScalar,
|
|
28
28
|
pow = _ref.pow,
|
|
@@ -753,7 +753,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
|
|
|
753
753
|
var unitValue = convert(ret.units[0].unit.value);
|
|
754
754
|
var nominalOffset = convert(ret.units[0].unit.offset);
|
|
755
755
|
var unitOffset = multiplyScalar(unitValue, nominalOffset);
|
|
756
|
-
ret.value =
|
|
756
|
+
ret.value = subtractScalar(abs(addScalar(ret.value, unitOffset)), unitOffset);
|
|
757
757
|
}
|
|
758
758
|
}
|
|
759
759
|
for (var i in ret.units) {
|
|
@@ -798,7 +798,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
|
|
|
798
798
|
var otherUnitValue = other.units[0].unit.value;
|
|
799
799
|
var otherNominalOffset = other.units[0].unit.offset;
|
|
800
800
|
var otherUnitOffset = multiplyScalar(otherUnitValue, otherNominalOffset);
|
|
801
|
-
other.value = addScalar(value, convert(
|
|
801
|
+
other.value = addScalar(value, convert(subtractScalar(thisUnitOffset, otherUnitOffset)));
|
|
802
802
|
}
|
|
803
803
|
other.fixPrefix = true;
|
|
804
804
|
other.skipAutomaticSimplification = true;
|
|
@@ -1174,7 +1174,7 @@ var createUnitClass = exports.createUnitClass = /* #__PURE__ */(0, _factory.fact
|
|
|
1174
1174
|
}
|
|
1175
1175
|
var y = new Unit(xFixed, parts[i].toString());
|
|
1176
1176
|
ret.push(y);
|
|
1177
|
-
x =
|
|
1177
|
+
x = subtractScalar(x, y);
|
|
1178
1178
|
}
|
|
1179
1179
|
|
|
1180
1180
|
// This little bit fixes a bug where the remainder should be 0 but is a little bit off.
|
package/lib/cjs/utils/number.js
CHANGED
|
@@ -604,7 +604,7 @@ function nearlyEqual(x, y, epsilon) {
|
|
|
604
604
|
if (isFinite(x) && isFinite(y)) {
|
|
605
605
|
// check numbers are very close, needed when comparing numbers near zero
|
|
606
606
|
var diff = Math.abs(x - y);
|
|
607
|
-
if (diff
|
|
607
|
+
if (diff <= DBL_EPSILON) {
|
|
608
608
|
return true;
|
|
609
609
|
} else {
|
|
610
610
|
// use relative error
|
package/lib/cjs/utils/object.js
CHANGED
|
@@ -54,10 +54,12 @@ function clone(x) {
|
|
|
54
54
|
}
|
|
55
55
|
if (x instanceof Date) return new Date(x.valueOf());
|
|
56
56
|
if ((0, _is.isBigNumber)(x)) return x; // bignumbers are immutable
|
|
57
|
-
if (x instanceof RegExp) throw new TypeError('Cannot clone ' + x); // TODO: clone a RegExp
|
|
58
57
|
|
|
59
58
|
// object
|
|
60
|
-
|
|
59
|
+
if ((0, _is.isObject)(x)) {
|
|
60
|
+
return mapObject(x, clone);
|
|
61
|
+
}
|
|
62
|
+
throw new TypeError("Cannot clone: unknown type of value (value: ".concat(x, ")"));
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
/**
|
|
@@ -14,8 +14,8 @@ var _assert = _interopRequireDefault(require("assert"));
|
|
|
14
14
|
var allIsFunctions = _interopRequireWildcard(require("./is.js"));
|
|
15
15
|
var _create = require("../core/create.js");
|
|
16
16
|
var _string = require("./string.js");
|
|
17
|
-
function _getRequireWildcardCache(
|
|
18
|
-
function _interopRequireWildcard(
|
|
17
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
18
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
19
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
20
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /**
|
|
21
21
|
* This file contains helper methods to create expected snapshot structures
|
|
@@ -141,7 +141,7 @@ function createSnapshotFromFactories(factories) {
|
|
|
141
141
|
embeddedDocs[name] = 'Object';
|
|
142
142
|
}
|
|
143
143
|
});
|
|
144
|
-
embeddedDocs = exclude(embeddedDocs, ['equalScalar', 'apply', 'addScalar', 'multiplyScalar', 'print', 'divideScalar', 'parse', 'compile', 'parser', 'chain', 'reviver', 'replacer']);
|
|
144
|
+
embeddedDocs = exclude(embeddedDocs, ['equalScalar', 'apply', 'addScalar', 'subtractScalar', 'multiplyScalar', 'print', 'divideScalar', 'parse', 'compile', 'parser', 'chain', 'reviver', 'replacer']);
|
|
145
145
|
var allTypeChecks = {};
|
|
146
146
|
Object.keys(allIsFunctions).forEach(function (name) {
|
|
147
147
|
if (name.indexOf('is') === 0) {
|
package/lib/cjs/utils/string.js
CHANGED
|
@@ -92,7 +92,7 @@ function _format(value, options) {
|
|
|
92
92
|
return formatArray(value, options);
|
|
93
93
|
}
|
|
94
94
|
if ((0, _is.isString)(value)) {
|
|
95
|
-
return
|
|
95
|
+
return stringify(value);
|
|
96
96
|
}
|
|
97
97
|
if (typeof value === 'function') {
|
|
98
98
|
return value.syntax ? String(value.syntax) : 'function';
|
|
@@ -105,7 +105,7 @@ function _format(value, options) {
|
|
|
105
105
|
return value.toString(options);
|
|
106
106
|
} else {
|
|
107
107
|
var entries = Object.keys(value).map(function (key) {
|
|
108
|
-
return
|
|
108
|
+
return stringify(key) + ': ' + format(value[key], options);
|
|
109
109
|
});
|
|
110
110
|
return '{' + entries.join(', ') + '}';
|
|
111
111
|
}
|
|
@@ -125,24 +125,20 @@ function stringify(value) {
|
|
|
125
125
|
var i = 0;
|
|
126
126
|
while (i < text.length) {
|
|
127
127
|
var c = text.charAt(i);
|
|
128
|
-
|
|
129
|
-
escaped += c;
|
|
130
|
-
i++;
|
|
131
|
-
c = text.charAt(i);
|
|
132
|
-
if (c === '' || '"\\/bfnrtu'.indexOf(c) === -1) {
|
|
133
|
-
escaped += '\\'; // no valid escape character -> escape it
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
escaped += c;
|
|
137
|
-
} else if (c === '"') {
|
|
138
|
-
escaped += '\\"';
|
|
139
|
-
} else {
|
|
140
|
-
escaped += c;
|
|
141
|
-
}
|
|
128
|
+
escaped += c in controlCharacters ? controlCharacters[c] : c;
|
|
142
129
|
i++;
|
|
143
130
|
}
|
|
144
131
|
return '"' + escaped + '"';
|
|
145
132
|
}
|
|
133
|
+
var controlCharacters = {
|
|
134
|
+
'"': '\\"',
|
|
135
|
+
'\\': '\\\\',
|
|
136
|
+
'\b': '\\b',
|
|
137
|
+
'\f': '\\f',
|
|
138
|
+
'\n': '\\n',
|
|
139
|
+
'\r': '\\r',
|
|
140
|
+
'\t': '\\t'
|
|
141
|
+
};
|
|
146
142
|
|
|
147
143
|
/**
|
|
148
144
|
* Escape special HTML characters
|
package/lib/cjs/version.js
CHANGED
|
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.version = void 0;
|
|
7
|
-
var version = exports.version = '
|
|
7
|
+
var version = exports.version = '12.0.0';
|
|
8
8
|
// Note: This file is automatically generated when building math.js.
|
|
9
9
|
// Changes made in this file will be overwritten.
|
|
@@ -6,7 +6,7 @@ import { divideScalarDependencies } from './dependenciesDivideScalar.generated.j
|
|
|
6
6
|
import { isZeroDependencies } from './dependenciesIsZero.generated.js';
|
|
7
7
|
import { matrixDependencies } from './dependenciesMatrix.generated.js';
|
|
8
8
|
import { multiplyDependencies } from './dependenciesMultiply.generated.js';
|
|
9
|
-
import {
|
|
9
|
+
import { subtractScalarDependencies } from './dependenciesSubtractScalar.generated.js';
|
|
10
10
|
import { typedDependencies } from './dependenciesTyped.generated.js';
|
|
11
11
|
import { unaryMinusDependencies } from './dependenciesUnaryMinus.generated.js';
|
|
12
12
|
import { createDet } from '../../factoriesAny.js';
|
|
@@ -15,7 +15,7 @@ export var detDependencies = {
|
|
|
15
15
|
isZeroDependencies,
|
|
16
16
|
matrixDependencies,
|
|
17
17
|
multiplyDependencies,
|
|
18
|
-
|
|
18
|
+
subtractScalarDependencies,
|
|
19
19
|
typedDependencies,
|
|
20
20
|
unaryMinusDependencies,
|
|
21
21
|
createDet
|
|
@@ -8,7 +8,7 @@ import { deepEqualDependencies } from './dependenciesDeepEqual.generated.js';
|
|
|
8
8
|
import { divideScalarDependencies } from './dependenciesDivideScalar.generated.js';
|
|
9
9
|
import { multiplyScalarDependencies } from './dependenciesMultiplyScalar.generated.js';
|
|
10
10
|
import { sqrtDependencies } from './dependenciesSqrt.generated.js';
|
|
11
|
-
import {
|
|
11
|
+
import { subtractScalarDependencies } from './dependenciesSubtractScalar.generated.js';
|
|
12
12
|
import { typedDependencies } from './dependenciesTyped.generated.js';
|
|
13
13
|
import { createDistance } from '../../factoriesAny.js';
|
|
14
14
|
export var distanceDependencies = {
|
|
@@ -18,7 +18,7 @@ export var distanceDependencies = {
|
|
|
18
18
|
divideScalarDependencies,
|
|
19
19
|
multiplyScalarDependencies,
|
|
20
20
|
sqrtDependencies,
|
|
21
|
-
|
|
21
|
+
subtractScalarDependencies,
|
|
22
22
|
typedDependencies,
|
|
23
23
|
createDistance
|
|
24
24
|
};
|