Devo realizzare un polinomio di Lagrange in Python per un progetto che sto realizzando. Sto facendo uno stile baricentrico per evitare di usare un esplicito for-loop invece di uno stile di differenza diviso di Newton. Il problema che ho è che devo catturare una divisione per zero, ma Python (o forse intorpidito) lo rende solo un avvertimento anziché una normale eccezione.
Quindi, quello che devo sapere come fare è prendere questo avviso come se fosse un'eccezione. Alle domande correlate a questo che ho trovato su questo sito non è stata data la risposta di cui avevo bisogno. Ecco il mio codice:
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.
Quando viene eseguito questo codice, l'output che ottengo è:
Warning: divide by zero encountered in int_scalars
Questo è l'avvertimento che voglio catturare. Dovrebbe verificarsi all'interno della comprensione dell'elenco.
Warning: ...
? Provando cose comenp.array([1])/0
ottengoRuntimeWarning: ...
come output.