내가하고있는 프로젝트를 위해 파이썬에서 Lagrange 다항식을 만들어야합니다. 나는 뉴턴의 분리 된 차이 스타일과 달리 명시 적 for 루프를 사용하지 않기 위해 barycentric 스타일을하고 있습니다. 내가 가진 문제는 0으로 나누기를 잡아야하지만 파이썬 (또는 아마도 numpy)은 정상적인 예외 대신 경고를합니다.
따라서 어떻게해야하는지 알아야 할 것은이 경고를 예외 인 것처럼 잡는 것입니다. 이 사이트에서 찾은 이것에 대한 관련 질문은 내가 필요한 방식으로 답변되지 않았습니다. 내 코드는 다음과 같습니다.
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: ...
것과 같은 것을 시도 합니다.