Evaluación de Diferenciación simbólica con Sympy en Python
Frecuentes
Visto 757 equipos
1
Estoy codificando el algoritmo NewtonRaphson en python usando la biblioteca Sympy, esta es la implementación de mi algoritmo:
def NewtonRaphson(fx,p0,tolerancia,iteracionesMaximas):
print
fx = S(fx)
x = Symbol('x')
i = 1
p = 0.0
while i<= iteracionesMaximas:
y = fx.subs(x,p0)
yy = diff(fx,x).subs(x,p0)
p = p0 - (y/yy)
if absolute(p-p0) < tolerancia:
print "Se encontró la raíz y={raiz} luego de {n} iteraciones".format(raiz=p, n=i-1)
return
i += 1
print "{i}\t{p}\t{p0}".format(i=i-1,p=p,p0=p0)
p = p0
print "El método falló luego de {i} iteraciones".format(i=i-1)
Estoy obteniendo un aumento con el siguiente mensaje:
line 18, in NewtonRaphson
yy = diff(fx,x).subs(x,p0)
File "/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 984, in diff
if n < 0:
File "/usr/local/lib/python2.7/dist-packages/sympy/core/relational.py", line 226, in __nonzero__
raise TypeError("symbolic boolean expression has no truth value.")
TypeError: symbolic boolean expression has no truth value.
Llamo a la función ser fx
una cadena igual a 'x**3-x-1'
e ingresa la llamada NewtonRaphson(fx,1.7,10**(-4),17)
.
¿Qué me he equivocado?
1 Respuestas
1
Parece que está pasando una expresión simbólica a la función absoluta de numpy. A juzgar por su código, apostaría a que sus declaraciones de importación fueron
from pylab import *
from sympy import *
Si ese fuera el caso, deberías simplemente reemplazar absolute
a Abs
para que esté utilizando la función de valor absoluto integrada en sympy en lugar de la destinada a matrices numpy.
Además, tendrá que reemplazar p = p0
a p0 = p
para que el algoritmo funcione correctamente.
Aquí hay una versión de trabajo con las declaraciones de importación modificadas un poco. También he eliminado algunas de las declaraciones innecesarias.
import sympy as sy
x = sy.symbols('x')
fx = x**3 - x - 1
def NewtonRaphson(fx,p0,tolerancia,iteracionesMaximas):
for i in xrange(iteracionesMaximas):
y = fx.subs(x, p0)
yy = sy.diff(fx,x).subs(x, p0)
p = p0 - (y / yy)
if sy.Abs(p-p0) < tolerancia:
print "Se encontró la raíz y={raiz} luego de {n} iteraciones".format(raiz=p, n=i-1)
return
print "{i}\t{p}\t{p0}".format(i=i+1,p=p,p0=p0)
p0 = p
print "El método falló luego de {i} iteraciones".format(i=i-1)
NewtonRaphson(fx,1.7,10**(-4),17)
Respondido 08 Feb 14, 18:02
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python sympy or haz tu propia pregunta.
Mostrar todo el rastreo. - user2357112
Cual es el valor de
fx
? - user2357112llamo x como
'x**3-x-1'
- diegoaguilar