mathjs 7.2.0 → 7.5.1
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +34 -0
- package/dist/math.js +3421 -2476
- package/dist/math.min.js +5 -5
- package/dist/math.min.map +1 -1
- package/docs/expressions/syntax.md +30 -4
- package/docs/reference/functions/bin.md +38 -0
- package/docs/reference/functions/ceil.md +10 -1
- package/docs/reference/functions/fix.md +10 -2
- package/docs/reference/functions/floor.md +12 -3
- package/docs/reference/functions/hex.md +38 -0
- package/docs/reference/functions/lsolve.md +2 -1
- package/docs/reference/functions/lsolveAll.md +45 -0
- package/docs/reference/functions/oct.md +38 -0
- package/docs/reference/functions/rotationMatrix.md +51 -0
- package/docs/reference/functions/round.md +6 -2
- package/docs/reference/functions/usolve.md +2 -1
- package/docs/reference/functions/usolveAll.md +45 -0
- package/docs/reference/functions.md +8 -2
- package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
- package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
- package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
- package/es/entry/dependenciesAny.generated.js +6 -0
- package/es/entry/impureFunctionsAny.generated.js +63 -57
- package/es/entry/pureFunctionsAny.generated.js +323 -277
- package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
- package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
- package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
- package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
- package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
- package/es/expression/parse.js +28 -1
- package/es/factoriesAny.js +6 -0
- package/es/function/algebra/solver/lsolve.js +42 -69
- package/es/function/algebra/solver/lsolveAll.js +213 -0
- package/es/function/algebra/solver/lusolve.js +12 -27
- package/es/function/algebra/solver/usolve.js +41 -64
- package/es/function/algebra/solver/usolveAll.js +213 -0
- package/es/function/algebra/solver/utils/solveValidation.js +66 -107
- package/es/function/arithmetic/ceil.js +88 -4
- package/es/function/arithmetic/fix.js +43 -6
- package/es/function/arithmetic/floor.js +90 -6
- package/es/function/arithmetic/mod.js +10 -1
- package/es/function/arithmetic/round.js +6 -2
- package/es/function/matrix/rotationMatrix.js +175 -0
- package/es/function/matrix/sqrtm.js +4 -0
- package/es/function/probability/pickRandom.js +2 -6
- package/es/function/statistics/variance.js +4 -4
- package/es/function/string/baseUtils.js +36 -0
- package/es/function/string/bin.js +23 -0
- package/es/function/string/hex.js +23 -0
- package/es/function/string/oct.js +23 -0
- package/es/type/bignumber/BigNumber.js +4 -1
- package/es/type/number.js +10 -0
- package/es/utils/object.js +3 -1
- package/es/version.js +1 -1
- package/examples/advanced/web_server/math_worker.js +1 -1
- package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
- package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
- package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
- package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
- package/lib/entry/dependenciesAny.generated.js +48 -0
- package/lib/entry/impureFunctionsAny.generated.js +65 -59
- package/lib/entry/pureFunctionsAny.generated.js +373 -321
- package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
- package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
- package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
- package/lib/expression/parse.js +28 -1
- package/lib/factoriesAny.js +48 -0
- package/lib/function/algebra/solver/lsolve.js +42 -69
- package/lib/function/algebra/solver/lsolveAll.js +223 -0
- package/lib/function/algebra/solver/lusolve.js +12 -27
- package/lib/function/algebra/solver/usolve.js +41 -64
- package/lib/function/algebra/solver/usolveAll.js +223 -0
- package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
- package/lib/function/arithmetic/ceil.js +91 -4
- package/lib/function/arithmetic/fix.js +44 -6
- package/lib/function/arithmetic/floor.js +93 -6
- package/lib/function/arithmetic/mod.js +10 -1
- package/lib/function/arithmetic/round.js +6 -2
- package/lib/function/matrix/rotationMatrix.js +185 -0
- package/lib/function/matrix/sqrtm.js +4 -0
- package/lib/function/probability/pickRandom.js +3 -7
- package/lib/function/statistics/variance.js +4 -4
- package/lib/function/string/baseUtils.js +45 -0
- package/lib/function/string/bin.js +31 -0
- package/lib/function/string/hex.js +31 -0
- package/lib/function/string/oct.js +31 -0
- package/lib/header.js +2 -2
- package/lib/type/bignumber/BigNumber.js +3 -1
- package/lib/type/number.js +10 -0
- package/lib/utils/object.js +3 -1
- package/lib/version.js +1 -1
- package/package.json +12 -12
- package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
- package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
- package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
- package/src/entry/dependenciesAny.generated.js +6 -0
- package/src/entry/impureFunctionsAny.generated.js +104 -92
- package/src/entry/pureFunctionsAny.generated.js +94 -82
- package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
- package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
- package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
- package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
- package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
- package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
- package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
- package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
- package/src/expression/parse.js +25 -0
- package/src/factoriesAny.js +6 -0
- package/src/function/algebra/solver/lsolve.js +52 -58
- package/src/function/algebra/solver/lsolveAll.js +197 -0
- package/src/function/algebra/solver/lusolve.js +9 -19
- package/src/function/algebra/solver/usolve.js +52 -55
- package/src/function/algebra/solver/usolveAll.js +199 -0
- package/src/function/algebra/solver/utils/solveValidation.js +78 -86
- package/src/function/arithmetic/ceil.js +63 -3
- package/src/function/arithmetic/fix.js +45 -6
- package/src/function/arithmetic/floor.js +65 -5
- package/src/function/arithmetic/mod.js +8 -1
- package/src/function/arithmetic/round.js +6 -2
- package/src/function/matrix/rotationMatrix.js +185 -0
- package/src/function/matrix/sqrtm.js +4 -0
- package/src/function/probability/pickRandom.js +2 -6
- package/src/function/statistics/variance.js +4 -4
- package/src/function/string/baseUtils.js +29 -0
- package/src/function/string/bin.js +23 -0
- package/src/function/string/hex.js +23 -0
- package/src/function/string/oct.js +24 -0
- package/src/type/bignumber/BigNumber.js +2 -1
- package/src/type/number.js +9 -1
- package/src/utils/object.js +3 -1
- package/src/version.js +1 -1
@@ -9,6 +9,9 @@ import { isNegativeDocs } from './function/utils/isNegative';
|
|
9
9
|
import { isIntegerDocs } from './function/utils/isInteger';
|
10
10
|
import { isNaNDocs } from './function/utils/isNaN';
|
11
11
|
import { formatDocs } from './function/utils/format';
|
12
|
+
import { binDocs } from './function/utils/bin';
|
13
|
+
import { octDocs } from './function/utils/oct';
|
14
|
+
import { hexDocs } from './function/utils/hex';
|
12
15
|
import { cloneDocs } from './function/utils/clone';
|
13
16
|
import { toDocs } from './function/units/to';
|
14
17
|
import { tanhDocs } from './function/trigonometry/tanh';
|
@@ -167,11 +170,13 @@ import { addDocs } from './function/arithmetic/add';
|
|
167
170
|
import { absDocs } from './function/arithmetic/abs';
|
168
171
|
import { qrDocs } from './function/algebra/qr';
|
169
172
|
import { usolveDocs } from './function/algebra/usolve';
|
173
|
+
import { usolveAllDocs } from './function/algebra/usolveAll';
|
170
174
|
import { sluDocs } from './function/algebra/slu';
|
171
175
|
import { rationalizeDocs } from './function/algebra/rationalize';
|
172
176
|
import { simplifyDocs } from './function/algebra/simplify';
|
173
177
|
import { lupDocs } from './function/algebra/lup';
|
174
178
|
import { lsolveDocs } from './function/algebra/lsolve';
|
179
|
+
import { lsolveAllDocs } from './function/algebra/lsolveAll';
|
175
180
|
import { derivativeDocs } from './function/algebra/derivative';
|
176
181
|
import { versionDocs } from './constants/version';
|
177
182
|
import { trueDocs } from './constants/true';
|
@@ -209,6 +214,7 @@ import { sinDocs } from './function/trigonometry/sin';
|
|
209
214
|
import { numericDocs } from './function/utils/numeric';
|
210
215
|
import { columnDocs } from './function/matrix/column';
|
211
216
|
import { rowDocs } from './function/matrix/row';
|
217
|
+
import { rotationMatrixDocs } from './function/matrix/rotationMatrix';
|
212
218
|
export var embeddedDocs = {
|
213
219
|
// construction functions
|
214
220
|
bignumber: bignumberDocs,
|
@@ -450,12 +456,14 @@ export var embeddedDocs = {
|
|
450
456
|
// functions - algebra
|
451
457
|
derivative: derivativeDocs,
|
452
458
|
lsolve: lsolveDocs,
|
459
|
+
lsolveAll: lsolveAllDocs,
|
453
460
|
lup: lupDocs,
|
454
461
|
lusolve: lusolveDocs,
|
455
462
|
simplify: simplifyDocs,
|
456
463
|
rationalize: rationalizeDocs,
|
457
464
|
slu: sluDocs,
|
458
465
|
usolve: usolveDocs,
|
466
|
+
usolveAll: usolveAllDocs,
|
459
467
|
qr: qrDocs,
|
460
468
|
// functions - arithmetic
|
461
469
|
abs: absDocs,
|
@@ -550,6 +558,7 @@ export var embeddedDocs = {
|
|
550
558
|
range: rangeDocs,
|
551
559
|
resize: resizeDocs,
|
552
560
|
reshape: reshapeDocs,
|
561
|
+
rotationMatrix: rotationMatrixDocs,
|
553
562
|
row: rowDocs,
|
554
563
|
size: sizeDocs,
|
555
564
|
sort: sortDocs,
|
@@ -638,6 +647,9 @@ export var embeddedDocs = {
|
|
638
647
|
// functions - utils
|
639
648
|
clone: cloneDocs,
|
640
649
|
format: formatDocs,
|
650
|
+
bin: binDocs,
|
651
|
+
oct: octDocs,
|
652
|
+
hex: hexDocs,
|
641
653
|
isNaN: isNaNDocs,
|
642
654
|
isInteger: isIntegerDocs,
|
643
655
|
isNegative: isNegativeDocs,
|
@@ -2,7 +2,7 @@ export var lsolveDocs = {
|
|
2
2
|
name: 'lsolve',
|
3
3
|
category: 'Algebra',
|
4
4
|
syntax: ['x=lsolve(L, b)'],
|
5
|
-
description: '
|
5
|
+
description: 'Finds one solution of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',
|
6
6
|
examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],
|
7
|
-
seealso: ['lup', 'lusolve', 'usolve', 'matrix', 'sparse']
|
7
|
+
seealso: ['lsolveAll', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']
|
8
8
|
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var lsolveAllDocs = {
|
2
|
+
name: 'lsolveAll',
|
3
|
+
category: 'Algebra',
|
4
|
+
syntax: ['x=lsolveAll(L, b)'],
|
5
|
+
description: 'Finds all solutions of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',
|
6
|
+
examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],
|
7
|
+
seealso: ['lsolve', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']
|
8
|
+
};
|
@@ -2,7 +2,7 @@ export var usolveDocs = {
|
|
2
2
|
name: 'usolve',
|
3
3
|
category: 'Algebra',
|
4
4
|
syntax: ['x=usolve(U, b)'],
|
5
|
-
description: '
|
5
|
+
description: 'Finds one solution of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',
|
6
6
|
examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],
|
7
|
-
seealso: ['lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
|
7
|
+
seealso: ['usolveAll', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
|
8
8
|
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var usolveAllDocs = {
|
2
|
+
name: 'usolveAll',
|
3
|
+
category: 'Algebra',
|
4
|
+
syntax: ['x=usolve(U, b)'],
|
5
|
+
description: 'Finds all solutions of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',
|
6
|
+
examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],
|
7
|
+
seealso: ['usolve', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']
|
8
|
+
};
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export var rotationMatrixDocs = {
|
2
|
+
name: 'rotationMatrix',
|
3
|
+
category: 'Matrix',
|
4
|
+
syntax: ['rotationMatrix(theta)', 'rotationMatrix(theta, v)', 'rotationMatrix(theta, v, format)'],
|
5
|
+
description: 'Returns a 2-D rotation matrix (2x2) for a given angle (in radians). ' + 'Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.',
|
6
|
+
examples: ['rotationMatrix(pi / 2)', 'rotationMatrix(unit("45deg"), [0, 0, 1])', 'rotationMatrix(1, matrix([0, 0, 1]), "sparse")'],
|
7
|
+
seealso: ['cos', 'sin']
|
8
|
+
};
|
package/es/expression/parse.js
CHANGED
@@ -302,7 +302,24 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, function (_r
|
|
302
302
|
|
303
303
|
|
304
304
|
if (parse.isDigitDot(c1)) {
|
305
|
-
state.tokenType = TOKENTYPE.NUMBER; //
|
305
|
+
state.tokenType = TOKENTYPE.NUMBER; // check for binary, octal, or hex
|
306
|
+
|
307
|
+
var _c = currentString(state, 2);
|
308
|
+
|
309
|
+
if (_c === '0b' || _c === '0o' || _c === '0x') {
|
310
|
+
state.token += currentCharacter(state);
|
311
|
+
next(state);
|
312
|
+
state.token += currentCharacter(state);
|
313
|
+
next(state);
|
314
|
+
|
315
|
+
while (parse.isHexDigit(currentCharacter(state))) {
|
316
|
+
state.token += currentCharacter(state);
|
317
|
+
next(state);
|
318
|
+
}
|
319
|
+
|
320
|
+
return;
|
321
|
+
} // get number, can have a single dot
|
322
|
+
|
306
323
|
|
307
324
|
if (currentCharacter(state) === '.') {
|
308
325
|
state.token += currentCharacter(state);
|
@@ -514,6 +531,16 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, function (_r
|
|
514
531
|
parse.isDigit = function isDigit(c) {
|
515
532
|
return c >= '0' && c <= '9';
|
516
533
|
};
|
534
|
+
/**
|
535
|
+
* checks if the given char c is a hex digit
|
536
|
+
* @param {string} c a string with one character
|
537
|
+
* @return {boolean}
|
538
|
+
*/
|
539
|
+
|
540
|
+
|
541
|
+
parse.isHexDigit = function isHexDigit(c) {
|
542
|
+
return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F';
|
543
|
+
};
|
517
544
|
/**
|
518
545
|
* Start of the parse levels below, in order of precedence
|
519
546
|
* @return {Node} node
|
package/es/factoriesAny.js
CHANGED
@@ -78,6 +78,7 @@ export { createOnes } from './function/matrix/ones';
|
|
78
78
|
export { createRange } from './function/matrix/range';
|
79
79
|
export { createReshape } from './function/matrix/reshape';
|
80
80
|
export { createResize } from './function/matrix/resize';
|
81
|
+
export { createRotationMatrix } from './function/matrix/rotationMatrix';
|
81
82
|
export { createRow } from './function/matrix/row';
|
82
83
|
export { createSize } from './function/matrix/size';
|
83
84
|
export { createSqueeze } from './function/matrix/squeeze';
|
@@ -89,6 +90,9 @@ export { createErf } from './function/special/erf';
|
|
89
90
|
export { createMode } from './function/statistics/mode';
|
90
91
|
export { createProd } from './function/statistics/prod';
|
91
92
|
export { createFormat } from './function/string/format';
|
93
|
+
export { createBin } from './function/string/bin';
|
94
|
+
export { createOct } from './function/string/oct';
|
95
|
+
export { createHex } from './function/string/hex';
|
92
96
|
export { createPrint } from './function/string/print';
|
93
97
|
export { createTo } from './function/unit/to';
|
94
98
|
export { createIsPrime } from './function/utils/isPrime';
|
@@ -103,6 +107,8 @@ export { createDotPow } from './function/arithmetic/dotPow';
|
|
103
107
|
export { createDotDivide } from './function/arithmetic/dotDivide';
|
104
108
|
export { createLsolve } from './function/algebra/solver/lsolve';
|
105
109
|
export { createUsolve } from './function/algebra/solver/usolve';
|
110
|
+
export { createLsolveAll } from './function/algebra/solver/lsolveAll';
|
111
|
+
export { createUsolveAll } from './function/algebra/solver/usolveAll';
|
106
112
|
export { createLeftShift } from './function/bitwise/leftShift';
|
107
113
|
export { createRightArithShift } from './function/bitwise/rightArithShift';
|
108
114
|
export { createRightLogShift } from './function/bitwise/rightLogShift';
|
@@ -14,7 +14,7 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
14
14
|
DenseMatrix: DenseMatrix
|
15
15
|
});
|
16
16
|
/**
|
17
|
-
*
|
17
|
+
* Finds one solution of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix. Throws an error if there's no solution.
|
18
18
|
*
|
19
19
|
* `L * x = b`
|
20
20
|
*
|
@@ -30,7 +30,7 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
30
30
|
*
|
31
31
|
* See also:
|
32
32
|
*
|
33
|
-
* lup, slu, usolve, lusolve
|
33
|
+
* lsolveAll, lup, slu, usolve, lusolve
|
34
34
|
*
|
35
35
|
* @param {Matrix, Array} L A N x N matrix or array (L)
|
36
36
|
* @param {Matrix, Array} b A column vector with the b values
|
@@ -40,19 +40,15 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
40
40
|
|
41
41
|
return typed(name, {
|
42
42
|
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
43
|
-
// process matrix
|
44
43
|
return _sparseForwardSubstitution(m, b);
|
45
44
|
},
|
46
45
|
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
47
|
-
// process matrix
|
48
46
|
return _denseForwardSubstitution(m, b);
|
49
47
|
},
|
50
48
|
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
51
|
-
|
52
|
-
var m = matrix(a); // use matrix implementation
|
53
|
-
|
54
|
-
var r = _denseForwardSubstitution(m, b); // result
|
49
|
+
var m = matrix(a);
|
55
50
|
|
51
|
+
var r = _denseForwardSubstitution(m, b);
|
56
52
|
|
57
53
|
return r.valueOf();
|
58
54
|
}
|
@@ -60,48 +56,38 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
60
56
|
|
61
57
|
function _denseForwardSubstitution(m, b) {
|
62
58
|
// validate matrix and vector, return copy of column vector b
|
63
|
-
b = solveValidation(m, b, true);
|
64
|
-
|
65
|
-
var bdata = b._data; // rows & columns
|
66
|
-
|
59
|
+
b = solveValidation(m, b, true);
|
60
|
+
var bdata = b._data;
|
67
61
|
var rows = m._size[0];
|
68
62
|
var columns = m._size[1]; // result
|
69
63
|
|
70
|
-
var x = [];
|
71
|
-
|
72
|
-
var data = m._data; // forward solve m * x = b, loop columns
|
64
|
+
var x = [];
|
65
|
+
var mdata = m._data; // loop columns
|
73
66
|
|
74
67
|
for (var j = 0; j < columns; j++) {
|
75
|
-
|
76
|
-
var
|
77
|
-
|
78
|
-
var xj = void 0; // forward substitution (outer product) avoids inner looping when bj === 0
|
68
|
+
var bj = bdata[j][0] || 0;
|
69
|
+
var xj = void 0;
|
79
70
|
|
80
71
|
if (!equalScalar(bj, 0)) {
|
81
|
-
//
|
82
|
-
var vjj =
|
72
|
+
// non-degenerate row, find solution
|
73
|
+
var vjj = mdata[j][j];
|
83
74
|
|
84
75
|
if (equalScalar(vjj, 0)) {
|
85
|
-
// system cannot be solved
|
86
76
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
87
|
-
}
|
88
|
-
|
77
|
+
}
|
89
78
|
|
90
79
|
xj = divideScalar(bj, vjj); // loop rows
|
91
80
|
|
92
81
|
for (var i = j + 1; i < rows; i++) {
|
93
|
-
|
94
|
-
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))];
|
82
|
+
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
|
95
83
|
}
|
96
84
|
} else {
|
97
|
-
//
|
85
|
+
// degenerate row, we can choose any value
|
98
86
|
xj = 0;
|
99
|
-
}
|
100
|
-
|
87
|
+
}
|
101
88
|
|
102
89
|
x[j] = [xj];
|
103
|
-
}
|
104
|
-
|
90
|
+
}
|
105
91
|
|
106
92
|
return new DenseMatrix({
|
107
93
|
data: x,
|
@@ -111,72 +97,59 @@ export var createLsolve = /* #__PURE__ */factory(name, dependencies, function (_
|
|
111
97
|
|
112
98
|
function _sparseForwardSubstitution(m, b) {
|
113
99
|
// validate matrix and vector, return copy of column vector b
|
114
|
-
b = solveValidation(m, b, true);
|
115
|
-
|
116
|
-
var bdata = b._data; // rows & columns
|
117
|
-
|
100
|
+
b = solveValidation(m, b, true);
|
101
|
+
var bdata = b._data;
|
118
102
|
var rows = m._size[0];
|
119
|
-
var columns = m._size[1];
|
120
|
-
|
103
|
+
var columns = m._size[1];
|
121
104
|
var values = m._values;
|
122
105
|
var index = m._index;
|
123
|
-
var ptr = m._ptr; //
|
106
|
+
var ptr = m._ptr; // result
|
124
107
|
|
125
|
-
var
|
126
|
-
|
127
|
-
var x = []; // forward solve m * x = b, loop columns
|
108
|
+
var x = []; // loop columns
|
128
109
|
|
129
110
|
for (var j = 0; j < columns; j++) {
|
130
|
-
|
131
|
-
var bj = bdata[j][0] || 0; // forward substitution (outer product) avoids inner looping when bj === 0
|
111
|
+
var bj = bdata[j][0] || 0;
|
132
112
|
|
133
113
|
if (!equalScalar(bj, 0)) {
|
134
|
-
//
|
135
|
-
var vjj = 0; //
|
114
|
+
// non-degenerate row, find solution
|
115
|
+
var vjj = 0; // matrix values & indices (column j)
|
136
116
|
|
137
|
-
var
|
138
|
-
var
|
117
|
+
var jValues = [];
|
118
|
+
var jIndices = []; // first and last index in the column
|
139
119
|
|
140
|
-
var
|
120
|
+
var firstIndex = ptr[j];
|
121
|
+
var lastIndex = ptr[j + 1]; // values in column, find value at [j, j]
|
141
122
|
|
142
|
-
for (k =
|
143
|
-
// row
|
144
|
-
i = index[k]; // check row (rows are not sorted!)
|
123
|
+
for (var k = firstIndex; k < lastIndex; k++) {
|
124
|
+
var i = index[k]; // check row (rows are not sorted!)
|
145
125
|
|
146
126
|
if (i === j) {
|
147
|
-
// update vjj
|
148
127
|
vjj = values[k];
|
149
128
|
} else if (i > j) {
|
150
129
|
// store lower triangular
|
151
|
-
|
152
|
-
|
130
|
+
jValues.push(values[k]);
|
131
|
+
jIndices.push(i);
|
153
132
|
}
|
154
|
-
} // at this point we must have a value
|
133
|
+
} // at this point we must have a value in vjj
|
155
134
|
|
156
135
|
|
157
136
|
if (equalScalar(vjj, 0)) {
|
158
|
-
// system cannot be solved, there is no value @ [j, j]
|
159
137
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
160
|
-
}
|
161
|
-
|
162
|
-
|
163
|
-
var xj = divideScalar(bj, vjj); // loop lower triangular
|
164
|
-
|
165
|
-
for (k = 0, l = jindex.length; k < l; k++) {
|
166
|
-
// row
|
167
|
-
i = jindex[k]; // update copy of b
|
138
|
+
}
|
168
139
|
|
169
|
-
|
170
|
-
} // update x
|
140
|
+
var xj = divideScalar(bj, vjj);
|
171
141
|
|
142
|
+
for (var _k = 0, l = jIndices.length; _k < l; _k++) {
|
143
|
+
var _i = jIndices[_k];
|
144
|
+
bdata[_i] = [subtract(bdata[_i][0] || 0, multiplyScalar(xj, jValues[_k]))];
|
145
|
+
}
|
172
146
|
|
173
147
|
x[j] = [xj];
|
174
148
|
} else {
|
175
|
-
//
|
149
|
+
// degenerate row, we can choose any value
|
176
150
|
x[j] = [0];
|
177
151
|
}
|
178
|
-
}
|
179
|
-
|
152
|
+
}
|
180
153
|
|
181
154
|
return new DenseMatrix({
|
182
155
|
data: x,
|
@@ -0,0 +1,213 @@
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
2
|
+
|
3
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
4
|
+
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
6
|
+
|
7
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
8
|
+
|
9
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
10
|
+
|
11
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
12
|
+
|
13
|
+
import { factory } from '../../../utils/factory';
|
14
|
+
import { createSolveValidation } from './utils/solveValidation';
|
15
|
+
var name = 'lsolveAll';
|
16
|
+
var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
|
17
|
+
export var createLsolveAll = /* #__PURE__ */factory(name, dependencies, function (_ref) {
|
18
|
+
var typed = _ref.typed,
|
19
|
+
matrix = _ref.matrix,
|
20
|
+
divideScalar = _ref.divideScalar,
|
21
|
+
multiplyScalar = _ref.multiplyScalar,
|
22
|
+
subtract = _ref.subtract,
|
23
|
+
equalScalar = _ref.equalScalar,
|
24
|
+
DenseMatrix = _ref.DenseMatrix;
|
25
|
+
var solveValidation = createSolveValidation({
|
26
|
+
DenseMatrix: DenseMatrix
|
27
|
+
});
|
28
|
+
/**
|
29
|
+
* Finds all solutions of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix.
|
30
|
+
*
|
31
|
+
* `L * x = b`
|
32
|
+
*
|
33
|
+
* Syntax:
|
34
|
+
*
|
35
|
+
* math.lsolve(L, b)
|
36
|
+
*
|
37
|
+
* Examples:
|
38
|
+
*
|
39
|
+
* const a = [[-2, 3], [2, 1]]
|
40
|
+
* const b = [11, 9]
|
41
|
+
* const x = lsolve(a, b) // [ [[-5.5], [20]] ]
|
42
|
+
*
|
43
|
+
* See also:
|
44
|
+
*
|
45
|
+
* lsolve, lup, slu, usolve, lusolve
|
46
|
+
*
|
47
|
+
* @param {Matrix, Array} L A N x N matrix or array (L)
|
48
|
+
* @param {Matrix, Array} b A column vector with the b values
|
49
|
+
*
|
50
|
+
* @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system
|
51
|
+
*/
|
52
|
+
|
53
|
+
return typed(name, {
|
54
|
+
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
55
|
+
return _sparseForwardSubstitution(m, b);
|
56
|
+
},
|
57
|
+
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
58
|
+
return _denseForwardSubstitution(m, b);
|
59
|
+
},
|
60
|
+
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
61
|
+
var m = matrix(a);
|
62
|
+
|
63
|
+
var R = _denseForwardSubstitution(m, b);
|
64
|
+
|
65
|
+
return R.map(function (r) {
|
66
|
+
return r.valueOf();
|
67
|
+
});
|
68
|
+
}
|
69
|
+
});
|
70
|
+
|
71
|
+
function _denseForwardSubstitution(m, b_) {
|
72
|
+
// the algorithm is derived from
|
73
|
+
// https://www.overleaf.com/project/5e6c87c554a3190001a3fc93
|
74
|
+
// array of right-hand sides
|
75
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
76
|
+
return e[0];
|
77
|
+
})];
|
78
|
+
var M = m._data;
|
79
|
+
var rows = m._size[0];
|
80
|
+
var columns = m._size[1]; // loop columns
|
81
|
+
|
82
|
+
for (var i = 0; i < columns; i++) {
|
83
|
+
var L = B.length; // loop right-hand sides
|
84
|
+
|
85
|
+
for (var k = 0; k < L; k++) {
|
86
|
+
var b = B[k];
|
87
|
+
|
88
|
+
if (!equalScalar(M[i][i], 0)) {
|
89
|
+
// non-singular row
|
90
|
+
b[i] = divideScalar(b[i], M[i][i]);
|
91
|
+
|
92
|
+
for (var j = i + 1; j < columns; j++) {
|
93
|
+
// b[j] -= b[i] * M[j,i]
|
94
|
+
b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));
|
95
|
+
}
|
96
|
+
} else if (!equalScalar(b[i], 0)) {
|
97
|
+
// singular row, nonzero RHS
|
98
|
+
if (k === 0) {
|
99
|
+
// There is no valid solution
|
100
|
+
return [];
|
101
|
+
} else {
|
102
|
+
// This RHS is invalid but other solutions may still exist
|
103
|
+
B.splice(k, 1);
|
104
|
+
k -= 1;
|
105
|
+
L -= 1;
|
106
|
+
}
|
107
|
+
} else if (k === 0) {
|
108
|
+
// singular row, RHS is zero
|
109
|
+
var bNew = _toConsumableArray(b);
|
110
|
+
|
111
|
+
bNew[i] = 1;
|
112
|
+
|
113
|
+
for (var _j = i + 1; _j < columns; _j++) {
|
114
|
+
bNew[_j] = subtract(bNew[_j], M[_j][i]);
|
115
|
+
}
|
116
|
+
|
117
|
+
B.push(bNew);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
|
122
|
+
return B.map(function (x) {
|
123
|
+
return new DenseMatrix({
|
124
|
+
data: x.map(function (e) {
|
125
|
+
return [e];
|
126
|
+
}),
|
127
|
+
size: [rows, 1]
|
128
|
+
});
|
129
|
+
});
|
130
|
+
}
|
131
|
+
|
132
|
+
function _sparseForwardSubstitution(m, b_) {
|
133
|
+
// array of right-hand sides
|
134
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
135
|
+
return e[0];
|
136
|
+
})];
|
137
|
+
var rows = m._size[0];
|
138
|
+
var columns = m._size[1];
|
139
|
+
var values = m._values;
|
140
|
+
var index = m._index;
|
141
|
+
var ptr = m._ptr; // loop columns
|
142
|
+
|
143
|
+
for (var i = 0; i < columns; i++) {
|
144
|
+
var L = B.length; // loop right-hand sides
|
145
|
+
|
146
|
+
for (var k = 0; k < L; k++) {
|
147
|
+
var b = B[k]; // values & indices (column i)
|
148
|
+
|
149
|
+
var iValues = [];
|
150
|
+
var iIndices = []; // first & last indeces in column
|
151
|
+
|
152
|
+
var firstIndex = ptr[i];
|
153
|
+
var lastIndex = ptr[i + 1]; // find the value at [i, i]
|
154
|
+
|
155
|
+
var Mii = 0;
|
156
|
+
|
157
|
+
for (var j = firstIndex; j < lastIndex; j++) {
|
158
|
+
var J = index[j]; // check row
|
159
|
+
|
160
|
+
if (J === i) {
|
161
|
+
Mii = values[j];
|
162
|
+
} else if (J > i) {
|
163
|
+
// store lower triangular
|
164
|
+
iValues.push(values[j]);
|
165
|
+
iIndices.push(J);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
if (!equalScalar(Mii, 0)) {
|
170
|
+
// non-singular row
|
171
|
+
b[i] = divideScalar(b[i], Mii);
|
172
|
+
|
173
|
+
for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {
|
174
|
+
var _J = iIndices[_j2];
|
175
|
+
b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));
|
176
|
+
}
|
177
|
+
} else if (!equalScalar(b[i], 0)) {
|
178
|
+
// singular row, nonzero RHS
|
179
|
+
if (k === 0) {
|
180
|
+
// There is no valid solution
|
181
|
+
return [];
|
182
|
+
} else {
|
183
|
+
// This RHS is invalid but other solutions may still exist
|
184
|
+
B.splice(k, 1);
|
185
|
+
k -= 1;
|
186
|
+
L -= 1;
|
187
|
+
}
|
188
|
+
} else if (k === 0) {
|
189
|
+
// singular row, RHS is zero
|
190
|
+
var bNew = _toConsumableArray(b);
|
191
|
+
|
192
|
+
bNew[i] = 1;
|
193
|
+
|
194
|
+
for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {
|
195
|
+
var _J2 = iIndices[_j3];
|
196
|
+
bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);
|
197
|
+
}
|
198
|
+
|
199
|
+
B.push(bNew);
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
return B.map(function (x) {
|
205
|
+
return new DenseMatrix({
|
206
|
+
data: x.map(function (e) {
|
207
|
+
return [e];
|
208
|
+
}),
|
209
|
+
size: [rows, 1]
|
210
|
+
});
|
211
|
+
});
|
212
|
+
}
|
213
|
+
});
|