mathjs 7.2.0 → 7.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. package/HISTORY.md +34 -0
  2. package/dist/math.js +3421 -2476
  3. package/dist/math.min.js +5 -5
  4. package/dist/math.min.map +1 -1
  5. package/docs/expressions/syntax.md +30 -4
  6. package/docs/reference/functions/bin.md +38 -0
  7. package/docs/reference/functions/ceil.md +10 -1
  8. package/docs/reference/functions/fix.md +10 -2
  9. package/docs/reference/functions/floor.md +12 -3
  10. package/docs/reference/functions/hex.md +38 -0
  11. package/docs/reference/functions/lsolve.md +2 -1
  12. package/docs/reference/functions/lsolveAll.md +45 -0
  13. package/docs/reference/functions/oct.md +38 -0
  14. package/docs/reference/functions/rotationMatrix.md +51 -0
  15. package/docs/reference/functions/round.md +6 -2
  16. package/docs/reference/functions/usolve.md +2 -1
  17. package/docs/reference/functions/usolveAll.md +45 -0
  18. package/docs/reference/functions.md +8 -2
  19. package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
  20. package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  21. package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  22. package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  23. package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
  24. package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
  25. package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
  26. package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
  27. package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
  28. package/es/entry/dependenciesAny.generated.js +6 -0
  29. package/es/entry/impureFunctionsAny.generated.js +63 -57
  30. package/es/entry/pureFunctionsAny.generated.js +323 -277
  31. package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
  32. package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  33. package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
  34. package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  35. package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
  36. package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
  37. package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
  38. package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
  39. package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
  40. package/es/expression/parse.js +28 -1
  41. package/es/factoriesAny.js +6 -0
  42. package/es/function/algebra/solver/lsolve.js +42 -69
  43. package/es/function/algebra/solver/lsolveAll.js +213 -0
  44. package/es/function/algebra/solver/lusolve.js +12 -27
  45. package/es/function/algebra/solver/usolve.js +41 -64
  46. package/es/function/algebra/solver/usolveAll.js +213 -0
  47. package/es/function/algebra/solver/utils/solveValidation.js +66 -107
  48. package/es/function/arithmetic/ceil.js +88 -4
  49. package/es/function/arithmetic/fix.js +43 -6
  50. package/es/function/arithmetic/floor.js +90 -6
  51. package/es/function/arithmetic/mod.js +10 -1
  52. package/es/function/arithmetic/round.js +6 -2
  53. package/es/function/matrix/rotationMatrix.js +175 -0
  54. package/es/function/matrix/sqrtm.js +4 -0
  55. package/es/function/probability/pickRandom.js +2 -6
  56. package/es/function/statistics/variance.js +4 -4
  57. package/es/function/string/baseUtils.js +36 -0
  58. package/es/function/string/bin.js +23 -0
  59. package/es/function/string/hex.js +23 -0
  60. package/es/function/string/oct.js +23 -0
  61. package/es/type/bignumber/BigNumber.js +4 -1
  62. package/es/type/number.js +10 -0
  63. package/es/utils/object.js +3 -1
  64. package/es/version.js +1 -1
  65. package/examples/advanced/web_server/math_worker.js +1 -1
  66. package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
  67. package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
  68. package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
  69. package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
  70. package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
  71. package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
  72. package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
  73. package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
  74. package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
  75. package/lib/entry/dependenciesAny.generated.js +48 -0
  76. package/lib/entry/impureFunctionsAny.generated.js +65 -59
  77. package/lib/entry/pureFunctionsAny.generated.js +373 -321
  78. package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
  79. package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  80. package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
  81. package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  82. package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  83. package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
  84. package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
  85. package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
  86. package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
  87. package/lib/expression/parse.js +28 -1
  88. package/lib/factoriesAny.js +48 -0
  89. package/lib/function/algebra/solver/lsolve.js +42 -69
  90. package/lib/function/algebra/solver/lsolveAll.js +223 -0
  91. package/lib/function/algebra/solver/lusolve.js +12 -27
  92. package/lib/function/algebra/solver/usolve.js +41 -64
  93. package/lib/function/algebra/solver/usolveAll.js +223 -0
  94. package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
  95. package/lib/function/arithmetic/ceil.js +91 -4
  96. package/lib/function/arithmetic/fix.js +44 -6
  97. package/lib/function/arithmetic/floor.js +93 -6
  98. package/lib/function/arithmetic/mod.js +10 -1
  99. package/lib/function/arithmetic/round.js +6 -2
  100. package/lib/function/matrix/rotationMatrix.js +185 -0
  101. package/lib/function/matrix/sqrtm.js +4 -0
  102. package/lib/function/probability/pickRandom.js +3 -7
  103. package/lib/function/statistics/variance.js +4 -4
  104. package/lib/function/string/baseUtils.js +45 -0
  105. package/lib/function/string/bin.js +31 -0
  106. package/lib/function/string/hex.js +31 -0
  107. package/lib/function/string/oct.js +31 -0
  108. package/lib/header.js +2 -2
  109. package/lib/type/bignumber/BigNumber.js +3 -1
  110. package/lib/type/number.js +10 -0
  111. package/lib/utils/object.js +3 -1
  112. package/lib/version.js +1 -1
  113. package/package.json +12 -12
  114. package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
  115. package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  116. package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  117. package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  118. package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
  119. package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
  120. package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
  121. package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
  122. package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
  123. package/src/entry/dependenciesAny.generated.js +6 -0
  124. package/src/entry/impureFunctionsAny.generated.js +104 -92
  125. package/src/entry/pureFunctionsAny.generated.js +94 -82
  126. package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
  127. package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  128. package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
  129. package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  130. package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  131. package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
  132. package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
  133. package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
  134. package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
  135. package/src/expression/parse.js +25 -0
  136. package/src/factoriesAny.js +6 -0
  137. package/src/function/algebra/solver/lsolve.js +52 -58
  138. package/src/function/algebra/solver/lsolveAll.js +197 -0
  139. package/src/function/algebra/solver/lusolve.js +9 -19
  140. package/src/function/algebra/solver/usolve.js +52 -55
  141. package/src/function/algebra/solver/usolveAll.js +199 -0
  142. package/src/function/algebra/solver/utils/solveValidation.js +78 -86
  143. package/src/function/arithmetic/ceil.js +63 -3
  144. package/src/function/arithmetic/fix.js +45 -6
  145. package/src/function/arithmetic/floor.js +65 -5
  146. package/src/function/arithmetic/mod.js +8 -1
  147. package/src/function/arithmetic/round.js +6 -2
  148. package/src/function/matrix/rotationMatrix.js +185 -0
  149. package/src/function/matrix/sqrtm.js +4 -0
  150. package/src/function/probability/pickRandom.js +2 -6
  151. package/src/function/statistics/variance.js +4 -4
  152. package/src/function/string/baseUtils.js +29 -0
  153. package/src/function/string/bin.js +23 -0
  154. package/src/function/string/hex.js +23 -0
  155. package/src/function/string/oct.js +24 -0
  156. package/src/type/bignumber/BigNumber.js +2 -1
  157. package/src/type/number.js +9 -1
  158. package/src/utils/object.js +3 -1
  159. package/src/version.js +1 -1
