Почему решатель SymPy возвращает только одно тривиальное решение?

Я хочу найти все действительные числа, которые удовлетворяют определенному уравнению. У меня нет проблем с поиском этих значений в 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 создать нетривиальное решение, которое я ищу? Есть ли другая функция или пакет, который я должен использовать вместо этого?


person orome    schedule 04.11.2013    source источник


Ответы (1)


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
comment
Не знаю, почему он не будет отображать этот URL. - person asmeurer; 05.11.2013
comment
Очевидно, вам не нужно использовать частные API, как я изначально думал, что вы это сделали. Посмотрите отредактированное решение на случай, если вы прочитали то, что я изначально написал. - person asmeurer; 05.11.2013