C++中的符号计算

17

我需要在C++中进行解析积分。例如,我需要对这样的表达式进行积分:exp[I(x-y)],其中I是一个虚数。

那么如何在C++中实现呢?

我尝试使用GiNaC库,但它只能对多项式进行积分。我还尝试了SymbolicC++库,它可以对诸如sinecosine或者exp(x)ln(x)等函数进行积分,但其功能有限。例如,它无法对类似于x*ln(x)这样的函数进行积分,而这种积分可以很容易地通过Mathematica或分部积分得到。

是否有其他工具或库能够在C++中进行符号计算,例如解析积分?


使用Matlab是一个选项吗?Matlab的符号工具箱应该能够做这些事情。使用C Matlab引擎,您可以从C++代码中调用它? - Philipp
尽管可能没有像您所要求的本地C++库那样的东西,但是您的问题从原则上讲有很多微妙之处。首先,您想要集成什么,您必须能够定义这样的表达式,这是运行时表达式(例如表达式树)还是编译时表达式(例如Boost.Phoenix)?您想要什么样的结果(运行时/编译时)可调用函数?您的问题非常有效,问题在于解决方案必须首先解决这些微妙之处。 - alfC
@alfC 有没有任何库可以在运行时执行符号计算? - Tomilov Anatoliy
@Dukales、GiNaC、SymbolicC++和libmatheval http://www.gnu.org/software/libmatheval/都不太符合我的要求。 - alfC
GiNaC可以在较新的版本上对sinecosine等进行积分。 - Isaac Pascual
显示剩余2条评论
3个回答

7
如果您需要进行符号积分,那么您可能无法获得比在mathematica或maxima中运行更快的结果 - 它们已经高度优化。因此,除非您的方程具有可以利用的非常特定的公式,而且这种公式无法由Mathematica或Maxima利用,否则您可能会遇到困难 - 至少您不会从现成的库中获取这种自定义操作。
如果您需要进行数值解决方案,您可能有理由编写自己的代码以提高速度。(我知道我为生成PDE的数值解决方案而编写了代码)。

我的代码是用Mathematica编写的,链接在这里:http://www.mediafire.com/?cw9s3ne7jz8fq7s 这段代码涉及到递归关系。我给出了第0项,它得到了第一项,然后使用第一项来得到第二项,以此类推。 对于前四项,不需要太多时间,但对于更高的项数,需要很长很长的时间,而且实际上我从未获得过那些更高的项数。 这段代码旨在解决一个积分-微分方程,因此我需要获得很多项。至少我认为需要获得50个项。 - MOON
因为在Mathematica中需要很长时间,所以我决定用C++来编写它。 - MOON
你能添加一张方程的图片吗?我无法打开Mathematica笔记本(这些日子没有Mathematica可用...) - Michael Anderson
Maxima不是用C++编写的,而是用Lisp编写的。 - Damien Mattei
@DamienMattei 同意,我已删除了建议它是的评论。 - Michael Anderson

6

我知道的其他进行符号计算的C++库有:

如果我没记错,SymEngine目前还不支持积分,但Piranha支持。 Piranha的文档 目前有些有限且正在开发中,但是您可以在此处查看集成函数 here。请注意,第二个链接使用Python包装器Piranha的语法。但是,Piranha“是一个用于稀疏多元多项式和其他密切相关的符号对象(如泊松级数)的符号操作的计算机代数库”,因此我认为它无法集成您可能感兴趣的特定函数。

虽然它不是C ++,但您可能也会对Python的SymPy感兴趣,它可以执行您可能感兴趣的一些更复杂的符号积分。 SymPy的集成文档在此处


4
几天前,我在寻找一个类似于SymPy的符号数学库,但是用C++编写,因为与Python或大多数其他编程语言相比速度更快,让我很困惑。
我找到了Vienna Math Library,这是一款非常现代化的语法,并且拥有SymPy的功能。此库还具有可用于解决问题的积分函数。
它足以解决3个自由度关节操纵器的IK(反向运动学)问题。

看起来维也纳只支持非常简单函数的解析积分。 "在ViennaMath 1.0.0中,解析积分仅适用于编译时类型和多项式作为被积函数。"(编译时类型似乎只有二元运算、常量和独立变量) - Michael Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接