当前位置:  开发笔记 > 编程语言 > 正文

C/C++中的衍生物?

如何解决《C/C++中的衍生物?》经验,为你挑选了3个好方法。

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

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

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



1> Norman Ramse..:

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

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

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

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

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

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



2> Barry Wark..:

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

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

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



3> eduffy..:

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

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有