mathjs 7.2.0 → 7.5.1
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 +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
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createLsolveAll = void 0;
|
|
7
|
+
|
|
8
|
+
var _factory = require("../../../utils/factory");
|
|
9
|
+
|
|
10
|
+
var _solveValidation = require("./utils/solveValidation");
|
|
11
|
+
|
|
12
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
13
|
+
|
|
14
|
+
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."); }
|
|
15
|
+
|
|
16
|
+
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); }
|
|
17
|
+
|
|
18
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
|
19
|
+
|
|
20
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
21
|
+
|
|
22
|
+
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; }
|
|
23
|
+
|
|
24
|
+
var name = 'lsolveAll';
|
|
25
|
+
var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
|
|
26
|
+
var createLsolveAll = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
27
|
+
var typed = _ref.typed,
|
|
28
|
+
matrix = _ref.matrix,
|
|
29
|
+
divideScalar = _ref.divideScalar,
|
|
30
|
+
multiplyScalar = _ref.multiplyScalar,
|
|
31
|
+
subtract = _ref.subtract,
|
|
32
|
+
equalScalar = _ref.equalScalar,
|
|
33
|
+
DenseMatrix = _ref.DenseMatrix;
|
|
34
|
+
var solveValidation = (0, _solveValidation.createSolveValidation)({
|
|
35
|
+
DenseMatrix: DenseMatrix
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Finds all solutions of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix.
|
|
39
|
+
*
|
|
40
|
+
* `L * x = b`
|
|
41
|
+
*
|
|
42
|
+
* Syntax:
|
|
43
|
+
*
|
|
44
|
+
* math.lsolve(L, b)
|
|
45
|
+
*
|
|
46
|
+
* Examples:
|
|
47
|
+
*
|
|
48
|
+
* const a = [[-2, 3], [2, 1]]
|
|
49
|
+
* const b = [11, 9]
|
|
50
|
+
* const x = lsolve(a, b) // [ [[-5.5], [20]] ]
|
|
51
|
+
*
|
|
52
|
+
* See also:
|
|
53
|
+
*
|
|
54
|
+
* lsolve, lup, slu, usolve, lusolve
|
|
55
|
+
*
|
|
56
|
+
* @param {Matrix, Array} L A N x N matrix or array (L)
|
|
57
|
+
* @param {Matrix, Array} b A column vector with the b values
|
|
58
|
+
*
|
|
59
|
+
* @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
return typed(name, {
|
|
63
|
+
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
|
64
|
+
return _sparseForwardSubstitution(m, b);
|
|
65
|
+
},
|
|
66
|
+
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
|
67
|
+
return _denseForwardSubstitution(m, b);
|
|
68
|
+
},
|
|
69
|
+
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
70
|
+
var m = matrix(a);
|
|
71
|
+
|
|
72
|
+
var R = _denseForwardSubstitution(m, b);
|
|
73
|
+
|
|
74
|
+
return R.map(function (r) {
|
|
75
|
+
return r.valueOf();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
function _denseForwardSubstitution(m, b_) {
|
|
81
|
+
// the algorithm is derived from
|
|
82
|
+
// https://www.overleaf.com/project/5e6c87c554a3190001a3fc93
|
|
83
|
+
// array of right-hand sides
|
|
84
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
|
85
|
+
return e[0];
|
|
86
|
+
})];
|
|
87
|
+
var M = m._data;
|
|
88
|
+
var rows = m._size[0];
|
|
89
|
+
var columns = m._size[1]; // loop columns
|
|
90
|
+
|
|
91
|
+
for (var i = 0; i < columns; i++) {
|
|
92
|
+
var L = B.length; // loop right-hand sides
|
|
93
|
+
|
|
94
|
+
for (var k = 0; k < L; k++) {
|
|
95
|
+
var b = B[k];
|
|
96
|
+
|
|
97
|
+
if (!equalScalar(M[i][i], 0)) {
|
|
98
|
+
// non-singular row
|
|
99
|
+
b[i] = divideScalar(b[i], M[i][i]);
|
|
100
|
+
|
|
101
|
+
for (var j = i + 1; j < columns; j++) {
|
|
102
|
+
// b[j] -= b[i] * M[j,i]
|
|
103
|
+
b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));
|
|
104
|
+
}
|
|
105
|
+
} else if (!equalScalar(b[i], 0)) {
|
|
106
|
+
// singular row, nonzero RHS
|
|
107
|
+
if (k === 0) {
|
|
108
|
+
// There is no valid solution
|
|
109
|
+
return [];
|
|
110
|
+
} else {
|
|
111
|
+
// This RHS is invalid but other solutions may still exist
|
|
112
|
+
B.splice(k, 1);
|
|
113
|
+
k -= 1;
|
|
114
|
+
L -= 1;
|
|
115
|
+
}
|
|
116
|
+
} else if (k === 0) {
|
|
117
|
+
// singular row, RHS is zero
|
|
118
|
+
var bNew = _toConsumableArray(b);
|
|
119
|
+
|
|
120
|
+
bNew[i] = 1;
|
|
121
|
+
|
|
122
|
+
for (var _j = i + 1; _j < columns; _j++) {
|
|
123
|
+
bNew[_j] = subtract(bNew[_j], M[_j][i]);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
B.push(bNew);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return B.map(function (x) {
|
|
132
|
+
return new DenseMatrix({
|
|
133
|
+
data: x.map(function (e) {
|
|
134
|
+
return [e];
|
|
135
|
+
}),
|
|
136
|
+
size: [rows, 1]
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function _sparseForwardSubstitution(m, b_) {
|
|
142
|
+
// array of right-hand sides
|
|
143
|
+
var B = [solveValidation(m, b_, true)._data.map(function (e) {
|
|
144
|
+
return e[0];
|
|
145
|
+
})];
|
|
146
|
+
var rows = m._size[0];
|
|
147
|
+
var columns = m._size[1];
|
|
148
|
+
var values = m._values;
|
|
149
|
+
var index = m._index;
|
|
150
|
+
var ptr = m._ptr; // loop columns
|
|
151
|
+
|
|
152
|
+
for (var i = 0; i < columns; i++) {
|
|
153
|
+
var L = B.length; // loop right-hand sides
|
|
154
|
+
|
|
155
|
+
for (var k = 0; k < L; k++) {
|
|
156
|
+
var b = B[k]; // values & indices (column i)
|
|
157
|
+
|
|
158
|
+
var iValues = [];
|
|
159
|
+
var iIndices = []; // first & last indeces in column
|
|
160
|
+
|
|
161
|
+
var firstIndex = ptr[i];
|
|
162
|
+
var lastIndex = ptr[i + 1]; // find the value at [i, i]
|
|
163
|
+
|
|
164
|
+
var Mii = 0;
|
|
165
|
+
|
|
166
|
+
for (var j = firstIndex; j < lastIndex; j++) {
|
|
167
|
+
var J = index[j]; // check row
|
|
168
|
+
|
|
169
|
+
if (J === i) {
|
|
170
|
+
Mii = values[j];
|
|
171
|
+
} else if (J > i) {
|
|
172
|
+
// store lower triangular
|
|
173
|
+
iValues.push(values[j]);
|
|
174
|
+
iIndices.push(J);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (!equalScalar(Mii, 0)) {
|
|
179
|
+
// non-singular row
|
|
180
|
+
b[i] = divideScalar(b[i], Mii);
|
|
181
|
+
|
|
182
|
+
for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {
|
|
183
|
+
var _J = iIndices[_j2];
|
|
184
|
+
b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));
|
|
185
|
+
}
|
|
186
|
+
} else if (!equalScalar(b[i], 0)) {
|
|
187
|
+
// singular row, nonzero RHS
|
|
188
|
+
if (k === 0) {
|
|
189
|
+
// There is no valid solution
|
|
190
|
+
return [];
|
|
191
|
+
} else {
|
|
192
|
+
// This RHS is invalid but other solutions may still exist
|
|
193
|
+
B.splice(k, 1);
|
|
194
|
+
k -= 1;
|
|
195
|
+
L -= 1;
|
|
196
|
+
}
|
|
197
|
+
} else if (k === 0) {
|
|
198
|
+
// singular row, RHS is zero
|
|
199
|
+
var bNew = _toConsumableArray(b);
|
|
200
|
+
|
|
201
|
+
bNew[i] = 1;
|
|
202
|
+
|
|
203
|
+
for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {
|
|
204
|
+
var _J2 = iIndices[_j3];
|
|
205
|
+
bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
B.push(bNew);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return B.map(function (x) {
|
|
214
|
+
return new DenseMatrix({
|
|
215
|
+
data: x.map(function (e) {
|
|
216
|
+
return [e];
|
|
217
|
+
}),
|
|
218
|
+
size: [rows, 1]
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
exports.createLsolveAll = createLsolveAll;
|
|
@@ -62,63 +62,49 @@ var createLusolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, fun
|
|
|
62
62
|
|
|
63
63
|
return typed(name, {
|
|
64
64
|
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
var d = lup(a); // solve
|
|
69
|
-
|
|
70
|
-
var x = _lusolve(d.L, d.U, d.p, null, b); // convert result to array
|
|
65
|
+
a = matrix(a);
|
|
66
|
+
var d = lup(a);
|
|
71
67
|
|
|
68
|
+
var x = _lusolve(d.L, d.U, d.p, null, b);
|
|
72
69
|
|
|
73
70
|
return x.valueOf();
|
|
74
71
|
},
|
|
75
72
|
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) {
|
|
76
|
-
|
|
77
|
-
var d = lup(a); // solve
|
|
78
|
-
|
|
73
|
+
var d = lup(a);
|
|
79
74
|
return _lusolve(d.L, d.U, d.p, null, b);
|
|
80
75
|
},
|
|
81
76
|
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) {
|
|
82
|
-
|
|
83
|
-
var d = lup(a); // solve
|
|
84
|
-
|
|
77
|
+
var d = lup(a);
|
|
85
78
|
return _lusolve(d.L, d.U, d.p, null, b);
|
|
86
79
|
},
|
|
87
80
|
'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) {
|
|
88
|
-
|
|
89
|
-
var d = slu(a, order, threshold); // solve
|
|
90
|
-
|
|
81
|
+
var d = slu(a, order, threshold);
|
|
91
82
|
return _lusolve(d.L, d.U, d.p, d.q, b);
|
|
92
83
|
},
|
|
93
84
|
'Object, Array | Matrix': function ObjectArrayMatrix(d, b) {
|
|
94
|
-
// solve
|
|
95
85
|
return _lusolve(d.L, d.U, d.p, d.q, b);
|
|
96
86
|
}
|
|
97
87
|
});
|
|
98
88
|
|
|
99
89
|
function _toMatrix(a) {
|
|
100
|
-
// check it is a matrix
|
|
101
90
|
if ((0, _is.isMatrix)(a)) {
|
|
102
91
|
return a;
|
|
103
|
-
}
|
|
104
|
-
|
|
92
|
+
}
|
|
105
93
|
|
|
106
94
|
if ((0, _is.isArray)(a)) {
|
|
107
95
|
return matrix(a);
|
|
108
|
-
}
|
|
109
|
-
|
|
96
|
+
}
|
|
110
97
|
|
|
111
98
|
throw new TypeError('Invalid Matrix LU decomposition');
|
|
112
99
|
}
|
|
113
100
|
|
|
114
101
|
function _lusolve(l, u, p, q, b) {
|
|
115
|
-
// verify
|
|
102
|
+
// verify decomposition
|
|
116
103
|
l = _toMatrix(l);
|
|
117
|
-
u = _toMatrix(u); //
|
|
118
|
-
|
|
119
|
-
b = solveValidation(l, b, false); // apply row permutations if needed (b is a DenseMatrix)
|
|
104
|
+
u = _toMatrix(u); // apply row permutations if needed (b is a DenseMatrix)
|
|
120
105
|
|
|
121
106
|
if (p) {
|
|
107
|
+
b = solveValidation(l, b, true);
|
|
122
108
|
b._data = (0, _csIpvec.csIpvec)(p, b._data);
|
|
123
109
|
} // use forward substitution to resolve L * y = b
|
|
124
110
|
|
|
@@ -129,8 +115,7 @@ var createLusolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, fun
|
|
|
129
115
|
|
|
130
116
|
if (q) {
|
|
131
117
|
x._data = (0, _csIpvec.csIpvec)(q, x._data);
|
|
132
|
-
}
|
|
133
|
-
|
|
118
|
+
}
|
|
134
119
|
|
|
135
120
|
return x;
|
|
136
121
|
}
|
|
@@ -23,7 +23,7 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
|
|
|
23
23
|
DenseMatrix: DenseMatrix
|
|
24
24
|
});
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* Finds one solution of a linear equation system by backward substitution. Matrix must be an upper triangular matrix. Throws an error if there's no solution.
|
|
27
27
|
*
|
|
28
28
|
* `U * x = b`
|
|
29
29
|
*
|
|
@@ -39,7 +39,7 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
|
|
|
39
39
|
*
|
|
40
40
|
* See also:
|
|
41
41
|
*
|
|
42
|
-
* lup, slu, usolve, lusolve
|
|
42
|
+
* usolveAll, lup, slu, usolve, lusolve
|
|
43
43
|
*
|
|
44
44
|
* @param {Matrix, Array} U A N x N matrix or array (U)
|
|
45
45
|
* @param {Matrix, Array} b A column vector with the b values
|
|
@@ -49,68 +49,59 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
|
|
|
49
49
|
|
|
50
50
|
return typed(name, {
|
|
51
51
|
'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {
|
|
52
|
-
// process matrix
|
|
53
52
|
return _sparseBackwardSubstitution(m, b);
|
|
54
53
|
},
|
|
55
54
|
'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
|
|
56
|
-
// process matrix
|
|
57
55
|
return _denseBackwardSubstitution(m, b);
|
|
58
56
|
},
|
|
59
57
|
'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
|
|
60
|
-
|
|
61
|
-
var m = matrix(a); // use matrix implementation
|
|
62
|
-
|
|
63
|
-
var r = _denseBackwardSubstitution(m, b); // result
|
|
58
|
+
var m = matrix(a);
|
|
64
59
|
|
|
60
|
+
var r = _denseBackwardSubstitution(m, b);
|
|
65
61
|
|
|
66
62
|
return r.valueOf();
|
|
67
63
|
}
|
|
68
64
|
});
|
|
69
65
|
|
|
70
66
|
function _denseBackwardSubstitution(m, b) {
|
|
71
|
-
//
|
|
72
|
-
b = solveValidation(m, b, true);
|
|
73
|
-
|
|
74
|
-
var bdata = b._data; // rows & columns
|
|
75
|
-
|
|
67
|
+
// make b into a column vector
|
|
68
|
+
b = solveValidation(m, b, true);
|
|
69
|
+
var bdata = b._data;
|
|
76
70
|
var rows = m._size[0];
|
|
77
71
|
var columns = m._size[1]; // result
|
|
78
72
|
|
|
79
|
-
var x = [];
|
|
80
|
-
|
|
81
|
-
var data = m._data; // backward solve m * x = b, loop columns (backwards)
|
|
73
|
+
var x = [];
|
|
74
|
+
var mdata = m._data; // loop columns backwards
|
|
82
75
|
|
|
83
76
|
for (var j = columns - 1; j >= 0; j--) {
|
|
84
77
|
// b[j]
|
|
85
78
|
var bj = bdata[j][0] || 0; // x[j]
|
|
86
79
|
|
|
87
|
-
var xj = void 0;
|
|
80
|
+
var xj = void 0;
|
|
88
81
|
|
|
89
82
|
if (!equalScalar(bj, 0)) {
|
|
90
|
-
// value
|
|
91
|
-
var vjj =
|
|
83
|
+
// value at [j, j]
|
|
84
|
+
var vjj = mdata[j][j];
|
|
92
85
|
|
|
93
86
|
if (equalScalar(vjj, 0)) {
|
|
94
87
|
// system cannot be solved
|
|
95
88
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
|
96
|
-
}
|
|
97
|
-
|
|
89
|
+
}
|
|
98
90
|
|
|
99
91
|
xj = divideScalar(bj, vjj); // loop rows
|
|
100
92
|
|
|
101
93
|
for (var i = j - 1; i >= 0; i--) {
|
|
102
94
|
// update copy of b
|
|
103
|
-
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj,
|
|
95
|
+
bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
|
|
104
96
|
}
|
|
105
97
|
} else {
|
|
106
|
-
// zero value
|
|
98
|
+
// zero value at j
|
|
107
99
|
xj = 0;
|
|
108
100
|
} // update x
|
|
109
101
|
|
|
110
102
|
|
|
111
103
|
x[j] = [xj];
|
|
112
|
-
}
|
|
113
|
-
|
|
104
|
+
}
|
|
114
105
|
|
|
115
106
|
return new DenseMatrix({
|
|
116
107
|
data: x,
|
|
@@ -119,74 +110,60 @@ var createUsolve = /* #__PURE__ */(0, _factory.factory)(name, dependencies, func
|
|
|
119
110
|
}
|
|
120
111
|
|
|
121
112
|
function _sparseBackwardSubstitution(m, b) {
|
|
122
|
-
//
|
|
123
|
-
b = solveValidation(m, b, true);
|
|
124
|
-
|
|
125
|
-
var bdata = b._data; // rows & columns
|
|
126
|
-
|
|
113
|
+
// make b into a column vector
|
|
114
|
+
b = solveValidation(m, b, true);
|
|
115
|
+
var bdata = b._data;
|
|
127
116
|
var rows = m._size[0];
|
|
128
|
-
var columns = m._size[1];
|
|
129
|
-
|
|
117
|
+
var columns = m._size[1];
|
|
130
118
|
var values = m._values;
|
|
131
119
|
var index = m._index;
|
|
132
|
-
var ptr = m._ptr; //
|
|
133
|
-
|
|
134
|
-
var i, k; // result
|
|
120
|
+
var ptr = m._ptr; // result
|
|
135
121
|
|
|
136
|
-
var x = []; //
|
|
122
|
+
var x = []; // loop columns backwards
|
|
137
123
|
|
|
138
124
|
for (var j = columns - 1; j >= 0; j--) {
|
|
139
|
-
|
|
140
|
-
var bj = bdata[j][0] || 0; // backward substitution (outer product) avoids inner looping when bj === 0
|
|
125
|
+
var bj = bdata[j][0] || 0;
|
|
141
126
|
|
|
142
127
|
if (!equalScalar(bj, 0)) {
|
|
143
|
-
//
|
|
128
|
+
// non-degenerate row, find solution
|
|
144
129
|
var vjj = 0; // upper triangular matrix values & index (column j)
|
|
145
130
|
|
|
146
|
-
var
|
|
147
|
-
var
|
|
131
|
+
var jValues = [];
|
|
132
|
+
var jIndices = []; // first & last indeces in column
|
|
148
133
|
|
|
149
|
-
var
|
|
150
|
-
var
|
|
134
|
+
var firstIndex = ptr[j];
|
|
135
|
+
var lastIndex = ptr[j + 1]; // values in column, find value at [j, j], loop backwards
|
|
151
136
|
|
|
152
|
-
for (k =
|
|
153
|
-
// row
|
|
154
|
-
i = index[k]; // check row
|
|
137
|
+
for (var k = lastIndex - 1; k >= firstIndex; k--) {
|
|
138
|
+
var i = index[k]; // check row (rows are not sorted!)
|
|
155
139
|
|
|
156
140
|
if (i === j) {
|
|
157
|
-
// update vjj
|
|
158
141
|
vjj = values[k];
|
|
159
142
|
} else if (i < j) {
|
|
160
143
|
// store upper triangular
|
|
161
|
-
|
|
162
|
-
|
|
144
|
+
jValues.push(values[k]);
|
|
145
|
+
jIndices.push(i);
|
|
163
146
|
}
|
|
164
|
-
} // at this point we must have a value
|
|
147
|
+
} // at this point we must have a value in vjj
|
|
165
148
|
|
|
166
149
|
|
|
167
150
|
if (equalScalar(vjj, 0)) {
|
|
168
|
-
// system cannot be solved, there is no value @ [j, j]
|
|
169
151
|
throw new Error('Linear system cannot be solved since matrix is singular');
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
var xj = divideScalar(bj, vjj); // loop upper triangular
|
|
174
|
-
|
|
175
|
-
for (k = 0, l = jindex.length; k < l; k++) {
|
|
176
|
-
// row
|
|
177
|
-
i = jindex[k]; // update copy of b
|
|
152
|
+
}
|
|
178
153
|
|
|
179
|
-
|
|
180
|
-
} // update x
|
|
154
|
+
var xj = divideScalar(bj, vjj);
|
|
181
155
|
|
|
156
|
+
for (var _k = 0, _lastIndex = jIndices.length; _k < _lastIndex; _k++) {
|
|
157
|
+
var _i = jIndices[_k];
|
|
158
|
+
bdata[_i] = [subtract(bdata[_i][0], multiplyScalar(xj, jValues[_k]))];
|
|
159
|
+
}
|
|
182
160
|
|
|
183
161
|
x[j] = [xj];
|
|
184
162
|
} else {
|
|
185
|
-
//
|
|
163
|
+
// degenerate row, we can choose any value
|
|
186
164
|
x[j] = [0];
|
|
187
165
|
}
|
|
188
|
-
}
|
|
189
|
-
|
|
166
|
+
}
|
|
190
167
|
|
|
191
168
|
return new DenseMatrix({
|
|
192
169
|
data: x,
|