我找到了这两个库:- muparser symbolicc++
第一种方法能够高效地解析数学表达式,这样我就可以用最小的包装来创建一个解析器对象,以便
parser my_parser("1/2 * x^2");
cout<<myparser(2)<<endl;将导致它打印2.0。这很棒,但只适用于双打,对吧?
第二个实现符号对象,这样在示例中我可以执行如下操作:
Symbolic x("x");
Symbolic x2 = x^2;
cout<<df(x2, x)<<endl;因此它能够区分表达式,这是很好的。
我需要做的是两者的混合!我需要一个函数来进行分析,然后进行区分,这样我就可以执行如下操作:
cout<<df("1/2 * x^2", "x")<<endl;我也希望它能打印出2.0*x。
有可能做这样的事吗?原则上,如果mu分析器可以在任何对象上工作,我可以简单地在符号对象上运行一个表达式,然后对它们进行区分。但我做不到这样的事。
还有其他解决办法吗?我需要一个带表达式的输入字符串,然后用表达式的导数返回一个输出字符串。
谢谢!
发布于 2014-10-17 19:32:20
这不是一个完整的答案,因为,正如他们所说的,TMTOWTDI。然而,为了能够使用Symbolic++,您需要有程序级的访问权限.也就是说,您不能真正地编写和编译
Symbolic x("x");
Symbolic x2 = x^2;但是你需要一些按顺序排列的东西(但是比它更灵活)
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;
}
...穆解析器(和muparserX)库似乎不允许这样做。
还有其他几个代数解析器,例如这看起来很有前途。您可以使用Parser算法,并编写一个使用Symbolic++并输出Symbolic++表达式的评估器。
您不需要深入了解语法来破解这样的解析器--大多数解析器只需要生成一个反向波兰表示法堆栈,这就是您真正需要了解的全部内容。
在bocca al lupo :-)
https://stackoverflow.com/questions/26430933
复制相似问题