Python 2.7 为什么是SymPy';s解算器只返回一个简单的解决方案?

Python 2.7 为什么是SymPy';s解算器只返回一个简单的解决方案?,python-2.7,solver,sympy,Python 2.7,Solver,Sympy,我想找到满足一个特定方程的所有实数。我很容易在Mathematica中找到这些值 其中,;但是当我使用Symphy的(0.7.3;Python 2.7.5)solve n = sympy.symbols('n') sympy.solve(n*9**5 - 10**n-1, n) 我似乎只得到了看起来像0的东西,而不是第二个值,这才是我真正想要的 我怎样才能让SymPy产生我正在寻找的非平凡的解决方案?是否应该使用不同的函数或包来代替?solve只提供符号解决方案,因此如果它找不到解决方案的闭合

我想找到满足一个特定方程的所有实数。我很容易在Mathematica中找到这些值

其中,;但是当我使用Symphy的(0.7.3;Python 2.7.5)
solve

n = sympy.symbols('n')
sympy.solve(n*9**5 - 10**n-1, n)
我似乎只得到了看起来像0的东西,而不是第二个值,这才是我真正想要的


我怎样才能让SymPy产生我正在寻找的非平凡的解决方案?是否应该使用不同的函数或包来代替?

solve
只提供符号解决方案,因此如果它找不到解决方案的闭合形式,它将不会返回它。如果您只关心数值解,那么您希望在Symphy中使用的是
nsolve
,或者您可以使用更面向数值的Python库。比如说

sympy.nsolve(n*9**5 - 10**n-1, n, 5)
将为您提供您正在寻找的解决方案


使用
solve
的问题在于有无限多个解,每个解对应于LambertW函数的一个分支。有关完整的解决方案集,请参见。不幸的是

在解决此问题之前,解决此问题的另一种方法是使用
mpmath.LambertW
在另一个分支上手动计算
solve
返回的LambertW。最简单的方法是使用
lambdify

s = sympy.solve(n*9**5 - 10**n-1, n)    
import sympy.mpmath
# Replace -1 with any integer. -1 gives the other real solution, the one you want
lambdify([], s, [{'LambertW': lambda x: sympy.mpmath.lambertw(x, -1)}, "mpmath"])()
这就给出了
[mpf('5.5125649309411875')]


字典告诉
lambdify
使用
-1
分支,使用mpmath计算
LambertW
函数。
“mpmath”
告诉它对解决方案中的任何其他函数使用mpmath

我不知道为什么它不会呈现那个URL。显然你不必像我最初认为的那样使用私有API。如果您碰巧阅读了我最初编写的内容,请查看编辑后的解决方案。
s = sympy.solve(n*9**5 - 10**n-1, n)    
import sympy.mpmath
# Replace -1 with any integer. -1 gives the other real solution, the one you want
lambdify([], s, [{'LambertW': lambda x: sympy.mpmath.lambertw(x, -1)}, "mpmath"])()