Muszę utworzyć wielomian Lagrange'a w Pythonie dla projektu, który robię. Robię styl barycentryczny, aby uniknąć używania jawnej pętli for w przeciwieństwie do stylu podzielonej różnicy Newtona. Problem, który mam, polega na tym, że muszę złapać dzielenie przez zero, ale Python (lub może numpy) po prostu sprawia, że jest to ostrzeżenie zamiast normalnego wyjątku.
Tak więc muszę wiedzieć, jak to zrobić, to złapać to ostrzeżenie, jakby to był wyjątek. Odpowiedzi na pytania związane z tym, które znalazłem na tej stronie, nie były potrzebne. Oto mój kod:
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.
Po wykonaniu tego kodu otrzymuję następujące dane:
Warning: divide by zero encountered in int_scalars
To ostrzeżenie, które chcę złapać. Powinien pojawić się wewnątrz rozumienia listy.
Warning: ...
? Próbuję rzeczy takich jaknp.array([1])/0
otrzymujęRuntimeWarning: ...
jako wyjście.