Tôi phải tạo một đa thức Lagrange trong Python cho một dự án tôi đang thực hiện. Tôi đang thực hiện kiểu một kiểu nhị phân để tránh sử dụng vòng lặp for rõ ràng trái ngược với kiểu khác biệt được chia của Newton. Vấn đề tôi gặp phải là tôi cần bắt một phép chia bằng 0, nhưng Python (hoặc có thể là numpy) chỉ làm cho nó trở thành một cảnh báo thay vì một ngoại lệ bình thường.
Vì vậy, những gì tôi cần biết làm thế nào là bắt được cảnh báo này như thể đó là một ngoại lệ. Các câu hỏi liên quan đến điều này tôi tìm thấy trên trang web này đã được trả lời không theo cách tôi cần. Đây là mã của tôi:
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.
Khi mã này được thực thi, đầu ra tôi nhận được là:
Warning: divide by zero encountered in int_scalars
Đó là lời cảnh báo tôi muốn nắm bắt. Nó nên xảy ra trong danh sách hiểu.
Warning: ...
không? Thử những thứ nhưnp.array([1])/0
tôi nhận đượcRuntimeWarning: ...
như đầu ra.