Sympy中的NotImplementedError解决方法

5

我正在阅读一篇关于布隆过滤器(Bloom filters)的文章,链接为https://en.wikipedia.org/wiki/Bloom_filter。在其中,作者推导了用于最优哈希函数数量的表达式。我想针对当 m = n 的简化情况来重现这个计算过程,也就是说,我想确定以下函数的最小值:

(1-exp(-x))**x

从文章中可以看出,这应该发生在x = ln(2)。我尝试使用sympy进行如下操作:

In [1]: from sympy import *

In [2]: x, y, z = symbols('x y z')

In [3]: init_printing(use_unicode=True)

In [8]: from sympy.solvers import solve

In [9]: solve(diff((1-exp(-x))**x,x), x)

然而,我遇到了一个问题。
NotImplementedError: multiple generators [x, exp(x), log(1 - exp(-x))]
No algorithms are implemented to solve equation x*exp(-x)/(1 - exp(-x)) + log(1 - exp(-x))

我只是想确认一下Sympy是否真的无法解决这个问题?也许我需要在x上添加额外的限制/假设条件吗?


2
看起来好像不行。WolframAlpha只能通过数值方法找到解,而且通常情况下,由于投入的资源更多,Mathematica比SymPy知道更多的符号技巧。(顺便说一句,该解与ln(2)的值相匹配) - user6655984
1个回答

2

当你遇到这样一个问题,即无法通过符号操作来解决方程(解析解),有可能通过尝试不同的数字并得出(或非常接近)正确答案来解决(数值解)。

您可以将您的Sympy解决方案转换为基于Numpy的函数,并使用Scipy进行数值解求解。

from sympy import lambdify
from scipy.optimize import fsolve

func_np = sp.lambdify(x, diff((1-exp(-x))**x,x), modules=['numpy'])
solution = fsolve(func_np, 0.5)

这将解决方程并返回结果0.69314718,这是您所期望的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接