2010-12-15 32 views
5

Estoy tratando de resolver una ecuación en python usando SymPy. Tengo una ecuación generada (algo así como function = y(8.0-(y**3.0)) que utilizo con sympy para crear una nueva ecuación de la siguiente manera:. eq = sympy.Eq(function, 2) que da salida a y(8.0-(y**3.0)) == 2 pero sympy.solve(eq) no parece trabajarPython resolver la ecuación para una variable

>>> 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. 

gracias por leer

Respuesta

0
..

Esta es una ecuación no lineal. lo que hay que buscar es un algoritmo de búsqueda de raíces en SciPy.

8

la suya es una ecuación no lineal ... para que pueda usar optimize.fsolve para ello. para más detalles, buscan la función en este tutorial scipy

7

(No sé por qué mencionas la palabra scipy en tu pregunta cuando usas sympy en tu código. Vamos a suponer que está utilizando sympy.)

sympy puede resolver esta ecuación si se especifica una potencia entera de y (es decir y**3.0 cambió a y**3).

Lo siguiente funciona para mí usando 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) 
2

Para ecuaciones no lineales, se debe utilizar sympy.solvers.nsolve para resolver numéricamente, a excepción de algunos casos especiales en que pueda existir un programa de solución más específica y apropiada (por ejemplo tsolve).

Por ejemplo, la siguiente secuencia de comandos debe generar 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,)) 
3

Suponiendo que quiere decir que estaba tratando de utilizar sympy, en contraposición a SciPy, entonces se puede obtener sympy (trabaja con v0.7.2 +) para resolverlo haciendo un pequeño ajuste a la forma en que ha definido la ecuación - solo necesitas poner un operador de multiplicación (*) entre la primera 'y' y la '('. No parece importar si especificas la potencia como flotante o no (pero es posible que se haya requerido en 0.6) .7).

from sympy import Eq, var, solve 
var('y')  
eq = Eq(y*(8.0-(y**3.0)), 8) 
solve(eq) 
Cuestiones relacionadas