如何将evalf()应用于symengine.py?

2024-04-24 05:59:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我们在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解释器提供的手册,因为代码是预编译的,而且在互联网上也很难找到。查看源代码也没有帮助(但可能我遗漏了一些东西)。在


Tags: theto函数标准符号精度手册subs
1条回答
网友
1楼 · 发布于 2024-04-24 05:59:54

符号引擎上还没有evalf。以下是实现上述目标的方法

In [14]: (1/x).subs({x: 3}).n(73, real=True)
Out[14]: 0.333333333333333333333

请注意,如果您执行以下操作,它将以精度53(15位十进制数字)进行替换

^{pr2}$

您可以使用带有Float(3.0, dps=21)的subs,而不是仅仅使用3.0来进行更高精度的计算。下面的示例将同时使用symengine和sympy。在

In [16]: (1/x).subs({x: Float(3.0, dps=21)})
Out[16]: 0.333333333333333333333

请注意,symmengine中的.n()更倾向于二进制数字而不是十进制数字,并且real=True需要为实数域指定,否则它将假定为复数并给您一个带有虚数部分0.的复数,并且将比real=True慢一点。在

相关问题 更多 >