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
@@ -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,
|