mathjs 11.11.2 → 12.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
};
|