Python solve equation for one variable
Asked Answered
W

5

8

I'm trying to solve an equation in python using SymPy. I have a generated equation (something like function = y(8.0-(y**3.0)) which I use with SymPy to create a new equation like this: eq = sympy.Eq(function, 2) which outputs y(8.0-(y**3.0)) == 2. but sympy.solve(eq) doesn't seem to work.

>>> from sympy import Eq, Symbol as sym, solve
>>> y = sym('y')
>>> eqa = Eq(y(8.0-(y**3.0)), 8)
>>> solve(eqa)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.6/sympy/solvers/solvers.py", line 332, in solve
    result = tsolve(f, *symbols)
  File "/usr/lib/pymodules/python2.6/sympy/solvers/solvers.py", line 716, in tsolve
    raise NotImplementedError("Unable to solve the equation.")
NotImplementedError: Unable to solve the equation.

thanks for reading.

Witha answered 15/12, 2010 at 10:54 Comment(0)
G
9

Yours is a non linear equation ... So you can use optimize.fsolve for it. For further details look for the function in this tutorial scipy

Gallinaceous answered 15/12, 2010 at 11:7 Comment(1)
The the fsolve method is, in this case, overkill. It is true that the equation of the question is non linear, but polynomial, nevertheless (As @GaryKerr said in his answer, we express 3.0 as integer 3). For that reason, I would prefer the solution with solve of the module sympy, because this method is specifically tailored for polynomial equations (See Sympy reference ), while the fsolve method is a totally generic method based on the hybrd algorithmBlumenthal
J
9

(I don't know why you mention scipy in your question when you use sympy in your code. I'll assume you are using sympy.)

Sympy can solve this equation if you specify an integer power for y (ie y**3.0 changed to y**3).

The following works for me using Sympy 0.6.7.

from sympy import Eq, Symbol, solve

y = Symbol('y')
eqn = Eq(y*(8.0 - y**3), 8.0)

print solve(eqn)
Joplin answered 26/2, 2011 at 19:3 Comment(0)
A
3

Assuming you mean you were trying to use sympy, as opposed to scipy, then you can get Sympy (works with v0.7.2+) to solve it by making a small adjustment to way you defined your equation - you just need to put a multiplication operator (*) in between the first 'y' and the '('. It doesn't appear to matter whether you specify the power as a float or not (but it's possible it was required in 0.6.7).

from sympy import Eq, var, solve
var('y')    
eq = Eq(y*(8.0-(y**3.0)), 8)
solve(eq)
Arciniega answered 28/6, 2013 at 13:32 Comment(0)
H
2

For nonlinear equations, you should use sympy.solvers.nsolve to solve it numerically, except for some special cases where a more specific and appropriate solver may exist (e.g. tsolve).

For example, the following script should output 1.2667664310254.

from sympy import Symbol
from sympy.solvers import nsolve
from sympy import sin, tan

theta = Symbol('theta')
print nsolve(tan(theta)/(1+1*sin(theta)) - 4.0**2/9.81, theta, (1.2,))
Halo answered 6/10, 2011 at 14:40 Comment(0)
F
0

This is a non-linear equation. What you need to look for is a root finding algorithm in SciPy.

Forefather answered 15/12, 2010 at 10:59 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.