【问题标题】:Print mathjs expression with variables substituted用替换的变量打印 mathjs 表达式
【发布时间】:2019-05-01 19:43:07
【问题描述】:

有没有办法在范围替换之后打印表达式字符串

var n = math.compile('x * 2');
n.eval({x:2}); // returns 4

// I WISH I could do this:
n.toString({x:2}); // returns '2 * 2'

【问题讨论】:

  • 我可以使用变量替换(如评论和删除),但我觉得解决所有表达式排列会变得复杂。例如:'apple*banana + a' {apple: 2, banana: 3, a: 4}。如果mathjs已经解决了这些,我想用它。
  • 你在这方面有什么收获吗?想做类似的事情。似乎没有简单的方法。认为我必须编写一个自定义函数,遍历节点,如果节点是 SymbolNode 则使用范围对其进行评估...

标签: javascript math mathjs


【解决方案1】:

首先要了解 MathJS 解析为表达式树的方式,以及使用的不同类型的节点。 你可以阅读更多here in the docs

代数变量被解析为符号节点。这些将需要替换它们的值。最简单的方法是使用 transform 函数,在上面给出的页面下方的 API 中对此进行了解释。

来自文档

转换(回调:函数)

通过变换函数递归变换表达式树。 与 Array.map 类似,但在所有节点上递归执行 表达树。回调函数是一个映射函数接受 一个节点,并返回该节点或原始节点的替换。 函数回调被称为回调(节点:节点,路径:字符串, parent: Node) 用于树中的每个节点,并且必须返回一个 Node。 参数路径是一个包含相对 JSON 路径的字符串。

当一个节点被替换为 回调函数,它不会遍历被替换的节点。

例如,替换所有类型为“x”的 SymbolNode 节点 使用值为 3 的 ConstantNode:

const node = math.parse('x^2 + 5*x')
const transformed = node.transform(function (node, path, parent) {
  if (node.isSymbolNode && node.name === 'x') {
    return new math.expression.node.ConstantNode(3)
  }
  else {
    return node
  }
})
transformed.toString() // returns '3 ^ 2 + 5 * 3'

【讨论】:

  • 这里有一个缺点...例如,如果 x=3 则 2x 打印为 23,而不是 2*3。将尽可能开发此解决方案以实现这一点。
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2015-08-14
  • 2016-07-08
  • 2015-06-28
相关资源
最近更新 更多