Muszę utworzyć wielomian Lagrange w Pythonie dla projektu, który robię. Robię styl barycentryczny, aby uniknąć użycia wyraźnej pętli for, w odróżnieniu od dzielonego stylu różnicowego Newtona. Problem w tym, że muszę złapać dzielenie przez zero, ale Python (lub może numpy) sprawia, że jest to ostrzeżenie zamiast normalnego wyjątku.Jak złapać numpy ostrzeżenie, jak to jest wyjątek (nie tylko do testowania)?
Muszę wiedzieć, jak to zrobić, aby uchwycić to ostrzeżenie tak, jakby był wyjątkiem. Odpowiedzi na te pytania, które znalazłem na tej stronie, zostały udzielone nie w sposób, w jaki potrzebowałem. 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.
Gdy ten kod jest wykonywany na wyjściu pojawia się:
Warning: divide by zero encountered in int_scalars
To ostrzeżenie chcę złapać. Powinien pojawić się w spisie zrozumiałym.
Czy jesteś pewien, że to 'Ostrzeżenie: ...'? Próbując takich rzeczy jak 'np.array ([1])/0' otrzymuję' RuntimeWarning: ... 'jako wynik. – Bakuriu
@MadPhysicist Nie duplikat; NumPy ma swoją własną wewnętrzną architekturę ostrzegawczą na szczycie Pythonów, którą można kontrolować (patrz odpowiedź Bakuríu). – gerrit
@gerrit. Poprawiłem się i nauczyłem czegoś nowego. Usunąłem swój oryginalny komentarz, aby uniknąć wyzwalania szału kolekcjonerskiego. –