Question

I want to find all the real numbers that satisfy a particular equation. I have no trouble finding these values in Mathematica with

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

which gives both 0 and 5.51257; but when I use SymPy's (0.7.3; Python 2.7.5) solve

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

I seem to only get something that looks like 0, and not the second value, which is what I'm really seeking.

How can I get SymPy to produce the non-trivial solution I'm looking for? Is there a different function or package I should be using instead?

Was it helpful?

Solution

solve only gives symbolic solutions, so if it cannot find a closed form for a solution, it will not return it. If you only care about numeric solutions, you want in SymPy is nsolve, or you can use a more numerical oriented Python library. For example

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

will give you the solution you are looking for.


The problem with using solve is that there are infinitely many solutions, each corresponding to a branch of the LambertW function. See WolframAlpha for the full solution set. Unfortunately, only the principal branch of LambertW is implemented in SymPy.

Until this is fixed, another way to fix the issue would be to manually evaluate the LambertW returned by solve on another branch, using mpmath.lambertw. The easiest way to do this is with 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"])()

This gives [mpf('5.5125649309411875')].

The dictionary tells lambdify to evaluate the LambertW function using the -1 branch, using mpmath. The "mpmath" tells it to use mpmath for any other functions that may be in the solution.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top