Я повинен зробити поліном Лагранжа в Python для проекту, який я роблю. Я роблю баріцентричний стиль, щоб уникнути використання явного for-loop на відміну від розділеного стилю різниці у стилі Ньютона. Проблема в мені полягає в тому, що мені потрібно спіймати поділ на нуль, але Python (або, можливо, нуме) просто робить попередження замість звичайного винятку.
Отже, що мені потрібно знати, як зробити це попередження, ніби це виняток. На пов'язані з цим питання, які я знайшов на цьому сайті, відповіли не так, як мені потрібно. Ось мій код:
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.
Коли цей код виконується, отриманий результат:
Warning: divide by zero encountered in int_scalars
Це застереження, яке я хочу вкласти. Це має відбуватися усередині розуміння списку.
Warning: ...
? Пробуючи такі речі, якnp.array([1])/0
я отримуюRuntimeWarning: ...
як вихід.