@@ -51,63 +51,49 @@ export var createLusolve = /* #__PURE__ */factory(name, dependencies, function (
51
51
 
52
52
  return typed(name, {
53
53
  'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
54
- // convert a to matrix
55
- a = matrix(a); // matrix lup decomposition
56
-
57
- var d = lup(a); // solve
58
-
59
- var x = _lusolve(d.L, d.U, d.p, null, b); // convert result to array
54
+ a = matrix(a);
55
+ var d = lup(a);
60
56
 
57
+ var x = _lusolve(d.L, d.U, d.p, null, b);
61
58
 
62
59
  return x.valueOf();
63
60
  },
64
61
  'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) {
65
- // matrix lup decomposition
66
- var d = lup(a); // solve
67
-
62
+ var d = lup(a);
68
63
  return _lusolve(d.L, d.U, d.p, null, b);
69
64
  },
70
65
  'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) {
71
- // matrix lup decomposition
72
- var d = lup(a); // solve
73
-
66
+ var d = lup(a);
74
67
  return _lusolve(d.L, d.U, d.p, null, b);
75
68
  },
76
69
  'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) {
77
- // matrix lu decomposition
78
- var d = slu(a, order, threshold); // solve
79
-
70
+ var d = slu(a, order, threshold);
80
71
  return _lusolve(d.L, d.U, d.p, d.q, b);
81
72
  },
82
73
  'Object, Array | Matrix': function ObjectArrayMatrix(d, b) {
83
- // solve
84
74
  return _lusolve(d.L, d.U, d.p, d.q, b);
85
75
  }
86
76
  });
87
77
 
88
78
  function _toMatrix(a) {
89
- // check it is a matrix
90
79
  if (isMatrix(a)) {
91
80
  return a;
92
- } // check array
93
-
81
+ }
94
82
 
95
83
  if (isArray(a)) {
96
84
  return matrix(a);
97
- } // throw
98
-
85
+ }
99
86
 
100
87
  throw new TypeError('Invalid Matrix LU decomposition');
101
88
  }
102
89
 
