mathjs 13.2.3 → 14.0.1
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +24 -0
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +2 -10
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/function/import.js +4 -1
- package/lib/cjs/core/function/typed.js +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesBitXor.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesDotDivide.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesDotPow.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesEqual.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesLargerEq.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesLog.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSmallerEq.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesUnequal.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesXor.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +2 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +1 -0
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +1 -0
- package/lib/cjs/entry/pureFunctionsAny.generated.js +11 -0
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/ceil.js +2 -2
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/fix.js +2 -2
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/floor.js +2 -2
- package/lib/cjs/expression/parse.js +26 -36
- package/lib/cjs/function/algebra/derivative.js +64 -77
- package/lib/cjs/function/algebra/simplify.js +4 -3
- package/lib/cjs/function/algebra/simplifyConstant.js +5 -11
- package/lib/cjs/function/arithmetic/ceil.js +21 -2
- package/lib/cjs/function/arithmetic/dotDivide.js +4 -3
- package/lib/cjs/function/arithmetic/dotPow.js +4 -3
- package/lib/cjs/function/arithmetic/fix.js +24 -5
- package/lib/cjs/function/arithmetic/floor.js +21 -2
- package/lib/cjs/function/arithmetic/log.js +12 -4
- package/lib/cjs/function/arithmetic/pow.js +2 -2
- package/lib/cjs/function/arithmetic/round.js +3 -5
- package/lib/cjs/function/arithmetic/sign.js +1 -1
- package/lib/cjs/function/bitwise/bitXor.js +4 -3
- package/lib/cjs/function/logical/xor.js +4 -3
- package/lib/cjs/function/relational/equal.js +4 -3
- package/lib/cjs/function/relational/larger.js +4 -3
- package/lib/cjs/function/relational/largerEq.js +4 -3
- package/lib/cjs/function/relational/smaller.js +4 -3
- package/lib/cjs/function/relational/smallerEq.js +4 -3
- package/lib/cjs/function/relational/unequal.js +4 -3
- package/lib/cjs/function/utils/isInteger.js +1 -1
- package/lib/cjs/function/utils/isNegative.js +1 -1
- package/lib/cjs/function/utils/isPositive.js +1 -1
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/type/bignumber/function/bignumber.js +2 -2
- package/lib/cjs/type/fraction/Fraction.js +4 -4
- package/lib/cjs/type/fraction/function/fraction.js +3 -0
- package/lib/cjs/type/matrix/utils/matAlgo07xSSf.js +39 -43
- package/lib/cjs/type/unit/Unit.js +1 -1
- package/lib/cjs/utils/string.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/function/import.js +4 -1
- package/lib/esm/core/function/typed.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesBitXor.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesDotDivide.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesDotPow.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesEqual.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesLargerEq.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesLog.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSmallerEq.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesUnequal.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesXor.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +2 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsNumber.generated.js +1 -0
- package/lib/esm/entry/pureFunctionsAny.generated.js +11 -0
- package/lib/esm/expression/embeddedDocs/function/arithmetic/ceil.js +2 -2
- package/lib/esm/expression/embeddedDocs/function/arithmetic/fix.js +2 -2
- package/lib/esm/expression/embeddedDocs/function/arithmetic/floor.js +2 -2
- package/lib/esm/expression/parse.js +26 -36
- package/lib/esm/function/algebra/derivative.js +64 -77
- package/lib/esm/function/algebra/simplify.js +4 -3
- package/lib/esm/function/algebra/simplifyConstant.js +5 -11
- package/lib/esm/function/arithmetic/ceil.js +21 -2
- package/lib/esm/function/arithmetic/dotDivide.js +4 -3
- package/lib/esm/function/arithmetic/dotPow.js +4 -3
- package/lib/esm/function/arithmetic/fix.js +24 -5
- package/lib/esm/function/arithmetic/floor.js +21 -2
- package/lib/esm/function/arithmetic/log.js +12 -4
- package/lib/esm/function/arithmetic/pow.js +2 -2
- package/lib/esm/function/arithmetic/round.js +3 -5
- package/lib/esm/function/arithmetic/sign.js +1 -1
- package/lib/esm/function/bitwise/bitXor.js +4 -3
- package/lib/esm/function/logical/xor.js +4 -3
- package/lib/esm/function/relational/equal.js +4 -3
- package/lib/esm/function/relational/larger.js +4 -3
- package/lib/esm/function/relational/largerEq.js +4 -3
- package/lib/esm/function/relational/smaller.js +4 -3
- package/lib/esm/function/relational/smallerEq.js +4 -3
- package/lib/esm/function/relational/unequal.js +4 -3
- package/lib/esm/function/utils/isInteger.js +1 -1
- package/lib/esm/function/utils/isNegative.js +1 -1
- package/lib/esm/function/utils/isPositive.js +1 -1
- package/lib/esm/type/bignumber/function/bignumber.js +2 -2
- package/lib/esm/type/fraction/Fraction.js +4 -4
- package/lib/esm/type/fraction/function/fraction.js +3 -0
- package/lib/esm/type/matrix/utils/matAlgo07xSSf.js +39 -43
- package/lib/esm/type/unit/Unit.js +1 -1
- package/lib/esm/utils/string.js +2 -2
- package/lib/esm/version.js +1 -1
- package/package.json +13 -13
- package/types/index.d.ts +112 -23
@@ -60,9 +60,18 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
60
60
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
61
61
|
simplify: true
|
62
62
|
};
|
63
|
-
var
|
64
|
-
|
65
|
-
|
63
|
+
var cache = new Map();
|
64
|
+
var variableName = variable.name;
|
65
|
+
function isConstCached(node) {
|
66
|
+
var cached = cache.get(node);
|
67
|
+
if (cached !== undefined) {
|
68
|
+
return cached;
|
69
|
+
}
|
70
|
+
var res = _isConst(isConstCached, node, variableName);
|
71
|
+
cache.set(node, res);
|
72
|
+
return res;
|
73
|
+
}
|
74
|
+
var res = _derivative(expr, isConstCached);
|
66
75
|
return options.simplify ? simplify(res) : res;
|
67
76
|
}
|
68
77
|
function parseIdentifier(string) {
|
@@ -82,9 +91,8 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
82
91
|
'Node, SymbolNode, ConstantNode': function (expr, variable, {order}) {
|
83
92
|
let res = expr
|
84
93
|
for (let i = 0; i < order; i++) {
|
85
|
-
|
86
|
-
|
87
|
-
res = _derivative(res, constNodes)
|
94
|
+
<create caching isConst>
|
95
|
+
res = _derivative(res, isConst)
|
88
96
|
}
|
89
97
|
return res
|
90
98
|
}
|
@@ -127,56 +135,39 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
127
135
|
});
|
128
136
|
|
129
137
|
/**
|
130
|
-
*
|
131
|
-
*
|
132
|
-
*
|
138
|
+
* Checks if a node is constants (e.g. 2 + 2).
|
139
|
+
* Accepts (usually memoized) version of self as the first parameter for recursive calls.
|
140
|
+
* Classification is done as follows:
|
133
141
|
*
|
134
142
|
* 1. ConstantNodes are constants.
|
135
143
|
* 2. If there exists a SymbolNode, of which we are differentiating over,
|
136
144
|
* in the subtree it is not constant.
|
137
145
|
*
|
138
|
-
* @param {
|
146
|
+
* @param {function} isConst Function that tells whether sub-expression is a constant
|
139
147
|
* @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node
|
140
148
|
* @param {string} varName Variable that we are differentiating
|
141
149
|
* @return {boolean} if node is constant
|
142
150
|
*/
|
143
|
-
|
144
|
-
|
145
|
-
'Object, ConstantNode, string': function Object_ConstantNode_string(constNodes, node) {
|
146
|
-
constNodes[node] = true;
|
151
|
+
var _isConst = typed('_isConst', {
|
152
|
+
'function, ConstantNode, string': function function_ConstantNode_string() {
|
147
153
|
return true;
|
148
154
|
},
|
149
|
-
'
|
155
|
+
'function, SymbolNode, string': function function_SymbolNode_string(isConst, node, varName) {
|
150
156
|
// Treat other variables like constants. For reasoning, see:
|
151
157
|
// https://en.wikipedia.org/wiki/Partial_derivative
|
152
|
-
|
153
|
-
constNodes[node] = true;
|
154
|
-
return true;
|
155
|
-
}
|
156
|
-
return false;
|
158
|
+
return node.name !== varName;
|
157
159
|
},
|
158
|
-
'
|
159
|
-
return
|
160
|
+
'function, ParenthesisNode, string': function function_ParenthesisNode_string(isConst, node, varName) {
|
161
|
+
return isConst(node.content, varName);
|
160
162
|
},
|
161
|
-
'
|
163
|
+
'function, FunctionAssignmentNode, string': function function_FunctionAssignmentNode_string(isConst, node, varName) {
|
162
164
|
if (!node.params.includes(varName)) {
|
163
|
-
constNodes[node] = true;
|
164
165
|
return true;
|
165
166
|
}
|
166
|
-
return
|
167
|
+
return isConst(node.expr, varName);
|
167
168
|
},
|
168
|
-
'
|
169
|
-
|
170
|
-
var isConst = constTag(constNodes, node.args[0], varName);
|
171
|
-
for (var i = 1; i < node.args.length; ++i) {
|
172
|
-
isConst = constTag(constNodes, node.args[i], varName) && isConst;
|
173
|
-
}
|
174
|
-
if (isConst) {
|
175
|
-
constNodes[node] = true;
|
176
|
-
return true;
|
177
|
-
}
|
178
|
-
}
|
179
|
-
return false;
|
169
|
+
'function, FunctionNode | OperatorNode, string': function function_FunctionNode__OperatorNode_string(isConst, node, varName) {
|
170
|
+
return node.args.every(arg => isConst(arg, varName));
|
180
171
|
}
|
181
172
|
});
|
182
173
|
|
@@ -184,30 +175,30 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
184
175
|
* Applies differentiation rules.
|
185
176
|
*
|
186
177
|
* @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node
|
187
|
-
* @param {
|
178
|
+
* @param {function} isConst Function that tells if a node is constant
|
188
179
|
* @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr`
|
189
180
|
*/
|
190
181
|
var _derivative = typed('_derivative', {
|
191
|
-
'ConstantNode,
|
182
|
+
'ConstantNode, function': function ConstantNode_function() {
|
192
183
|
return createConstantNode(0);
|
193
184
|
},
|
194
|
-
'SymbolNode,
|
195
|
-
if (
|
185
|
+
'SymbolNode, function': function SymbolNode_function(node, isConst) {
|
186
|
+
if (isConst(node)) {
|
196
187
|
return createConstantNode(0);
|
197
188
|
}
|
198
189
|
return createConstantNode(1);
|
199
190
|
},
|
200
|
-
'ParenthesisNode,
|
201
|
-
return new ParenthesisNode(_derivative(node.content,
|
191
|
+
'ParenthesisNode, function': function ParenthesisNode_function(node, isConst) {
|
192
|
+
return new ParenthesisNode(_derivative(node.content, isConst));
|
202
193
|
},
|
203
|
-
'FunctionAssignmentNode,
|
204
|
-
if (
|
194
|
+
'FunctionAssignmentNode, function': function FunctionAssignmentNode_function(node, isConst) {
|
195
|
+
if (isConst(node)) {
|
205
196
|
return createConstantNode(0);
|
206
197
|
}
|
207
|
-
return _derivative(node.expr,
|
198
|
+
return _derivative(node.expr, isConst);
|
208
199
|
},
|
209
|
-
'FunctionNode,
|
210
|
-
if (
|
200
|
+
'FunctionNode, function': function FunctionNode_function(node, isConst) {
|
201
|
+
if (isConst(node)) {
|
211
202
|
return createConstantNode(0);
|
212
203
|
}
|
213
204
|
var arg0 = node.args[0];
|
@@ -231,10 +222,7 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
231
222
|
} else if (node.args.length === 2) {
|
232
223
|
// Rearrange from nthRoot(x, a) -> x^(1/a)
|
233
224
|
arg1 = new OperatorNode('/', 'divide', [createConstantNode(1), node.args[1]]);
|
234
|
-
|
235
|
-
// Is a variable?
|
236
|
-
constNodes[arg1] = constNodes[node.args[1]];
|
237
|
-
return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), constNodes);
|
225
|
+
return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), isConst);
|
238
226
|
}
|
239
227
|
break;
|
240
228
|
case 'log10':
|
@@ -245,20 +233,19 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
245
233
|
// d/dx(log(x)) = 1 / x
|
246
234
|
funcDerivative = arg0.clone();
|
247
235
|
div = true;
|
248
|
-
} else if (node.args.length === 1 && arg1 || node.args.length === 2 &&
|
236
|
+
} else if (node.args.length === 1 && arg1 || node.args.length === 2 && isConst(node.args[1])) {
|
249
237
|
// d/dx(log(x, c)) = 1 / (x*ln(c))
|
250
238
|
funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('log', [arg1 || node.args[1]])]);
|
251
239
|
div = true;
|
252
240
|
} else if (node.args.length === 2) {
|
253
241
|
// d/dx(log(f(x), g(x))) = d/dx(log(f(x)) / log(g(x)))
|
254
|
-
return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]),
|
242
|
+
return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]), isConst);
|
255
243
|
}
|
256
244
|
break;
|
257
245
|
case 'pow':
|
258
246
|
if (node.args.length === 2) {
|
259
|
-
constNodes[arg1] = constNodes[node.args[1]];
|
260
247
|
// Pass to pow operator node parser
|
261
|
-
return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]),
|
248
|
+
return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), isConst);
|
262
249
|
}
|
263
250
|
break;
|
264
251
|
case 'exp':
|
@@ -404,51 +391,51 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
404
391
|
/* Apply chain rule to all functions:
|
405
392
|
F(x) = f(g(x))
|
406
393
|
F'(x) = g'(x)*f'(g(x)) */
|
407
|
-
var chainDerivative = _derivative(arg0,
|
394
|
+
var chainDerivative = _derivative(arg0, isConst);
|
408
395
|
if (negative) {
|
409
396
|
chainDerivative = new OperatorNode('-', 'unaryMinus', [chainDerivative]);
|
410
397
|
}
|
411
398
|
return new OperatorNode(op, func, [chainDerivative, funcDerivative]);
|
412
399
|
},
|
413
|
-
'OperatorNode,
|
414
|
-
if (
|
400
|
+
'OperatorNode, function': function OperatorNode_function(node, isConst) {
|
401
|
+
if (isConst(node)) {
|
415
402
|
return createConstantNode(0);
|
416
403
|
}
|
417
404
|
if (node.op === '+') {
|
418
405
|
// d/dx(sum(f(x)) = sum(f'(x))
|
419
406
|
return new OperatorNode(node.op, node.fn, node.args.map(function (arg) {
|
420
|
-
return _derivative(arg,
|
407
|
+
return _derivative(arg, isConst);
|
421
408
|
}));
|
422
409
|
}
|
423
410
|
if (node.op === '-') {
|
424
411
|
// d/dx(+/-f(x)) = +/-f'(x)
|
425
412
|
if (node.isUnary()) {
|
426
|
-
return new OperatorNode(node.op, node.fn, [_derivative(node.args[0],
|
413
|
+
return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], isConst)]);
|
427
414
|
}
|
428
415
|
|
429
416
|
// Linearity of differentiation, d/dx(f(x) +/- g(x)) = f'(x) +/- g'(x)
|
430
417
|
if (node.isBinary()) {
|
431
|
-
return new OperatorNode(node.op, node.fn, [_derivative(node.args[0],
|
418
|
+
return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], isConst), _derivative(node.args[1], isConst)]);
|
432
419
|
}
|
433
420
|
}
|
434
421
|
if (node.op === '*') {
|
435
422
|
// d/dx(c*f(x)) = c*f'(x)
|
436
423
|
var constantTerms = node.args.filter(function (arg) {
|
437
|
-
return
|
424
|
+
return isConst(arg);
|
438
425
|
});
|
439
426
|
if (constantTerms.length > 0) {
|
440
427
|
var nonConstantTerms = node.args.filter(function (arg) {
|
441
|
-
return
|
428
|
+
return !isConst(arg);
|
442
429
|
});
|
443
430
|
var nonConstantNode = nonConstantTerms.length === 1 ? nonConstantTerms[0] : new OperatorNode('*', 'multiply', nonConstantTerms);
|
444
|
-
var newArgs = constantTerms.concat(_derivative(nonConstantNode,
|
431
|
+
var newArgs = constantTerms.concat(_derivative(nonConstantNode, isConst));
|
445
432
|
return new OperatorNode('*', 'multiply', newArgs);
|
446
433
|
}
|
447
434
|
|
448
435
|
// Product Rule, d/dx(f(x)*g(x)) = f'(x)*g(x) + f(x)*g'(x)
|
449
436
|
return new OperatorNode('+', 'add', node.args.map(function (argOuter) {
|
450
437
|
return new OperatorNode('*', 'multiply', node.args.map(function (argInner) {
|
451
|
-
return argInner === argOuter ? _derivative(argInner,
|
438
|
+
return argInner === argOuter ? _derivative(argInner, isConst) : argInner.clone();
|
452
439
|
}));
|
453
440
|
}));
|
454
441
|
}
|
@@ -457,31 +444,31 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
457
444
|
var arg1 = node.args[1];
|
458
445
|
|
459
446
|
// d/dx(f(x) / c) = f'(x) / c
|
460
|
-
if (
|
461
|
-
return new OperatorNode('/', 'divide', [_derivative(arg0,
|
447
|
+
if (isConst(arg1)) {
|
448
|
+
return new OperatorNode('/', 'divide', [_derivative(arg0, isConst), arg1]);
|
462
449
|
}
|
463
450
|
|
464
451
|
// Reciprocal Rule, d/dx(c / f(x)) = -c(f'(x)/f(x)^2)
|
465
|
-
if (
|
466
|
-
return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1,
|
452
|
+
if (isConst(arg0)) {
|
453
|
+
return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1, isConst), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])])]);
|
467
454
|
}
|
468
455
|
|
469
456
|
// Quotient rule, d/dx(f(x) / g(x)) = (f'(x)g(x) - f(x)g'(x)) / g(x)^2
|
470
|
-
return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0,
|
457
|
+
return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0, isConst), arg1.clone()]), new OperatorNode('*', 'multiply', [arg0.clone(), _derivative(arg1, isConst)])]), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])]);
|
471
458
|
}
|
472
459
|
if (node.op === '^' && node.isBinary()) {
|
473
460
|
var _arg = node.args[0];
|
474
461
|
var _arg2 = node.args[1];
|
475
|
-
if (
|
462
|
+
if (isConst(_arg)) {
|
476
463
|
// If is secretly constant; 0^f(x) = 1 (in JS), 1^f(x) = 1
|
477
464
|
if (isConstantNode(_arg) && (isZero(_arg.value) || equal(_arg.value, 1))) {
|
478
465
|
return createConstantNode(0);
|
479
466
|
}
|
480
467
|
|
481
468
|
// d/dx(c^f(x)) = c^f(x)*ln(c)*f'(x)
|
482
|
-
return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [_arg.clone()]), _derivative(_arg2.clone(),
|
469
|
+
return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [_arg.clone()]), _derivative(_arg2.clone(), isConst)])]);
|
483
470
|
}
|
484
|
-
if (
|
471
|
+
if (isConst(_arg2)) {
|
485
472
|
if (isConstantNode(_arg2)) {
|
486
473
|
// If is secretly constant; f(x)^0 = 1 -> d/dx(1) = 0
|
487
474
|
if (isZero(_arg2.value)) {
|
@@ -489,17 +476,17 @@ export var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
489
476
|
}
|
490
477
|
// Ignore exponent; f(x)^1 = f(x)
|
491
478
|
if (equal(_arg2.value, 1)) {
|
492
|
-
return _derivative(_arg,
|
479
|
+
return _derivative(_arg, isConst);
|
493
480
|
}
|
494
481
|
}
|
495
482
|
|
496
483
|
// Elementary Power Rule, d/dx(f(x)^c) = c*f'(x)*f(x)^(c-1)
|
497
484
|
var powMinusOne = new OperatorNode('^', 'pow', [_arg.clone(), new OperatorNode('-', 'subtract', [_arg2, createConstantNode(1)])]);
|
498
|
-
return new OperatorNode('*', 'multiply', [_arg2.clone(), new OperatorNode('*', 'multiply', [_derivative(_arg,
|
485
|
+
return new OperatorNode('*', 'multiply', [_arg2.clone(), new OperatorNode('*', 'multiply', [_derivative(_arg, isConst), powMinusOne])]);
|
499
486
|
}
|
500
487
|
|
501
488
|
// Functional Power Rule, d/dx(f^g) = f^g*[f'*(g/f) + g'ln(f)]
|
502
|
-
return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [_arg.clone(), _arg2.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(_arg,
|
489
|
+
return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [_arg.clone(), _arg2.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(_arg, isConst), new OperatorNode('/', 'divide', [_arg2.clone(), _arg.clone()])]), new OperatorNode('*', 'multiply', [_derivative(_arg2, isConst), new FunctionNode('log', [_arg.clone()])])])]);
|
503
490
|
}
|
504
491
|
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');
|
505
492
|
}
|
@@ -5,7 +5,7 @@ import { createUtil } from './simplify/util.js';
|
|
5
5
|
import { hasOwnProperty } from '../../utils/object.js';
|
6
6
|
import { createEmptyMap, createMap } from '../../utils/map.js';
|
7
7
|
var name = 'simplify';
|
8
|
-
var dependencies = ['typed', 'parse', 'equal', 'resolve', 'simplifyConstant', 'simplifyCore', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];
|
8
|
+
var dependencies = ['typed', 'parse', 'equal', 'resolve', 'simplifyConstant', 'simplifyCore', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode', 'replacer'];
|
9
9
|
export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
10
10
|
var {
|
11
11
|
typed,
|
@@ -22,7 +22,8 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
22
22
|
ObjectNode,
|
23
23
|
OperatorNode,
|
24
24
|
ParenthesisNode,
|
25
|
-
SymbolNode
|
25
|
+
SymbolNode,
|
26
|
+
replacer
|
26
27
|
} = _ref;
|
27
28
|
var {
|
28
29
|
hasProperty,
|
@@ -998,7 +999,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
998
999
|
var uniqueSets = [];
|
999
1000
|
var unique = {};
|
1000
1001
|
for (var i = 0; i < sets.length; i++) {
|
1001
|
-
var s = JSON.stringify(sets[i]);
|
1002
|
+
var s = JSON.stringify(sets[i], replacer);
|
1002
1003
|
if (!unique[s]) {
|
1003
1004
|
unique[s] = true;
|
1004
1005
|
uniqueSets.push(sets[i]);
|
@@ -194,17 +194,11 @@ export var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _
|
|
194
194
|
return new OperatorNode('-', 'unaryMinus', [n]);
|
195
195
|
}
|
196
196
|
function _fractionToNode(f) {
|
197
|
-
|
198
|
-
var
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
n = new ConstantNode(vn);
|
203
|
-
}
|
204
|
-
if (f.d === 1) {
|
205
|
-
return n;
|
206
|
-
}
|
207
|
-
return new OperatorNode('/', 'divide', [n, new ConstantNode(f.d)]);
|
197
|
+
// note: we convert await from bigint values, because bigint values gives issues with divisions: 1n/2n=0n and not 0.5
|
198
|
+
var fromBigInt = value => config.number === 'BigNumber' && bignumber ? bignumber(value) : Number(value);
|
199
|
+
var numeratorValue = f.s * f.n;
|
200
|
+
var numeratorNode = numeratorValue < 0n ? new OperatorNode('-', 'unaryMinus', [new ConstantNode(-fromBigInt(numeratorValue))]) : new ConstantNode(fromBigInt(numeratorValue));
|
201
|
+
return f.d === 1n ? numeratorNode : new OperatorNode('/', 'divide', [numeratorNode, new ConstantNode(fromBigInt(f.d))]);
|
208
202
|
}
|
209
203
|
|
210
204
|
/* Handles constant indexing of ArrayNodes, matrices, and ObjectNodes */
|
@@ -69,6 +69,8 @@ export var createCeil = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
69
69
|
*
|
70
70
|
* math.ceil(x)
|
71
71
|
* math.ceil(x, n)
|
72
|
+
* math.ceil(unit, valuelessUnit)
|
73
|
+
* math.ceil(unit, n, valuelessUnit)
|
72
74
|
*
|
73
75
|
* Examples:
|
74
76
|
*
|
@@ -86,6 +88,12 @@ export var createCeil = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
86
88
|
* math.ceil(c) // returns Complex 4 - 2i
|
87
89
|
* math.ceil(c, 1) // returns Complex 3.3 - 2.7i
|
88
90
|
*
|
91
|
+
* const unit = math.unit('3.241 cm')
|
92
|
+
* const cm = math.unit('cm')
|
93
|
+
* const mm = math.unit('mm')
|
94
|
+
* math.ceil(unit, 1, cm) // returns Unit 3.3 cm
|
95
|
+
* math.ceil(unit, 1, mm) // returns Unit 32.5 mm
|
96
|
+
*
|
89
97
|
* math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
|
90
98
|
* math.ceil([3.21, 3.82, -4.71], 1) // returns Array [3.3, 3.9, -4.7]
|
91
99
|
*
|
@@ -93,9 +101,10 @@ export var createCeil = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
93
101
|
*
|
94
102
|
* floor, fix, round
|
95
103
|
*
|
96
|
-
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x
|
104
|
+
* @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
|
97
105
|
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
98
|
-
* @
|
106
|
+
* @param {Unit} [valuelessUnit] A valueless unit
|
107
|
+
* @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Rounded value
|
99
108
|
*/
|
100
109
|
return typed('ceil', {
|
101
110
|
number: ceilNumber.signatures.number,
|
@@ -132,6 +141,16 @@ export var createCeil = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
132
141
|
'Fraction, BigNumber': function Fraction_BigNumber(x, n) {
|
133
142
|
return x.ceil(n.toNumber());
|
134
143
|
},
|
144
|
+
'Unit, number, Unit': typed.referToSelf(self => function (x, n, unit) {
|
145
|
+
var valueless = x.toNumeric(unit);
|
146
|
+
return unit.multiply(self(valueless, n));
|
147
|
+
}),
|
148
|
+
'Unit, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
|
149
|
+
'Array | Matrix, number | BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => {
|
150
|
+
// deep map collection, skip zeros since ceil(0) = 0
|
151
|
+
return deepMap(x, value => self(value, n, unit), true);
|
152
|
+
}),
|
153
|
+
'Array | Matrix | Unit, Unit': typed.referToSelf(self => (x, unit) => self(x, 0, unit)),
|
135
154
|
'Array | Matrix': typed.referToSelf(self => x => {
|
136
155
|
// deep map collection, skip zeros since ceil(0) = 0
|
137
156
|
return deepMap(x, self, true);
|
@@ -6,7 +6,7 @@ import { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';
|
|
6
6
|
import { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';
|
7
7
|
import { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';
|
8
8
|
var name = 'dotDivide';
|
9
|
-
var dependencies = ['typed', 'matrix', 'equalScalar', 'divideScalar', 'DenseMatrix', 'concat'];
|
9
|
+
var dependencies = ['typed', 'matrix', 'equalScalar', 'divideScalar', 'DenseMatrix', 'concat', 'SparseMatrix'];
|
10
10
|
export var createDotDivide = /* #__PURE__ */factory(name, dependencies, _ref => {
|
11
11
|
var {
|
12
12
|
typed,
|
@@ -14,7 +14,8 @@ export var createDotDivide = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
14
14
|
equalScalar,
|
15
15
|
divideScalar,
|
16
16
|
DenseMatrix,
|
17
|
-
concat
|
17
|
+
concat,
|
18
|
+
SparseMatrix
|
18
19
|
} = _ref;
|
19
20
|
var matAlgo02xDS0 = createMatAlgo02xDS0({
|
20
21
|
typed,
|
@@ -25,7 +26,7 @@ export var createDotDivide = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
25
26
|
});
|
26
27
|
var matAlgo07xSSf = createMatAlgo07xSSf({
|
27
28
|
typed,
|
28
|
-
|
29
|
+
SparseMatrix
|
29
30
|
});
|
30
31
|
var matAlgo11xS0s = createMatAlgo11xS0s({
|
31
32
|
typed,
|
@@ -5,7 +5,7 @@ import { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';
|
|
5
5
|
import { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';
|
6
6
|
import { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';
|
7
7
|
var name = 'dotPow';
|
8
|
-
var dependencies = ['typed', 'equalScalar', 'matrix', 'pow', 'DenseMatrix', 'concat'];
|
8
|
+
var dependencies = ['typed', 'equalScalar', 'matrix', 'pow', 'DenseMatrix', 'concat', 'SparseMatrix'];
|
9
9
|
export var createDotPow = /* #__PURE__ */factory(name, dependencies, _ref => {
|
10
10
|
var {
|
11
11
|
typed,
|
@@ -13,14 +13,15 @@ export var createDotPow = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
13
13
|
matrix,
|
14
14
|
pow,
|
15
15
|
DenseMatrix,
|
16
|
-
concat
|
16
|
+
concat,
|
17
|
+
SparseMatrix
|
17
18
|
} = _ref;
|
18
19
|
var matAlgo03xDSf = createMatAlgo03xDSf({
|
19
20
|
typed
|
20
21
|
});
|
21
22
|
var matAlgo07xSSf = createMatAlgo07xSSf({
|
22
23
|
typed,
|
23
|
-
|
24
|
+
SparseMatrix
|
24
25
|
});
|
25
26
|
var matAlgo11xS0s = createMatAlgo11xS0s({
|
26
27
|
typed,
|
@@ -50,6 +50,8 @@ export var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
50
50
|
*
|
51
51
|
* math.fix(x)
|
52
52
|
* math.fix(x,n)
|
53
|
+
* math.fix(unit, valuelessUnit)
|
54
|
+
* math.fix(unit, n, valuelessUnit)
|
53
55
|
*
|
54
56
|
* Examples:
|
55
57
|
*
|
@@ -67,6 +69,12 @@ export var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
67
69
|
* math.fix(c) // returns Complex 3 - 2i
|
68
70
|
* math.fix(c, 1) // returns Complex 3.2 -2.7i
|
69
71
|
*
|
72
|
+
* const unit = math.unit('3.241 cm')
|
73
|
+
* const cm = math.unit('cm')
|
74
|
+
* const mm = math.unit('mm')
|
75
|
+
* math.fix(unit, 1, cm) // returns Unit 3.2 cm
|
76
|
+
* math.fix(unit, 1, mm) // returns Unit 32.4 mm
|
77
|
+
*
|
70
78
|
* math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]
|
71
79
|
* math.fix([3.2, 3.8, -4.7], 1) // returns Array [3.2, 3.8, -4.7]
|
72
80
|
*
|
@@ -74,9 +82,10 @@ export var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
74
82
|
*
|
75
83
|
* ceil, floor, round
|
76
84
|
*
|
77
|
-
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x
|
78
|
-
* @param {number | BigNumber | Array} [n=0]
|
79
|
-
* @
|
85
|
+
* @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
|
86
|
+
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
87
|
+
* @param {Unit} [valuelessUnit] A valueless unit
|
88
|
+
* @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Rounded value
|
80
89
|
*/
|
81
90
|
return typed('fix', {
|
82
91
|
number: fixNumber.signatures.number,
|
@@ -98,11 +107,21 @@ export var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
98
107
|
return x.isNegative() ? ceil(x, n) : floor(x, n);
|
99
108
|
},
|
100
109
|
Fraction: function Fraction(x) {
|
101
|
-
return x.s <
|
110
|
+
return x.s < 0n ? x.ceil() : x.floor();
|
102
111
|
},
|
103
112
|
'Fraction, number | BigNumber': function Fraction_number__BigNumber(x, n) {
|
104
|
-
return x.s <
|
113
|
+
return x.s < 0n ? ceil(x, n) : floor(x, n);
|
105
114
|
},
|
115
|
+
'Unit, number, Unit': typed.referToSelf(self => function (x, n, unit) {
|
116
|
+
var valueless = x.toNumeric(unit);
|
117
|
+
return unit.multiply(self(valueless, n));
|
118
|
+
}),
|
119
|
+
'Unit, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
|
120
|
+
'Array | Matrix, number | BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => {
|
121
|
+
// deep map collection, skip zeros since fix(0) = 0
|
122
|
+
return deepMap(x, value => self(value, n, unit), true);
|
123
|
+
}),
|
124
|
+
'Array | Matrix | Unit, Unit': typed.referToSelf(self => (x, unit) => self(x, 0, unit)),
|
106
125
|
'Array | Matrix': typed.referToSelf(self => x => {
|
107
126
|
// deep map collection, skip zeros since fix(0) = 0
|
108
127
|
return deepMap(x, self, true);
|
@@ -68,6 +68,8 @@ export var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
68
68
|
*
|
69
69
|
* math.floor(x)
|
70
70
|
* math.floor(x, n)
|
71
|
+
* math.floor(unit, valuelessUnit)
|
72
|
+
* math.floor(unit, n, valuelessUnit)
|
71
73
|
*
|
72
74
|
* Examples:
|
73
75
|
*
|
@@ -85,6 +87,12 @@ export var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
85
87
|
* math.floor(c) // returns Complex 3 - 3i
|
86
88
|
* math.floor(c, 1) // returns Complex 3.2 -2.8i
|
87
89
|
*
|
90
|
+
* const unit = math.unit('3.241 cm')
|
91
|
+
* const cm = math.unit('cm')
|
92
|
+
* const mm = math.unit('mm')
|
93
|
+
* math.floor(unit, 1, cm) // returns Unit 3.2 cm
|
94
|
+
* math.floor(unit, 1, mm) // returns Unit 32.4 mm
|
95
|
+
*
|
88
96
|
* math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]
|
89
97
|
* math.floor([3.21, 3.82, -4.71], 1) // returns Array [3.2, 3.8, -4.8]
|
90
98
|
*
|
@@ -96,9 +104,10 @@ export var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
96
104
|
*
|
97
105
|
* ceil, fix, round
|
98
106
|
*
|
99
|
-
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x
|
107
|
+
* @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
|
100
108
|
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
101
|
-
* @
|
109
|
+
* @param {Unit} [valuelessUnit] A valueless unit
|
110
|
+
* @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Rounded value
|
102
111
|
*/
|
103
112
|
return typed('floor', {
|
104
113
|
number: floorNumber.signatures.number,
|
@@ -135,6 +144,16 @@ export var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {
|
|
135
144
|
'Fraction, BigNumber': function Fraction_BigNumber(x, n) {
|
136
145
|
return x.floor(n.toNumber());
|
137
146
|
},
|
147
|
+
'Unit, number, Unit': typed.referToSelf(self => function (x, n, unit) {
|
148
|
+
var valueless = x.toNumeric(unit);
|
149
|
+
return unit.multiply(self(valueless, n));
|
150
|
+
}),
|
151
|
+
'Unit, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
|
152
|
+
'Array | Matrix, number | BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => {
|
153
|
+
// deep map collection, skip zeros since floor(0) = 0
|
154
|
+
return deepMap(x, value => self(value, n, unit), true);
|
155
|
+
}),
|
156
|
+
'Array | Matrix | Unit, Unit': typed.referToSelf(self => (x, unit) => self(x, 0, unit)),
|
138
157
|
'Array | Matrix': typed.referToSelf(self => x => {
|
139
158
|
// deep map collection, skip zeros since floor(0) = 0
|
140
159
|
return deepMap(x, self, true);
|
@@ -1,10 +1,11 @@
|
|
1
1
|
import { factory } from '../../utils/factory.js';
|
2
2
|
import { logNumber } from '../../plain/number/index.js';
|
3
3
|
var name = 'log';
|
4
|
-
var dependencies = ['config', 'typed', 'divideScalar', 'Complex'];
|
4
|
+
var dependencies = ['config', 'typed', 'typeOf', 'divideScalar', 'Complex'];
|
5
5
|
export var createLog = /* #__PURE__ */factory(name, dependencies, _ref => {
|
6
6
|
var {
|
7
7
|
typed,
|
8
|
+
typeOf,
|
8
9
|
config,
|
9
10
|
divideScalar,
|
10
11
|
Complex
|
@@ -36,12 +37,12 @@ export var createLog = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
36
37
|
*
|
37
38
|
* exp, log2, log10, log1p
|
38
39
|
*
|
39
|
-
* @param {number | BigNumber | Complex} x
|
40
|
+
* @param {number | BigNumber | Fraction | Complex} x
|
40
41
|
* Value for which to calculate the logarithm.
|
41
|
-
* @param {number | BigNumber | Complex} [base=e]
|
42
|
+
* @param {number | BigNumber | Fraction | Complex} [base=e]
|
42
43
|
* Optional base for the logarithm. If not provided, the natural
|
43
44
|
* logarithm of `x` is calculated.
|
44
|
-
* @return {number | BigNumber | Complex}
|
45
|
+
* @return {number | BigNumber | Fraction | Complex}
|
45
46
|
* Returns the logarithm of `x`
|
46
47
|
*/
|
47
48
|
return typed(name, {
|
@@ -66,6 +67,13 @@ export var createLog = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
66
67
|
},
|
67
68
|
'any, any': typed.referToSelf(self => (x, base) => {
|
68
69
|
// calculate logarithm for a specified base, log(x, base)
|
70
|
+
|
71
|
+
if (typeOf(x) === 'Fraction' && typeOf(base) === 'Fraction') {
|
72
|
+
var result = x.log(base);
|
73
|
+
if (result !== null) {
|
74
|
+
return result;
|
75
|
+
}
|
76
|
+
}
|
69
77
|
return divideScalar(self(x), self(base));
|
70
78
|
})
|
71
79
|
});
|
@@ -107,8 +107,8 @@ export var createPow = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
107
107
|
var yFrac = fraction(y);
|
108
108
|
var yNum = number(yFrac);
|
109
109
|
if (y === yNum || Math.abs((y - yNum) / y) < 1e-14) {
|
110
|
-
if (yFrac.d %
|
111
|
-
return (yFrac.n %
|
110
|
+
if (yFrac.d % 2n === 1n) {
|
111
|
+
return (yFrac.n % 2n === 0n ? 1 : -1) * Math.pow(-x, y);
|
112
112
|
}
|
113
113
|
}
|
114
114
|
} catch (ex) {
|