es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error en el método de Newton-Raphson para encontrar raíces.

Estaba intentando utilizar el método de Newton-Raphson para calcular la derivada de una función y obtuve el siguiente error:

import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
acc = 10**-4

x = sym.Symbol('x')
def p(x): # definir la función
    return 924*x**6 - 2772*x**5 + 3150*x**4 - 1680*x**3 + 420*x**2 - 42*x + 1

p_prime = sym.diff(p(x))
def newton(p, p_prime, acc, start_val):
    x = start_val
    delta = p(x)/p_prime(x)
    while abs(delta) > acc:
        delta = p(x)/p_prime(x)
        print(abs(delta))
        x = x - delta
        return round(x, acc)

a = newton(p, p_prime, -4, 0)

El error fue:

delta = p(x)/p_prime(x)
TypeError: el objeto 'Add' no es llamable
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error está ocurriendo porque p_prime no se está evaluando correctamente. Esto se debe a que la función diff() de la biblioteca sympy devuelve una expresión simbólica en lugar de una función llamable. Por lo tanto, p_prime(x) devuelve un objeto ‘Add’ en lugar de un valor numérico. Para solucionar esto, puedes convertir la expresión simbólica en una función llamable utilizando la función lambdify() de la biblioteca sympy. El código actualizado se vería así:

    import numpy as np
    import matplotlib.pyplot as plt
    import sympy as sym
    
    acc = 10**-4
    x = sym.Symbol('x')
    
    def p(x): #definir la función
        return 924*x**6 - 2772*x**5 + 3150*x**4 - 1680*x**3 + 420*x**2 - 42*x + 1
    
    p_prime = sym.diff(p(x))
    p_prime_eval = sym.lambdify(x, p_prime) # convertir en función llamable
    
    def newton(p, p_prime_eval, acc, start_val):
        x = start_val
        delta = p(x)/p_prime_eval(x)
        while abs(delta) > acc:
            delta = p(x)/p_prime_eval(x)
            print(abs(delta))
            x = x - delta
        return round(x, acc)
    
    a = newton(p, p_prime_eval, acc, 0)
    

    En este código actualizado, usamos la función lambdify() para crear una versión llamable de p_prime llamada p_prime_eval. Luego, pasamos esta función a la función newton() en lugar de p_prime.

Comments are closed.