私がやっているプロジェクトのためにPythonでラグランジュ多項式を作らなければなりません。ニュートンの分割された差分スタイルのスタイルではなく、明示的なforループの使用を避けるために、重心スタイルのスタイルを実行しています。私が抱えている問題は、ゼロによる除算をキャッチする必要があるということですが、Python(または多分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: ...
出力として得るようなことをしようとしています。