Evaluación de Diferenciación simbólica con Sympy en Python

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?

preguntado el 08 de febrero de 14 a las 12:02

Mostrar todo el rastreo. -

Cual es el valor de fx? -

llamo x como 'x**3-x-1' -

1 Respuestas

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 or haz tu propia pregunta.