C/C++中的衍生物?

ala*_*10n 21 c c++ math numerical symbolic-math

我有一些表达,比如x^2+y^2我想用于一些数学计算.我想做的一件事就是采用表达式的偏导数.

所以,如果f(x,y) = x^2 + y^2再偏的f相对于x2x,部分相对于y2y.

我使用有限差分方法编写了一个极小的函数,但我遇到了浮点精度的许多问题.例如,我最终得到了1.99234而不是2.有没有支持符号差异化的图书馆?还有其他建议吗?

Nor*_*sey 12

我已经用几种不同的语言实现了这样的库,但不幸的是没有C.如果你只处理多项式(求和,乘积,变量,常数和幂),这很容易.Trig功能也不算太差.任何更复杂的事情,你可能会更好地花时间去掌握别人的图书馆.

如果您决定自己动手,我会提出一些简化您生活的建议:

  • 使用不可变数据结构(纯函数数据结构)来表示表达式.

  • 使用Hans Boehm的垃圾收集器为您管理内存.

  • 为了表示线性和,使用有限映射(例如,二分搜索树)将每个变量映射到其系数.

如果您愿意将Lua嵌入到C代码中并在那里进行计算,我将我的Lua代码放在http://www.cs.tufts.edu/~nr/drop/lua上.其中一个更好的功能是它可以采用符号表达,区分它,并将结果编译成Lua.你当然会找不到任何文件:-(


Bar*_*ark 6

将数值区分"正确"(在最小化错误的意义上)可能非常棘手.首先,您可能需要查看关于数值导数的 "数字关联"部分.

对于免费的符号数学包,你应该看看GiNaC.您还可以查看SymPy,这是一个独立的纯蟒蛇象征性数学包.您会发现SymPy更容易探索,因为您可以从Python命令行以交互方式使用它.

在商业端,Mathematica和Maple都有C API.您需要已安装/许可的程序版本才能使用这些库,但两者都可以轻松实现您所追求的符号差异化.


edu*_*ffy 6

如果你正在进行数值微分(" 在x = x0处评估f(x)的导数")并且你事先知道你是方程(即,不是用户输入),那么我建议使用FADBAD ++.它是一个C++模板库,用于使用自动微分来解决数字导数.它非常快速,准确.