Ich muss ein Lagrange-Polynom in Python für ein Projekt erstellen, das ich gerade mache. Ich mache einen baryzentrischen Stil, um zu vermeiden, dass eine explizite for-Schleife verwendet wird, im Gegensatz zu einem Newton-Stil mit geteiltem Unterschied. Das Problem, das ich habe, ist, dass ich eine Division durch Null abfangen muss, aber Python (oder vielleicht Numpy) macht es nur zu einer Warnung anstelle einer normalen Ausnahme.
Ich muss also wissen, wie ich diese Warnung abfangen soll, als wäre es eine Ausnahme. Die diesbezüglichen Fragen, die ich auf dieser Website gefunden habe, wurden nicht so beantwortet, wie ich es brauchte. Hier ist mein 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.
Wenn dieser Code ausgeführt wird, erhalte ich folgende Ausgabe:
Warning: divide by zero encountered in int_scalars
Das ist die Warnung, die ich fangen möchte. Es sollte innerhalb des Listenverständnisses auftreten.
Warning: ...
? Versuche Dinge wienp.array([1])/0
ich bekommeRuntimeWarning: ...
als Ausgabe.