【问题标题】:Parsed symbolic differentiation in C++在 C++ 中解析符号微分
【发布时间】:2014-10-17 18:07:11
【问题描述】:

我找到了这两个库: - 解析器 - symbolicc++

第一个能够有效地解析数学表达式,因此我可以用最少的包装制作一个解析器对象,以便

parser my_parser("1/2 * x^2");
cout<<myparser(2)<<endl;

会导致它打印 2.0.这很棒,但它只适用于双打,对吧?

第二个实现了 Symbolic 对象,因此例如我可以执行以下操作:

Symbolic x("x");
Symbolic x2 = x^2;
cout<<df(x2, x)<<endl;

导致 2.0*x。所以它能够区分表达式,这很好。

我需要做的是两者的混合!我需要一个函数被解析然后区分,这样我就可以做类似的事情:

 cout<<df("1/2 * x^2", "x")<<endl;

我也希望它打印出 2.0*x。

有可能做这样的事情吗?原则上,如果 muparser 可以处理任何对象,我可以简单地对 Symbolic 对象运行一个表达式,然后区分它们。但我无法完成这样的工作。

那么还有其他解决方法吗?我需要一些东西,它接受一个带有表达式的输入字符串并返回一个带有该表达式导数的输出字符串。

谢谢!

【问题讨论】:

  • 我不认为你可以使用 muparser - 我相信它没有适当的回调,它只是在内部构造表达式。你应该看看类似stackoverflow.com/questions/11703082/…
  • 嗯......我不熟悉解析树和语法......有没有更简单的方法呢?这样做不是我的具体目标,所以如果有什么东西可以简单地工作,那就太棒了..

标签: c++ parsing symbolic-math differentiation


【解决方案1】:

这不是一个完整的答案,因为正如他们所说,TMTOWTDI。但是,为了能够使用 Symbolic++,您需要有程序级访问权限...也就是说,您不能真正编写和编译

Symbolic x("x");
Symbolic x2 = x^2;

但你需要一些东西(但 waaaaay 比更灵活)

if (there_is_x_symbol) {
    expr = Symbolic x("x");
}
if (raise_to_the_2nd_power) {
    expr = expr^2;
}

要以有机方式执行此操作,您需要一个解析器,以及一个解析器,它不会简单地导出evaluate() 方法,而是允许您访问表达式树的东西,例如

     ( multiply )
      /        \
  ( 2 )       ( square )
                 \
                ( x )

这你可以递归评估:

left = myEvaluate(node.left)
right = myEvaluate(node.right)
if (node.op == multiply) {
    return left * right;
}
if (node.op == square ) {
    return right ^ 2;
}
...

muparser(和 muparserX)库似乎不允许这样做。

还有其他几个代数解析器,例如this 看起来很有前途。您可以使用供应商 Parser 算法,并编写自己的 Evaluator 使用 Symbolic++ 并输出 Symbolic++ 表达式。

您无需深入了解语法即可破解这样的解析器 - 大多数只会生成一个 Reverse Polish Notation 堆栈,而这就是您真正需要了解的全部内容。

在 bocca al lupo :-)

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2011-12-22
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多