Sympy解决中的NotImplementedError

时间:2017-08-26 11:43:40

标签: python sympy

我正在阅读有关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上添加其他约束/假设?

1 个答案:

答案 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 ,这正是您所期望的。