103
90
  function _lusolve(l, u, p, q, b) {
104
- // verify L, U, P
91
+ // verify decomposition
105
92
  l = _toMatrix(l);
106
- u = _toMatrix(u); // validate matrix and vector
107
-
108
- b = solveValidation(l, b, false); // apply row permutations if needed (b is a DenseMatrix)
93
+ u = _toMatrix(u); // apply row permutations if needed (b is a DenseMatrix)
109
94
 
110
95
  if (p) {
96
+ b = solveValidation(l, b, true);
111
97
  b._data = csIpvec(p, b._data);
112
98
  } // use forward substitution to resolve L * y = b
113
99
 
@@ -118,8 +104,7 @@ export var createLusolve = /* #__PURE__ */factory(name, dependencies, function (
118
104
 
119
105
  if (q) {
120
106
  x._data = csIpvec(q, x._data);
121
- } // return solution
122
-
107
+ }
123
108
 
124
109
  return x;
125
110
  }
@@ -14,7 +14,7 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
14
14
  DenseMatrix: DenseMatrix
15
15
  });
16
16
  /**
17
- * Solves the linear equation system by backward substitution. Matrix must be an upper triangular matrix.
17
+ * 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.
18
18
  *
19
19
  * `U * x = b`
20
20
  *
@@ -30,7 +30,7 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
30
30
  *
31
31
  * See also:
32
32
  *
33
- * lup, slu, usolve, lusolve
33
+ * usolveAll, lup, slu, usolve, lusolve
34
34
  *
35
35
  * @param {Matrix, Array} U A N x N matrix or array (U)
36
36
  * @param {Matrix, Array} b A column vector with the b values
@@ -40,68 +40,59 @@ export var createUsolve = /* #__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 _sparseBackwardSubstitution(m, b);
45
44
  },
46
45
  'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
47
- // process matrix
48
46
  return _denseBackwardSubstitution(m, b);
49
47
  },
50
48
  'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
51
- // create dense matrix from array
52
- var m = matrix(a); // use matrix implementation
53
-
54
- var r = _denseBackwardSubstitution(m, b); // result
49
+ var m = matrix(a);
55
50
 
51
+ var r = _denseBackwardSubstitution(m, b);
56
52
 
57
53
  return r.valueOf();
58
54
  }
59
55
  });
60
56
 
61
57
  function _denseBackwardSubstitution(m, b) {
62
- // validate matrix and vector, return copy of column vector b
63
- b = solveValidation(m, b, true); // column vector data
64
-
65
- var bdata = b._data; // rows & columns
66
-
58
+ // make b into a column vector
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 = []; // arrays
71
-
72
- var data = m._data; // backward solve m * x = b, loop columns (backwards)
64
+ var x = [];
65
+ var mdata = m._data; // loop columns backwards
73
66
 
74
67
  for (var j = columns - 1; j >= 0; j--) {
75
68
  // b[j]
76
69
  var bj = bdata[j][0] || 0; // x[j]
77
70
 
78
- var xj = void 0; // backward substitution (outer product) avoids inner looping when bj === 0
71
+ var xj = void 0;
79
72
 
80
73
  if (!equalScalar(bj, 0)) {
81
- // value @ [j, j]
82
- var vjj = data[j][j]; // check vjj
74
+ // value at [j, j]
75
+ var vjj = mdata[j][j];
83
76
 
84
77
  if (equalScalar(vjj, 0)) {
85
78
  // system cannot be solved
86
79
  throw new Error('Linear system cannot be solved since matrix is singular');
87
- } // calculate xj
88
-
80
+ }
89
81
 
90
82
  xj = divideScalar(bj, vjj); // loop rows
91
83
 
92
84
  for (var i = j - 1; i >= 0; i--) {
93
85
  // update copy of b
94
- bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))];
86
+ bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];
95
87
  }
96
88
  } else {
97
- // zero value @ j
89
+ // zero value at j
98
90
  xj = 0;
99
91
  } // update x
100
92
 
101
93
 
102
94
  x[j] = [xj];
103
- } // return column vector
104
-
95
+ }
105
96
 
106
97
  return new DenseMatrix({
107
98
  data: x,
@@ -110,74 +101,60 @@ export var createUsolve = /* #__PURE__ */factory(name, dependencies, function (_
110
101
  }
111
102
 
112
103
  function _sparseBackwardSubstitution(m, b) {
113
- // validate matrix and vector, return copy of column vector b
114
- b = solveValidation(m, b, true); // column vector data
115
-
116
- var bdata = b._data; // rows & columns
117
-
104
+ // make b into a column vector
105
+ b = solveValidation(m, b, true);
106
+ var bdata = b._data;
118
107
  var rows = m._size[0];
119
- var columns = m._size[1]; // matrix arrays
120
-
108
+ var columns = m._size[1];
121
109
  var values = m._values;
122
110
  var index = m._index;
123
- var ptr = m._ptr; // vars
124
-
125
- var i, k; // result
111
+ var ptr = m._ptr; // result
126
112
 
127
- var x = []; // backward solve m * x = b, loop columns (backwards)
113
+ var x = []; // loop columns backwards
128
114
 
129
115
  for (var j = columns - 1; j >= 0; j--) {
130
- // b[j]
131
- var bj = bdata[j][0] || 0; // backward substitution (outer product) avoids inner looping when bj === 0
116
+ var bj = bdata[j][0] || 0;
132
117
 
133
118
  if (!equalScalar(bj, 0)) {
134
- // value @ [j, j]
119
+ // non-degenerate row, find solution
135
120
  var vjj = 0; // upper triangular matrix values & index (column j)
136
121
 
137
- var jvalues = [];
138
- var jindex = []; // first & last indeces in column
122
+ var jValues = [];
123
+ var jIndices = []; // first & last indeces in column
139
124
 
140
- var f = ptr[j];
141
- var l = ptr[j + 1]; // values in column, find value @ [j, j], loop backwards
125
+ var firstIndex = ptr[j];
126
+ var lastIndex = ptr[j + 1]; // values in column, find value at [j, j], loop backwards
142
127
 
143
- for (k = l - 1; k >= f; k--) {
144
- // row
145
- i = index[k]; // check row
128
+ for (var k = lastIndex - 1; k >= firstIndex; k--) {
129
+ var i = index[k]; // check row (rows are not sorted!)
146
130
 
147
131
  if (i === j) {
148
- // update vjj
149
132
  vjj = values[k];
150
133
  } else if (i < j) {
151
134
  // store upper triangular
152
- jvalues.push(values[k]);
153
- jindex.push(i);
135
+ jValues.push(values[k]);
136
+ jIndices.push(i);
154
137
  }
155
- } // at this point we must have a value @ [j, j]
138
+ } // at this point we must have a value in vjj
156
139
 
157
140
 
158
141
  if (equalScalar(vjj, 0)) {
159
- // system cannot be solved, there is no value @ [j, j]
160
142
  throw new Error('Linear system cannot be solved since matrix is singular');
161
- } // calculate xj
162
-
163
-
164
- var xj = divideScalar(bj, vjj); // loop upper triangular
165
-
166
- for (k = 0, l = jindex.length; k < l; k++) {
167
- // row
168
- i = jindex[k]; // update copy of b
143
+ }
169
144
 
170
- bdata[i] = [subtract(bdata[i][0], multiplyScalar(xj, jvalues[k]))];
171
- } // update x
145
+ var xj = divideScalar(bj, vjj);
172
146
 
147
+ for (var _k = 0, _lastIndex = jIndices.length; _k < _lastIndex; _k++) {
148
+ var _i = jIndices[_k];
149
+ bdata[_i] = [subtract(bdata[_i][0], multiplyScalar(xj, jValues[_k]))];
150
+ }
173
151
 
174
152
  x[j] = [xj];
175
153
  } else {
176
- // update x
154
+ // degenerate row, we can choose any value
177
155
  x[j] = [0];
178
156
  }
179
- } // return vector
180
-
157
+ }
181
158
 
