-
Notifications
You must be signed in to change notification settings - Fork 55
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Description
I need to find the derivative of an arbitrary expression for a calculator project I'm working on using this library. When I give it ln(|x|) it borks and gives a strange expression involving Piecewise and unsubstituted matches (_1), instead of the expected 1/(|x|). This causes the derivative to fail to compile to javascript and fail to evaluate.
Steps to Reproduce
import {
ComputeEngine,
version
} from "https://unpkg.com/@cortex-js/[email protected]?module";
const ce = new ComputeEngine();
console.log("Using CE v" + version);
const expr1 = ce.parse("\\ln |x|");
console.log("should be Ln(Abs(x)) -->", JSON.stringify(expr1)); // OK
const deriv = ce.box(["D", expr1, "x"]).evaluate();
console.log("should be 1/Abs(x) -->", JSON.stringify(deriv)); // BAD
console.log("should be \\frac{1}{\\vert x\\vert} -->", deriv.toLatex()); // BAD
try {
console.log("should be 1/Math.abs(_.x) -->", deriv.compile().toString()); // BAD
} catch (e) {
console.error(e);
}
ce.assign("x", 1 / 10);
console.log("should be 10 -->", JSON.stringify(deriv.evaluate())); // BADActual Result
Using CE v0.26.2
should be Ln(Abs(x)) --> ["Ln",["Abs","x"]]
should be 1/Abs(x) --> ["Divide",["Piecewise",["Tuple",["Multiply","_1",["Power","_1",-1]],["Less",0,"_1"]]],["Abs","x"]]
should be \frac{1}{\vert x\vert} --> \frac{1}{\vert x\vert}(\mathrm{Piecewise}(\mathrm{Pair}(\frac{\operatorname{\_1}}{\operatorname{\_1}}, 0\lt\operatorname{\_1})))
Error: Cannot compile invalid expression: "Error(ErrorCode(incompatible-type, number, function)) / |x|"
should be 10 --> ["Multiply",10,["Piecewise",["Tuple",["Multiply","_1",["Power","_1",-1]],["Less",0,"_1"]]]]
The latex also looks strange for the derivative. (Github refuses to render it inline here, so paste it into katex).
Expected Result
See above, it's in the console.log()'s
Environment
See above for version
No, it doesn't seem to work in any version that has symbolic derivative functionality.
Also of note
- Derivative of plain old
ln(x)is just fine. The absolute value messes derivative up:
import { ComputeEngine, version } from "https://unpkg.com/@cortex-js/[email protected]?module";
const ce = new ComputeEngine();
console.log("Using CE v" + version);
const expr1 = ce.parse("\\ln x");
console.log("should be Ln(x) -->", JSON.stringify(expr1)); // OK
const deriv = ce.box(["D", expr1, "x"]).evaluate();
console.log("should be Divide(1, x) -->", JSON.stringify(deriv)); // OK
try {
console.log("should be 1/_.x -->", deriv.compile().toString()); // OK
} catch (e) {
console.error(e);
}Using CE v0.26.2
should be Ln(x) --> ["Ln","x"]
should be Divide(1, x) --> ["Divide",1,"x"]
should be 1/_.x --> 1 / _.x
- The only occurrence of
Piecewisein this repository is in the definition of the derivative ofAbs; maybe that's why it's messed up - becausePiecewiseis not implemented.
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working