4

我想找到满足特定方程的所有实数。我可以毫不费力地在Mathematica中找到这些值

Solve[n*9^5 == 10^n-1, n]

给出0 和 5.51257;但是当我使用 SymPy 的 (0.7.3; Python 2.7.5)solve

n = sympy.symbols('n')
sympy.solve(n*9**5 - 10**n-1, n)

我似乎只得到看起来像 0 的东西,而不是第二个值,这是我真正想要的。

如何让 SymPy 生成我正在寻找的重要解决方案?我应该使用其他功能或包吗?

4

1 回答 1

4

solve只给出符号解,所以如果它找不到解的封闭形式,它就不会返回它。如果您只关心数字解决方案,您希望在 SymPy 中使用 is nsolve,或者您可以使用更面向数字的 Python 库。例如

sympy.nsolve(n*9**5 - 10**n-1, n, 5)

将为您提供您正在寻找的解决方案。


使用的问题solve是有无穷多个解,每个解对应于 LambertW 函数的一个分支。完整的解决方案集参见WolframAlpha。不幸的是,只有 LambertW 的主要分支在 SymPy 中实现

在解决此问题之前,解决此问题的另一种方法是手动评估solve另一个分支上返回的 LambertW,使用mpmath.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评估LambertW函数-1,使用 mpmath。"mpmath"告诉它对解决方案中可能存在的任何其他功能使用 mpmath 。

于 2013-11-05T00:44:16.333 回答