Yaptığım bir proje için Python'da bir Lagrange polinomu yapmam gerekiyor. Ben Newton'un bölünmüş fark tarzı biri yerine açık bir for-loop kullanmaktan kaçınmak için barycentric tarzı bir yapıyorum. Benim sorunum sıfıra bir bölümü yakalamak gerekir, ama Python (veya belki numpy) sadece normal bir istisna yerine bir uyarı yapar.
Nasıl yapacağımı bilmem gereken şey bu uyarıyı bir istisna gibi yakalamak. Bu sitede bulduğum ilgili sorulara ihtiyacım olan şekilde cevap verilmedi. İşte benim 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.
Bu kod yürütüldüğünde, aldığım çıktı:
Warning: divide by zero encountered in int_scalars
Yakalamak istediğim uyarı bu. Liste kavrayışı içinde gerçekleşmelidir.
Warning: ...
misin?np.array([1])/0
Benim gibi şeyleri denemekRuntimeWarning: ...
çıktı olarak alırım .