182
159
  return new DenseMatrix({
183
160
  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 = 'usolveAll';
16
+ var dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];
17
+ export var createUsolveAll = /* #__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 backward substitution. Matrix must be an upper triangular matrix.
30
+ *
31
+ * `U * x = b`
32
+ *
33
+ * Syntax:
34
+ *
35
+ * math.usolve(U, b)
36
+ *
37
+ * Examples:
38
+ *
39
+ * const a = [[-2, 3], [2, 1]]
40
+ * const b = [11, 9]
41
+ * const x = usolve(a, b) // [ [[8], [9]] ]
42
+ *
43
+ * See also:
44
+ *
45
+ * usolve, lup, slu, usolve, lusolve
46
+ *
47
+ * @param {Matrix, Array} U A N x N matrix or array (U)
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 _sparseBackwardSubstitution(m, b);
56
+ },
57
+ 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {
58
+ return _denseBackwardSubstitution(m, b);
59
+ },
60
+ 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {
61
+ var m = matrix(a);
62
+
63
+ var R = _denseBackwardSubstitution(m, b);
64
+
65
+ return R.map(function (r) {
66
+ return r.valueOf();
67
+ });
68
+ }
69
+ });
70
+
71
+ function _denseBackwardSubstitution(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 backwards
81
+
82
+ for (var i = columns - 1; i >= 0; 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 >= 0; 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 >= 0; _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 _sparseBackwardSubstitution(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 backwards
142
+
143
+ for (var i = columns - 1; i >= 0; 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 = lastIndex - 1; j >= firstIndex; j--) {
158
+ var J = index[j]; // check row
159
+
160
+ if (J === i) {
161
+ Mii = values[j];
162
+ } else if (J < i) {
163
+ // store upper 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); // loop upper triangular
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; // loop upper triangular
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
+ });