我们在python的包symengine
中找不到任何evalf()
。有没有?
更详细地解释我们的问题。在
我们试图切换到symengine
而不是sympy
,因为我们感觉到了本质的加速。我们使用符号代数工具来解决在组合随机结构生成中有应用的优化问题。在
经过对sympy的一些测试,我们发现解决一些“无辜的”优化问题需要在范围1e+24
或更大范围内进行中间计算(但最终它们最终提供了正确的答案)。然后我发现我误用了sympy的函数subs()
,因为它比替换字典的evalf()
精确。在
此问题在功能部件手册中有描述:
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仍然在数字浮点数64,我怀疑这是我的机器在调用内置的float(...)
函数时强制转换成的标准类型。在
我们知道"lambdify",这是一个建议的步骤,如果你做重复的替换和想要高的数值精度,但这将是下一步。我们不能使用python解释器提供的手册,因为代码是预编译的,而且在互联网上也很难找到。查看源代码也没有帮助(但可能我遗漏了一些东西)。在
符号引擎上还没有
evalf
。以下是实现上述目标的方法请注意,如果您执行以下操作,它将以精度53(15位十进制数字)进行替换
^{pr2}$您可以使用带有
Float(3.0, dps=21)
的subs,而不是仅仅使用3.0
来进行更高精度的计算。下面的示例将同时使用symengine和sympy。在请注意,symmengine中的
.n()
更倾向于二进制数字而不是十进制数字,并且real=True
需要为实数域指定,否则它将假定为复数并给您一个带有虚数部分0.
的复数,并且将比real=True
慢一点。在相关问题 更多 >
编程相关推荐