Saya harus membuat polinomial Lagrange dengan Python untuk proyek yang saya lakukan. Saya sedang melakukan gaya barycentric untuk menghindari menggunakan for-loop eksplisit sebagai lawan dari gaya perbedaan perbedaan Newton. Masalah yang saya miliki adalah bahwa saya perlu menangkap pembagian dengan nol, tetapi Python (atau mungkin numpy) hanya menjadikannya peringatan, bukan pengecualian normal.
Jadi, apa yang perlu saya ketahui bagaimana melakukannya adalah menangkap peringatan ini seolah-olah itu pengecualian. Pertanyaan terkait dengan ini saya temukan di situs ini dijawab tidak seperti yang saya butuhkan. Ini kode saya:
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.
Ketika kode ini dieksekusi, output yang saya dapatkan adalah:
Warning: divide by zero encountered in int_scalars
Itu peringatan yang ingin saya tangkap. Itu harus terjadi di dalam daftar pemahaman.
Warning: ...
? Mencoba hal-hal seperti yangnp.array([1])/0
saya dapatkanRuntimeWarning: ...
sebagai output.