mathjs 11.12.0 → 12.1.0

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.
Files changed (43) hide show
  1. package/HISTORY.md +54 -2
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  7. package/lib/cjs/entry/pureFunctionsAny.generated.js +2 -0
  8. package/lib/cjs/expression/embeddedDocs/function/arithmetic/round.js +2 -2
  9. package/lib/cjs/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  10. package/lib/cjs/expression/node/AssignmentNode.js +1 -1
  11. package/lib/cjs/expression/node/FunctionAssignmentNode.js +1 -1
  12. package/lib/cjs/function/algebra/derivative.js +8 -31
  13. package/lib/cjs/function/arithmetic/gcd.js +4 -5
  14. package/lib/cjs/function/arithmetic/mod.js +2 -9
  15. package/lib/cjs/function/arithmetic/round.js +59 -16
  16. package/lib/cjs/function/matrix/eigs/complexEigs.js +73 -68
  17. package/lib/cjs/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +57 -51
  18. package/lib/cjs/function/matrix/eigs.js +118 -45
  19. package/lib/cjs/function/probability/pickRandom.js +2 -2
  20. package/lib/cjs/header.js +2 -2
  21. package/lib/cjs/type/number.js +2 -2
  22. package/lib/cjs/utils/number.js +1 -1
  23. package/lib/cjs/utils/snapshot.js +6 -6
  24. package/lib/cjs/version.js +1 -1
  25. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  26. package/lib/esm/entry/pureFunctionsAny.generated.js +2 -0
  27. package/lib/esm/expression/embeddedDocs/function/arithmetic/round.js +2 -2
  28. package/lib/esm/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  29. package/lib/esm/expression/node/AssignmentNode.js +1 -1
  30. package/lib/esm/expression/node/FunctionAssignmentNode.js +1 -1
  31. package/lib/esm/function/algebra/derivative.js +8 -31
  32. package/lib/esm/function/arithmetic/mod.js +2 -9
  33. package/lib/esm/function/arithmetic/round.js +40 -17
  34. package/lib/esm/function/matrix/eigs/complexEigs.js +73 -68
  35. package/lib/esm/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +55 -51
  36. package/lib/esm/function/matrix/eigs.js +119 -47
  37. package/lib/esm/function/probability/pickRandom.js +2 -2
  38. package/lib/esm/type/number.js +2 -2
  39. package/lib/esm/utils/number.js +1 -1
  40. package/lib/esm/version.js +1 -1
  41. package/package.json +14 -14
  42. package/types/EXPLANATION.md +54 -0
  43. package/types/index.d.ts +6825 -6483
@@ -1,18 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.createEigs = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
9
  var _factory = require("../../utils/factory.js");
8
10
  var _string = require("../../utils/string.js");
9
11
  var _complexEigs = require("./eigs/complexEigs.js");
10
- var _realSymetric = require("./eigs/realSymetric.js");
12
+ var _realSymmetric = require("./eigs/realSymmetric.js");
11
13
  var _is = require("../../utils/is.js");
12
14
  var name = 'eigs';
13
15
 
14
16
  // The absolute state of math.js's dependency system:
15
- var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
17
+ var dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'size', 'reshape', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];
16
18
  var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
17
19
  var config = _ref.config,
18
20
  typed = _ref.typed,
@@ -37,6 +39,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
37
39
  complex = _ref.complex,
38
40
  sqrt = _ref.sqrt,
39
41
  diag = _ref.diag,
42
+ size = _ref.size,
43
+ reshape = _ref.reshape,
40
44
  qr = _ref.qr,
41
45
  usolve = _ref.usolve,
42
46
  usolveAll = _ref.usolveAll,
@@ -45,7 +49,7 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
45
49
  smaller = _ref.smaller,
46
50
  matrixFromColumns = _ref.matrixFromColumns,
47
51
  dot = _ref.dot;
