首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的解析符号微分

C++中的解析符号微分
EN

Stack Overflow用户
提问于 2014-10-17 18:07:11
回答 1查看 1.4K关注 0票数 2

我找到了这两个库:- muparser symbolicc++

第一种方法能够高效地解析数学表达式,这样我就可以用最小的包装来创建一个解析器对象,以便

代码语言:javascript
复制
parser my_parser("1/2 * x^2");
cout<<myparser(2)<<endl;

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

第二个实现符号对象,这样在示例中我可以执行如下操作:

代码语言:javascript
复制
Symbolic x("x");
Symbolic x2 = x^2;
cout<<df(x2, x)<<endl;

因此它能够区分表达式,这是很好的。

我需要做的是两者的混合!我需要一个函数来进行分析,然后进行区分,这样我就可以执行如下操作:

代码语言:javascript
复制
 cout<<df("1/2 * x^2", "x")<<endl;

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

有可能做这样的事吗?原则上,如果mu分析器可以在任何对象上工作,我可以简单地在符号对象上运行一个表达式,然后对它们进行区分。但我做不到这样的事。

还有其他解决办法吗?我需要一个带表达式的输入字符串,然后用表达式的导数返回一个输出字符串。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-10-17 19:32:20

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

代码语言:javascript
复制
Symbolic x("x");
Symbolic x2 = x^2;

但是你需要一些按顺序排列的东西(但是比它更灵活)

代码语言:javascript
复制
if (there_is_x_symbol) {
    expr = Symbolic x("x");
}
if (raise_to_the_2nd_power) {
    expr = expr^2;
}

要以一种有机的方式这样做,您的需要一个解析器()和一个解析器,它不只是导出evaluate()方法,而是允许您访问表达式树的东西,例如

代码语言:javascript
复制
     ( multiply )
      /        \
  ( 2 )       ( square )
                 \
                ( x )

您可以递归地对此进行评估:

代码语言:javascript
复制
left = myEvaluate(node.left)
right = myEvaluate(node.right)
if (node.op == multiply) {
    return left * right;
}
if (node.op == square ) {
    return right ^ 2;
}
...

穆解析器(和muparserX)库似乎不允许这样做。

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

您不需要深入了解语法来破解这样的解析器--大多数解析器只需要生成一个反向波兰表示法堆栈,这就是您真正需要了解的全部内容。

在bocca al lupo :-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26430933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档