Eu tenho que fazer um polinômio Lagrange em Python para um projeto que estou fazendo. Eu estou fazendo um estilo baricêntrico para evitar o uso de um loop for explícito, em oposição ao estilo de diferença dividida de Newton. O problema que tenho é que preciso capturar uma divisão por zero, mas o Python (ou talvez o numpy) apenas faz disso um aviso em vez de uma exceção normal.
Então, o que eu preciso saber como fazer é capturar esse aviso como se fosse uma exceção. As perguntas relacionadas a este que encontrei neste site foram respondidas da maneira que eu precisava. Aqui está o meu 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.
Quando esse código é executado, a saída que recebo é:
Warning: divide by zero encountered in int_scalars
Esse é o aviso que eu quero pegar. Deve ocorrer dentro da compreensão da lista.
Warning: ...
? Tentando coisas comonp.array([1])/0
eu receboRuntimeWarning: ...
como saída.