48
- var doRealSymetric = (0, _realSymetric.createRealSymmetric)({
52
+ var doRealSymmetric = (0, _realSymmetric.createRealSymmetric)({
49
53
  config: config,
50
54
  addScalar: addScalar,
51
55
  subtract: subtract,
@@ -75,6 +79,8 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
75
79
  abs: abs,
76
80
  bignumber: bignumber,
77
81
  diag: diag,
82
+ size: size,
83
+ reshape: reshape,
78
84
  qr: qr,
79
85
  inv: inv,
80
86
  usolve: usolve,
@@ -88,26 +94,54 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
88
94
  });
89
95
 
90
96
  /**
91
- * Compute eigenvalues and eigenvectors of a matrix. The eigenvalues are sorted by their absolute value, ascending.
92
- * An eigenvalue with multiplicity k will be listed k times. The eigenvectors are returned as columns of a matrix
93
- * the eigenvector that belongs to the j-th eigenvalue in the list (eg. `values[j]`) is the j-th column (eg. `column(vectors, j)`).
94
- * If the algorithm fails to converge, it will throw an error – in that case, however, you may still find useful information
97
+ * Compute eigenvalues and optionally eigenvectors of a square matrix.
98
+ * The eigenvalues are sorted by their absolute value, ascending, and
99
+ * returned as a vector in the `values` property of the returned project.
100
+ * An eigenvalue with algebraic multiplicity k will be listed k times, so
101
+ * that the returned `values` vector always has length equal to the size
102
+ * of the input matrix.
103
+ *
104
+ * The `eigenvectors` property of the return value provides the eigenvectors.
105
+ * It is an array of plain objects: the `value` property of each gives the
106
+ * associated eigenvalue, and the `vector` property gives the eigenvector
107
+ * itself. Note that the same `value` property will occur as many times in
108
+ * the list provided by `eigenvectors` as the geometric multiplicity of
109
+ * that value.
110
+ *
111
+ * If the algorithm fails to converge, it will throw an error –
112
+ * in that case, however, you may still find useful information
95
113
  * in `err.values` and `err.vectors`.
96
114
  *
115
+ * Note that the 'precision' option does not directly specify the _accuracy_
116
+ * of the returned eigenvalues. Rather, it determines how small an entry
117
+ * of the iterative approximations to an upper triangular matrix must be
118
+ * in order to be considered zero. The actual accuracy of the returned
119
+ * eigenvalues may be greater or less than the precision, depending on the
120
+ * conditioning of the matrix and how far apart or close the actual
121
+ * eigenvalues are. Note that currently, relatively simple, "traditional"
122
+ * methods of eigenvalue computation are being used; this is not a modern,
123
+ * high-precision eigenvalue computation. That said, it should typically
124
+ * produce fairly reasonable results.
125
+ *
97
126
  * Syntax:
98
127
  *
99
128
  * math.eigs(x, [prec])
129
+ * math.eigs(x, {options})
100
130
  *
101
131
  * Examples:
102
132
  *
103
- * const { eigs, multiply, column, transpose } = math
133
+ * const { eigs, multiply, column, transpose, matrixFromColumns } = math
104
134
  * const H = [[5, 2.3], [2.3, 1]]
105
- * const ans = eigs(H) // returns {values: [E1,E2...sorted], vectors: [v1,v2.... corresponding vectors as columns]}
135
+ * const ans = eigs(H) // returns {values: [E1,E2...sorted], eigenvectors: [{value: E1, vector: v2}, {value: e, vector: v2}, ...]
106
136
  * const E = ans.values
107
- * const U = ans.vectors
108
- * multiply(H, column(U, 0)) // returns multiply(E[0], column(U, 0))
109
- * const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H
110
- * E[0] == UTxHxU[0][0] // returns true
137
+ * const V = ans.eigenvectors
138
+ * multiply(H, V[0].vector)) // returns multiply(E[0], V[0].vector))
139
+ * const U = matrixFromColumns(...V.map(obj => obj.vector))
140
+ * const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H if possible
141
+ * E[0] == UTxHxU[0][0] // returns true always
142
+ *
143
+ * // Compute only approximate eigenvalues:
144
+ * const {values} = eigs(H, {eigenvectors: false, precision: 1e-6})
111
145
  *
112
146
  * See also:
113
147
  *
@@ -115,57 +149,96 @@ var createEigs = exports.createEigs = /* #__PURE__ */(0, _factory.factory)(name,
115
149
  *
116
150
  * @param {Array | Matrix} x Matrix to be diagonalized
117
151
  *
118
- * @param {number | BigNumber} [prec] Precision, default value: 1e-15
119
- * @return {{values: Array|Matrix, vectors: Array|Matrix}} Object containing an array of eigenvalues and a matrix with eigenvectors as columns.
152
+ * @param {number | BigNumber | OptsObject} [opts] Object with keys `precision`, defaulting to config.epsilon, and `eigenvectors`, defaulting to true and specifying whether to compute eigenvectors. If just a number, specifies precision.
153
+ * @return {{values: Array|Matrix, eigenvectors?: Array<EVobj>}} Object containing an array of eigenvalues and an array of {value: number|BigNumber, vector: Array|Matrix} objects. The eigenvectors property is undefined if eigenvectors were not requested.
120
154
  *
121
155
  */
122
156
  return typed('eigs', {
157
+ // The conversion to matrix in the first two implementations,
158
+ // just to convert back to an array right away in
159
+ // computeValuesAndVectors, is unfortunate, and should perhaps be
160
+ // streamlined. It is done because the Matrix object carries some
161
+ // type information about its entries, and so constructing the matrix
162
+ // is a roundabout way of doing type detection.
123
163
  Array: function Array(x) {
124
- var mat = matrix(x);
125
- return computeValuesAndVectors(mat);
164
+ return doEigs(matrix(x));
126
165
  },
127
166
  'Array, number|BigNumber': function ArrayNumberBigNumber(x, prec) {
128
- var mat = matrix(x);
129
- return computeValuesAndVectors(mat, prec);
167
+ return doEigs(matrix(x), {
168
+ precision: prec
169
+ });
170
+ },
171
+ 'Array, Object': function ArrayObject(x, opts) {
172
+ return doEigs(matrix(x), opts);
130
173
  },
131
174
  Matrix: function Matrix(mat) {
132
- var _computeValuesAndVect = computeValuesAndVectors(mat),
133
- values = _computeValuesAndVect.values,
134
- vectors = _computeValuesAndVect.vectors;
135
- return {
136
- values: matrix(values),
137
- vectors: matrix(vectors)
138
- };
175
+ return doEigs(mat, {
176
+ matricize: true
177
+ });
139
178
  },
140
179
  'Matrix, number|BigNumber': function MatrixNumberBigNumber(mat, prec) {
141
- var _computeValuesAndVect2 = computeValuesAndVectors(mat, prec),
142
- values = _computeValuesAndVect2.values,
143
- vectors = _computeValuesAndVect2.vectors;
144
- return {
145
- values: matrix(values),
146
- vectors: matrix(vectors)
180
+ return doEigs(mat, {
181
+ precision: prec,
182
+ matricize: true
183
+ });
184
+ },
185
+ 'Matrix, Object': function MatrixObject(mat, opts) {
186
+ var useOpts = {
187
+ matricize: true
147
188
  };
189
+ (0, _extends2["default"])(useOpts, opts);
190
+ return doEigs(mat, useOpts);
148
191
  }
149
192
  });
150
- function computeValuesAndVectors(mat, prec) {
151
- if (prec === undefined) {
152
- prec = config.epsilon;
193
+ function doEigs(mat) {
194
+ var _opts$precision;
195
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
196
+ var computeVectors = 'eigenvectors' in opts ? opts.eigenvectors : true;
197
+ var prec = (_opts$precision = opts.precision) !== null && _opts$precision !== void 0 ? _opts$precision : config.epsilon;
198
+ var result = computeValuesAndVectors(mat, prec, computeVectors);
199
+ if (opts.matricize) {
200
+ result.values = matrix(result.values);
201
+ if (computeVectors) {
202
+ result.eigenvectors = result.eigenvectors.map(function (_ref2) {
203
+ var value = _ref2.value,
204
+ vector = _ref2.vector;
205
+ return {
206
+ value: value,
207
+ vector: matrix(vector)
208
+ };
209
+ });
210
+ }
211
+ }
212
+ if (computeVectors) {
213
+ Object.defineProperty(result, 'vectors', {
214
+ enumerable: false,
215
+ // to make sure that the eigenvectors can still be
216
+ // converted to string.
217
+ get: function get() {
218
+ throw new Error('eigs(M).vectors replaced with eigs(M).eigenvectors');
219
+ }
220
+ });
153
221
  }
154
- var size = mat.size();
155
- if (size.length !== 2 || size[0] !== size[1]) {
156
- throw new RangeError('Matrix must be square (size: ' + (0, _string.format)(size) + ')');
222
+ return result;
223
+ }
224
+ function computeValuesAndVectors(mat, prec, computeVectors) {
225
+ var arr = mat.toArray(); // NOTE: arr is guaranteed to be unaliased
226
+ // and so safe to modify in place
227
+ var asize = mat.size();
228
+ if (asize.length !== 2 || asize[0] !== asize[1]) {
229
+ throw new RangeError("Matrix must be square (size: ".concat((0, _string.format)(asize), ")"));
157
230
  }
158
- var arr = mat.toArray();
159
- var N = size[0];
231
+ var N = asize[0];
160
232
  if (isReal(arr, N, prec)) {
161
- coerceReal(arr, N);
233
+ coerceReal(arr, N); // modifies arr by side effect
234
+
162
235
  if (isSymmetric(arr, N, prec)) {
163
- var _type = coerceTypes(mat, arr, N);
164
- return doRealSymetric(arr, N, prec, _type);
236
+ var _type = coerceTypes(mat, arr, N); // modifies arr by side effect
237
+ return doRealSymmetric(arr, N, prec, _type, computeVectors);
165
238
  }
166
239
  }
167
- var type = coerceTypes(mat, arr, N);
168
- return doComplexEigs(arr, N, prec, type);
240
+ var type = coerceTypes(mat, arr, N); // modifies arr by side effect
241
+ return doComplexEigs(arr, N, prec, type, computeVectors);
169
242
  }
170
243
 
171
244
  /** @return {boolean} */
@@ -56,8 +56,8 @@ var createPickRandom = exports.createPickRandom = /* #__PURE__ */(0, _factory.fa
56
56
  * @param {Array | Matrix} array A one dimensional array
57
57
  * @param {Int} number An int or float
58
58
  * @param {Array | Matrix} weights An array of ints or floats
59
- * @return {number | Array} Returns a single random value from array when number is 1 or undefined.
60
- * Returns an array with the configured number of elements when number is > 1.
59
+ * @return {number | Array} Returns a single random value from array when number is undefined.
60
+ * Returns an array with the configured number of elements when number is defined.
61
61
  */
62
62
  return typed(name, {
63
63
  'Array | Matrix': function ArrayMatrix(possibles) {
package/lib/cjs/header.js CHANGED
@@ -6,8 +6,8 @@
6
6
  * It features real and complex numbers, units, matrices, a large set of
7
7
  * mathematical functions, and a flexible expression parser.
8
8
  *
9
- * @version 11.12.0
10
- * @date 2023-10-26
9
+ * @version 12.1.0
10
+ * @date 2023-11-17
11
11
  *
12
12
  * @license
13
13
  * Copyright (C) 2013-2023 Jos de Jong <wjosdejong@gmail.com>
@@ -49,7 +49,7 @@ function makeNumberFromNonDecimalParts(parts) {
49
49
  }
50
50
  var result = n + f;
51
51
  if (isNaN(result)) {
52
- throw new SyntaxError('String "' + parts.input + '" is no valid number');
52
+ throw new SyntaxError('String "' + parts.input + '" is not a valid number');
53
53
  }
54
54
  return result;
55
55
  }
@@ -103,7 +103,7 @@ var createNumber = exports.createNumber = /* #__PURE__ */(0, _factory.factory)(n
103
103
  }
104
104
  var num = Number(x);
105
105
  if (isNaN(num)) {
106
- throw new SyntaxError('String "' + x + '" is no valid number');
106
+ throw new SyntaxError('String "' + x + '" is not a valid number');
107
107
  }
108
108
  if (wordSizeSuffixMatch) {
109
109
  // x is a signed bin, oct, or hex literal
@@ -604,7 +604,7 @@ function nearlyEqual(x, y, epsilon) {
604
604
  if (isFinite(x) && isFinite(y)) {
605
605
  // check numbers are very close, needed when comparing numbers near zero
606
606
  var diff = Math.abs(x - y);
607
- if (diff < DBL_EPSILON) {
607
+ if (diff <= DBL_EPSILON) {
608
608
  return true;
609
609
  } else {
610
610
  // use relative error
@@ -18,12 +18,12 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
18
18
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
19
19
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
20
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /**
21
- * This file contains helper methods to create expected snapshot structures
22
- * of both instance and ES6 exports.
23
- *
24
- * The files are located here and not under /test or /tools so it's transpiled
25
- * into ES5 code under /lib and can be used straight by node.js
26
- */
21
+ * This file contains helper methods to create expected snapshot structures
22
+ * of both instance and ES6 exports.
23
+ *
24
+ * The files are located here and not under /test or /tools so it's transpiled
25
+ * into ES5 code under /lib and can be used straight by node.js
26
+ */
27
27
  var validateTypeOf = exports.validateTypeOf = allIsFunctions.typeOf;
28
28
  function validateBundle(expectedBundleStructure, bundle) {
29
29
  var originalWarn = console.warn;
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- var version = exports.version = '11.12.0';
7
+ var version = exports.version = '12.1.0';
8
8
  // Note: This file is automatically generated when building math.js.
9
9
  // Changes made in this file will be overwritten.
@@ -25,7 +25,9 @@ import { multiplyScalarDependencies } from './dependenciesMultiplyScalar.generat
25
25
  import { numberDependencies } from './dependenciesNumber.generated.js';
26
26
  import { qrDependencies } from './dependenciesQr.generated.js';
27
27
  import { reDependencies } from './dependenciesRe.generated.js';
28
+ import { reshapeDependencies } from './dependenciesReshape.generated.js';
28
29
  import { sinDependencies } from './dependenciesSin.generated.js';
30
+ import { sizeDependencies } from './dependenciesSize.generated.js';
29
31
  import { smallerDependencies } from './dependenciesSmaller.generated.js';
30
32
  import { sqrtDependencies } from './dependenciesSqrt.generated.js';
31
33
  import { subtractDependencies } from './dependenciesSubtract.generated.js';
@@ -57,7 +59,9 @@ export var eigsDependencies = {
57
59
  numberDependencies,
58
60
  qrDependencies,
59
61
  reDependencies,
62
+ reshapeDependencies,
60
63
  sinDependencies,
64
+ sizeDependencies,
61
65
  smallerDependencies,
62
66
  sqrtDependencies,
63
67
  subtractDependencies,
@@ -1582,7 +1582,9 @@ export var eigs = /* #__PURE__ */createEigs({
1582
1582
  number,
1583
1583
  qr,
1584
1584
  re,
1585
+ reshape,
1585
1586
  sin,
1587
+ size,
1586
1588
  smaller,
1587
1589
  sqrt,
1588
1590
  subtract,
@@ -1,8 +1,8 @@
1
1
  export var roundDocs = {
2
2
  name: 'round',
3
3
  category: 'Arithmetic',
4
- syntax: ['round(x)', 'round(x, n)'],
4
+ syntax: ['round(x)', 'round(x, n)', 'round(unit, valuelessUnit)', 'round(unit, n, valuelessUnit)'],
5
5
  description: 'round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.',
6
- examples: ['round(3.2)', 'round(3.8)', 'round(-4.2)', 'round(-4.8)', 'round(pi, 3)', 'round(123.45678, 2)'],
6
+ examples: ['round(3.2)', 'round(3.8)', 'round(-4.2)', 'round(-4.8)', 'round(pi, 3)', 'round(123.45678, 2)', 'round(3.241cm, 2, cm)', 'round([3.2, 3.8, -4.7])'],
7
7
  seealso: ['ceil', 'floor', 'fix']
8
8
  };
@@ -2,7 +2,7 @@ export var eigsDocs = {
2
2
  name: 'eigs',
3
3
  category: 'Matrix',
4
4
  syntax: ['eigs(x)'],
5
- description: 'Calculate the eigenvalues and eigenvectors of a real symmetric matrix',
6
- examples: ['eigs([[5, 2.3], [2.3, 1]])'],
5
+ description: 'Calculate the eigenvalues and optionally eigenvectors of a square matrix',
6
+ examples: ['eigs([[5, 2.3], [2.3, 1]])', 'eigs([[1, 2, 3], [4, 5, 6], [7, 8, 9]], { precision: 1e-6, eigenvectors: false }'],
7
7
  seealso: ['inv']
8
8
  };
@@ -295,7 +295,7 @@ export var createAssignmentNode = /* #__PURE__ */factory(name, dependencies, _re
295
295
  if (needParenthesis(this, options && options.parenthesis, options && options.implicit)) {
296
296
  value = "\\left(".concat(value, "\\right)");
297
297
  }
298
- return object + index + ':=' + value;
298
+ return object + index + '=' + value;
299
299
  }
300
300
  }
301
301
  _defineProperty(AssignmentNode, "name", name);
@@ -224,7 +224,7 @@ export var createFunctionAssignmentNode = /* #__PURE__ */factory(name, dependenc
224
224
  if (needParenthesis(this, parenthesis, options && options.implicit)) {
225
225
  expr = "\\left(".concat(expr, "\\right)");
226
226
  }
227
- return '\\mathrm{' + this.name + '}\\left(' + this.params.map(toSymbol).join(',') + '\\right):=' + expr;
227
+ return '\\mathrm{' + this.name + '}\\left(' + this.params.map(toSymbol).join(',') + '\\right)=' + expr;
228
228
  }
229
229
  }
230
230
  _defineProperty(FunctionAssignmentNode, "name", name);
@@ -208,9 +208,6 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
208
208
  return _derivative(node.expr, constNodes);
209
209
  },
210
210
  'FunctionNode, Object': function FunctionNodeObject(node, constNodes) {
211
- if (node.args.length !== 1) {
212
- funcArgsCheck(node);
213
- }
214
211
  if (constNodes[node] !== undefined) {
215
212
  return createConstantNode(0);
216
213
  }
@@ -259,9 +256,12 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
259
256
  }
260
257
  break;
261
258
  case 'pow':
262
- constNodes[arg1] = constNodes[node.args[1]];
263
- // Pass to pow operator node parser
264
- return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), constNodes);
259
+ if (node.args.length === 2) {
260
+ constNodes[arg1] = constNodes[node.args[1]];
261
+ // Pass to pow operator node parser
262
+ return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), constNodes);
263
+ }
264
+ break;
265
265
  case 'exp':
266
266
  // d/dx(e^x) = e^x
267
267
  funcDerivative = new FunctionNode('exp', [arg0.clone()]);
@@ -391,7 +391,7 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
391
391
  break;
392
392
  case 'gamma': // Needs digamma function, d/dx(gamma(x)) = gamma(x)digamma(x)
393
393
  default:
394
- throw new Error('Function "' + node.name + '" is not supported by derivative, or a wrong number of arguments is passed');
394
+ throw new Error('Cannot process function "' + node.name + '" in derivative: ' + 'the function is not supported, undefined, or the number of arguments passed to it are not supported');
395
395
  }
396
396
  var op, func;
397
397
  if (div) {
@@ -502,33 +502,10 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
502
502
  // Functional Power Rule, d/dx(f^g) = f^g*[f'*(g/f) + g'ln(f)]
503
503
  return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [_arg.clone(), _arg2.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(_arg, constNodes), new OperatorNode('/', 'divide', [_arg2.clone(), _arg.clone()])]), new OperatorNode('*', 'multiply', [_derivative(_arg2, constNodes), new FunctionNode('log', [_arg.clone()])])])]);
504
504
  }
505
- throw new Error('Operator "' + node.op + '" is not supported by derivative, or a wrong number of arguments is passed');
505
+ throw new Error('Cannot process operator "' + node.op + '" in derivative: ' + 'the operator is not supported, undefined, or the number of arguments passed to it are not supported');
506
506
  }
507
507
  });
508
508
 
509
- /**
510
- * Ensures the number of arguments for a function are correct,
511
- * and will throw an error otherwise.
512
- *
513
- * @param {FunctionNode} node
514
- */
515
- function funcArgsCheck(node) {
516
- // TODO add min, max etc
517
- if ((node.name === 'log' || node.name === 'nthRoot' || node.name === 'pow') && node.args.length === 2) {
518
- return;
519
- }
520
-
521
- // There should be an incorrect number of arguments if we reach here
522
-
523
- // Change all args to constants to avoid unidentified
524
- // symbol error when compiling function
525
- for (var i = 0; i < node.args.length; ++i) {
526
- node.args[i] = createConstantNode(0);
527
- }
528
- node.compile().evaluate();
529
- throw new Error('Function "' + node.name + '" is not supported by derivative, or a wrong number of arguments is passed');
530
- }
531
-
532
509
  /**
533
510
  * Helper function to create a constant node with a specific type
534
511
  * (number, BigNumber, Fraction)
@@ -91,17 +91,10 @@ export var createMod = /* #__PURE__ */factory(name, dependencies, _ref => {
91
91
  return typed(name, {
92
92
  'number, number': _modNumber,
93
93
  'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {
94
- if (y.isNeg()) {
95
- throw new Error('Cannot calculate mod for a negative divisor');
96
- }
97
- return y.isZero() ? x : x.mod(y);
94
+ return y.isZero() ? x : x.sub(y.mul(floor(x.div(y))));
98
95
  },
99
96
  'Fraction, Fraction': function FractionFraction(x, y) {
100
- if (y.compare(0) < 0) {
101
- throw new Error('Cannot calculate mod for a negative divisor');
102
- }
103
- // Workaround suggested in Fraction.js library to calculate correct modulo for negative dividend
104
- return x.compare(0) >= 0 ? x.mod(y) : x.mod(y).add(y).mod(y);
97
+ return y.equals(0) ? x : x.sub(y.mul(floor(x.div(y))));
105
98
  }
106
99
  }, matrixAlgorithmSuite({
107
100
  SS: matAlgo05xSfSf,
@@ -36,6 +36,8 @@ export var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {
36
36
  *
37
37
  * math.round(x)
38
38
  * math.round(x, n)
39
+ * math.round(unit, valuelessUnit)
40
+ * math.round(unit, n, valuelessUnit)
39
41
  *
40
42
  * Examples:
41
43
  *
@@ -53,14 +55,21 @@ export var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {
53
55
  * const c = math.complex(3.2, -2.7)
54
56
  * math.round(c) // returns Complex 3 - 3i
55
57
  *
58
+ * const unit = math.unit('3.241 cm')
59
+ * const cm = math.unit('cm')
60
+ * const mm = math.unit('mm')
61
+ * math.round(unit, 1, cm) // returns Unit 3.2 cm
62
+ * math.round(unit, 1, mm) // returns Unit 32.4 mm
63
+ *
56
64
  * math.round([3.2, 3.8, -4.7]) // returns Array [3, 4, -5]
57
65
  *
58
66
  * See also:
59
67
  *
60
68
  * ceil, fix, floor
61
69
  *
62
- * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
70
+ * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
63
71
  * @param {number | BigNumber | Array} [n=0] Number of decimals
72
+ * @param {Unit} [valuelessUnit] A valueless unit
64
73
  * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
65
74
  */
66
75
  return typed(name, {
@@ -112,37 +121,51 @@ export var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {
112
121
  }
113
122
  return x.round(n.toNumber());
114
123
  },
115
- // deep map collection, skip zeros since round(0) = 0
116
- 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),
117
- 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
118
- return matAlgo11xS0s(x, y, self, false);
124
+ 'Unit, number, Unit': typed.referToSelf(self => function (x, n, unit) {
125
+ var valueless = x.toNumeric(unit);
126
+ return unit.multiply(self(valueless, n));
127
+ }),
128
+ 'Unit, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
129
+ 'Unit, Unit': typed.referToSelf(self => (x, unit) => self(x, 0, unit)),
130
+ 'Array | Matrix, number, Unit': typed.referToSelf(self => (x, n, unit) => {
131
+ // deep map collection, skip zeros since round(0) = 0
132
+ return deepMap(x, value => self(value, n, unit), true);
133
+ }),
134
+ 'Array | Matrix, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
135
+ 'Array | Matrix, Unit': typed.referToSelf(self => (x, unit) => self(x, 0, unit)),
136
+ 'Array | Matrix': typed.referToSelf(self => x => {
137
+ // deep map collection, skip zeros since round(0) = 0
138
+ return deepMap(x, self, true);
139
+ }),
140
+ 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, n) => {
141
+ return matAlgo11xS0s(x, n, self, false);
119
142
  }),
120
- 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
121
- return matAlgo14xDs(x, y, self, false);
143
+ 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, n) => {
144
+ return matAlgo14xDs(x, n, self, false);
122
145
  }),
123
- 'Array, number | BigNumber': typed.referToSelf(self => (x, y) => {
146
+ 'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {
124
147
  // use matrix implementation
125
- return matAlgo14xDs(matrix(x), y, self, false).valueOf();
148
+ return matAlgo14xDs(matrix(x), n, self, false).valueOf();
126
149
  }),
127
- 'number | Complex | BigNumber | Fraction, SparseMatrix': typed.referToSelf(self => (x, y) => {
150
+ 'number | Complex | BigNumber | Fraction, SparseMatrix': typed.referToSelf(self => (x, n) => {
128
151
  // check scalar is zero
129
152
  if (equalScalar(x, 0)) {
130
153
  // do not execute algorithm, result will be a zero matrix
131
- return zeros(y.size(), y.storage());
154
+ return zeros(n.size(), n.storage());
132
155
  }
133
- return matAlgo12xSfs(y, x, self, true);
156
+ return matAlgo12xSfs(n, x, self, true);
134
157
  }),
135
- 'number | Complex | BigNumber | Fraction, DenseMatrix': typed.referToSelf(self => (x, y) => {
158
+ 'number | Complex | BigNumber | Fraction, DenseMatrix': typed.referToSelf(self => (x, n) => {
136
159
  // check scalar is zero
137
160
  if (equalScalar(x, 0)) {
138
161
  // do not execute algorithm, result will be a zero matrix
139
- return zeros(y.size(), y.storage());
162
+ return zeros(n.size(), n.storage());
140
163
  }
141
- return matAlgo14xDs(y, x, self, true);
164
+ return matAlgo14xDs(n, x, self, true);
142
165
  }),
143
- 'number | Complex | BigNumber | Fraction, Array': typed.referToSelf(self => (x, y) => {
166
+ 'number | Complex | BigNumber | Fraction, Array': typed.referToSelf(self => (x, n) => {
144
167
  // use matrix implementation
145
- return matAlgo14xDs(matrix(y), x, self, true).valueOf();
168
+ return matAlgo14xDs(matrix(n), x, self, true).valueOf();
146
169
  })
147
170
  });
148
171
  });