Je dois créer un polynôme de Lagrange en Python pour un projet que je fais. Je fais un style barycentrique pour éviter d'utiliser une boucle for explicite par opposition à un style de 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 juste un avertissement au lieu d'une exception normale.
Donc, ce que j'ai besoin de savoir comment faire est d'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 de réponse de la manière 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:
Warning: divide by zero encountered in int_scalars
C'est l'avertissement que je veux attraper. Cela devrait se produire dans la compréhension de la liste.
Warning: ...
? Essayer des choses commenp.array([1])/0
moiRuntimeWarning: ...
en sortie.