我正在阅读有关Bloom过滤器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
上添加其他约束/假设?
答案 0 :(得分:0)
当您遇到无法通过操纵符号(解析地解决)来解决方程式的问题时,仍然有可能通过尝试不同的数字并获得(或非常接近)正确答案来解决(数值求解)。
您可以将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 ,这正是您所期望的。