我们在pythonevalf()
的包中找不到任何东西。symengine
有没有存在?
更详细地解释我们的问题。
我们正在尝试切换到,symengine
而不是sympy
因为我们感知到必要的加速。我们使用符号代数工具来解决在组合随机结构生成中具有应用的优化问题。
在对 sympy 进行了一些测试后,我们发现解决一些“看起来很无辜”的优化问题需要在范围1e+24
内外进行中间计算(但最终它们最终提供了正确的答案)。然后我发现我误用了 sympy 的功能subs()
,因为它不如evalf()
替换字典精确。
这个问题在函数 subs 的手册中有描述:
If the substitution will be followed by numerical
evaluation, it is better to pass the substitution to
evalf as
>>> (1/x).evalf(subs={x: 3.0}, n=21)
0.333333333333333333333
rather than
>>> (1/x).subs({x: 3.0}).evalf(21)
0.333333333333333314830
因为前者将确保获得所需的精度水平。实际上,使用标准sympy.subs()
函数替换 e+24 或symengine.subs()
抛出无穷大,尽管 e+24 仍在 numpy.float64 的范围内,当我调用 built-in 时,我怀疑它是我的机器强制转换的标准类型float(...)
功能。
我们知道“lambdify”,如果您进行重复替换并希望获得较高的数值精度,这是推荐的步骤,但这将是下一步。我们无法使用 python 解释器的手册,因为代码是预编译的,在互联网上也很难找到。查看源代码也没有帮助(但也许我错过了一些东西)。