solve
дает только символьные решения, поэтому если не может найти закрытую форму для решения, то не вернет ее. Если вас интересуют только числовые решения, вы хотите, чтобы в SymPy было nsolve
, или вы можете использовать более ориентированную на числовые значения библиотеку Python. Например
sympy.nsolve(n*9**5 - 10**n-1, n, 5)
даст вам решение, которое вы ищете.
Проблема с использованием solve
заключается в том, что существует бесконечно много решений, каждое из которых соответствует ветви функции LambertW. См. WolframAlpha для полного набора решений. К сожалению, в SymPy реализована только основная ветвь LambertW.
Пока это не будет исправлено, другим способом исправить проблему будет вручную оценить LambertW, возвращенный solve
в другой ветке, используя 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 для любых других функций, которые могут быть в решении.
person
asmeurer
schedule
05.11.2013