Tengo que hacer un polinomio de Lagrange en Python para un proyecto que estoy haciendo. Estoy haciendo un estilo baricéntrico para evitar el uso de un bucle for explícito en lugar del estilo de diferencia dividida de Newton. El problema que tengo es que necesito atrapar una división por cero, pero Python (o quizás numpy) solo lo convierte en una advertencia en lugar de una excepción normal.
Entonces, lo que necesito saber hacer es captar esta advertencia como si fuera una excepción. Las preguntas relacionadas con esto que encontré en este sitio no fueron respondidas de la manera que necesitaba. Aquí está mi código:
import numpy as np
import matplotlib.pyplot as plt
import warnings
class Lagrange:
def __init__(self, xPts, yPts):
self.xPts = np.array(xPts)
self.yPts = np.array(yPts)
self.degree = len(xPts)-1
self.weights = np.array([np.product([x_j - x_i for x_j in xPts if x_j != x_i]) for x_i in xPts])
def __call__(self, x):
warnings.filterwarnings("error")
try:
bigNumerator = np.product(x - self.xPts)
numerators = np.array([bigNumerator/(x - x_j) for x_j in self.xPts])
return sum(numerators/self.weights*self.yPts)
except Exception, e: # Catch division by 0. Only possible in 'numerators' array
return yPts[np.where(xPts == x)[0][0]]
L = Lagrange([-1,0,1],[1,0,1]) # Creates quadratic poly L(x) = x^2
L(1) # This should catch an error, then return 1.
Cuando se ejecuta este código, el resultado que obtengo es:
Warning: divide by zero encountered in int_scalars
Esa es la advertencia que quiero atrapar. Debe ocurrir dentro de la lista de comprensión.
Warning: ...
? Probar cosas comonp.array([1])/0
me saleRuntimeWarning: ...
como salida.