Je dois faire un polynôme de Lagrange en Python pour un projet que je fais. Je fais un polynôme de style barycentrique pour éviter d'utiliser une boucle for explicite, par opposition à un polynôme de style différence divisée de Newton. Le problème que j'ai est que je dois attraper une division par zéro, mais Python (ou peut-être numpy) en fait un avertissement au lieu d'une exception normale.
J'ai donc besoin de savoir comment faire pour attraper cet avertissement comme s'il s'agissait d'une exception. Les questions connexes que j'ai trouvées sur ce site n'ont pas reçu la réponse dont j'avais besoin. Voici mon code :
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.
Lorsque ce code est exécuté, la sortie que j'obtiens est la suivante :
Warning: divide by zero encountered in int_scalars
C'est l'avertissement que je veux attraper. Il devrait se produire à l'intérieur de la compréhension de la liste.