Outline:
- Referensi/Materi
- Referensi Video
- Code/Module
- Forum Diskusi
Referensi/Materi
- https://static1.squarespace.com/static/5aff705c5ffd207cc87a512d/t/5b0378cc575d1f9eea15b56d/1526954189706/Numerical+Methods.pdf
- https://www.math.tamu.edu/~pasciak/classes/609/lectures.pdf
- Materi Bahasa Indonesia
Referensi Video
Open Code in Google Colaboratory
Metode Numerik
</center>
Interpolasi dan Aproksimasi Polinomial ¶
(C) Taufik Sutanto - 2020
tau-data Indonesia ~ https://tau-data.id/mfds-nm-04/
III. Interpolasi dan Aproksimasi Polinomial:
- Pendahuluan
- Deret Taylor Revisited
- Pendahuluan interpolasi
- Aproksimasi Lagrange
- Polinomial Newton
- Polinomial Chebysev
import warnings; warnings.simplefilter('ignore')
import numpy as np, matplotlib.pyplot as plt, math
def eks(x): # Fungsi Eksponensial
return math.exp(x)
def pol_2(x): # Fungsi Pendekatan Polinomial Derajat 2
return 1+x+0.5*x**2
def che_2(x): # Fungsi Pendekatan Polinomial Derajat 2
return 1+ 1.29772*x+0.532042*x**2
X = np.linspace(-1, 1, 100)
y1 = [eks(x) for x in X]
y2 = [pol_2(x) for x in X]
y3 = [che_2(x) for x in X]
x_data = [-1, 0, 1]
y_data = [math.exp(-1), 1, math.exp(1)]
plt.plot(X, y1, label = "Eksponensial")
plt.plot(X, y2, label = "Polinomial")
plt.plot(X, y3, label = "Chebysev")
plt.stem(x_data, y_data, label = "data points", linefmt='C2:', markerfmt = 'C2o')
plt.legend()
plt.show()
Mari kita analisa error dari pendekatan 2 fungsi diatas¶
error_poly = [abs(y_eks-y_pol) for y_eks,y_pol in zip(y1,y2)]
error_che = [abs(y_eks-y_che) for y_eks,y_che in zip(y1,y3)]
print('Maksimum Error pendekatan polynomial = ', max(error_poly))
print('Maksimum Error pendekatan chebysev = ', max(error_che))
Maksimum Error pendekatan polynomial = 0.2182818284590451 Maksimum Error pendekatan chebysev = 0.15574827874092856
plt.plot(X, error_poly, label = "graph error Mutlak Polynomial")
plt.plot(X, error_che, label = "graph error Mutlak Chebysev")
plt.legend(); plt.show()
error_poly = [abs(y_eks-y_pol)/abs(y_eks) for y_eks,y_pol in zip(y1,y2)]
error_che = [abs(y_eks-y_che)/abs(y_eks) for y_eks,y_che in zip(y1,y3)]
plt.plot(X, error_poly, label = "graph error relatif Polynomial")
plt.plot(X, error_che, label = "graph error relatif Chebysev")
plt.legend(); plt.show()
# bagaimana menganalisa perbedaan analisa error ini?
Mengingat kembali deret Taylor
Analisa Teorema Aproksimasi Taylor berikut
- Pahami teoremanya; Coba f(x)=ex
- [a,b] = [-1, 1]
- N = 2, x0=0
- Apakah PN(x) dan EN(x)?
Bagaimana cara "menggunakan" teorema diatas?¶
# Above calculation in Python
def Rn(x, c, N = 16):
return (math.exp(c)*x**N)/math.factorial(N)
xo = 1
eps = 10**-6 # epsilon
C = np.linspace(0+eps, 1-eps, 100)
Y = [ Rn(xo, c) for c in C ]
Max_e = max(Y)
print('Maksimum Error = ', Max_e)
idx = Y.index(Max_e)
print('Ketika c = ', C[idx], ' idx = ', idx)
Maksimum Error = 1.2991953390200655e-13 Ketika c = 0.999999 idx = 99
cMax = [C[idx]]
eMax = [max(Y)]
plt.plot(C, Y, label = "Fungsi Sisa Deret Taylor")
plt.stem(cMax, eMax, label = "Error Maximum", linefmt='C2:', markerfmt = 'C2o')
plt.legend()
plt.show()
Apa penting/maksud-nya Corolarry ini?
# Hal 197
X = np.linspace(-2, 2, 100)
Y = [eks(x) for x in X]
plt.plot(X, Y, label = "Eksponensial e^x")
def PN(x, N=1):
y = 0
for i in range(N):
y = y + x**i/math.factorial(i)
return y
x = 1
N = [1,2,3,4,5,6]
for n in N:
Y = [PN(x,n) for x in X]
plt.plot(X, Y, label = "P_"+str(n))
plt.legend()
plt.show()
Pendahuluan Interpolasi¶
- Di section sebelum ini kita membahas bahwa polinomial dapat digunakan untuk mendekati fungsi eksponensial.
- Bahkan dengan teorema Taylor kita bisa menghitung pendekatan untuk semarang fungsi.
- Tapi Teorema tersebut agak menyulitkan untuk diaplikasikan di dunia nyata (Kenapa?)
- Di bagian ini kita akan merubah permasalahannya:
- Diberikan titik-titik = {(xi,yi),i∈I} dimana yi=f(xi) untuk suatu fungsi f(x)
- Tentukan fungsi polinomial P(x) yang melewati titk-titik tersebut
Permasalahan diatas dapat diselesaikan dengan mengubah permasalahannya menjadi sebuah Sistem Persamaan linear (SPL)¶
Untuk mengestimasi fungsi y=f(x) pada titik x berdasarkan nilai-nilai dari fungsinya yang diketahui f(x0),⋯,f(xn) pada himpunan n+1 titik a=x0≤x1≤⋯≤xn=b di interval interval [a,b].
Proses ini disebut interpolasi jika a<x<b atau ekstrapolasi jika x<a atau b<x.
Salah satu cara untuk menyelesaikan permasalahan ini adalah dengan mengaproksimasi f(x) dengan polinomial derajat n :
Dimana n+1 coefficient a0,⋯,an bisa didapatkan berdasarkan n+1 titik yang diberikan. Ketika Pn(x) telah dihitung, maka berbagai operasi pada fungsi f(x), seperti turunan, integral, dan mencari akar dapat di lakukan (secara aproksimasi) berdasarkan Pn(x)≈f(x).
Hal ini bermanfaat jika f(x) adalah fungsi yang "sulit"
- Kita ingin menemukan koefisien-koefisien dari Pn(x)
- sehingga ia melewati seluruh titik {xi,yi=f(xi),i=0,⋯,n},
- dengan kata lain n+1 persamaan linear berikut ini harus terpenuhi: Pn(xi)=n∑j=0ajxji=f(xi)=yi,(i=0,⋯,n)
- Dalam bentuk matriks koefisien a0,⋯,an dapat dihitung dengan menyelesaikan n+1 persamaan linear: [1x0x20…xn01x1x21…xn11x2x22…xn2⋮⋮⋮⋱⋮1xnx2n…xnn][a0a1a2⋮an]=Va=[y0y1y2⋮yn]=y
dimana a=[a0,⋯,an]T, y=[y0,⋯,yn]T, dan
V=[1x0x20…xn01x1x21…xn11x2x22…xn2⋮⋮⋮⋱⋮1xnx2n…xnn]- Matriks diatas disebut sebagai matriks Vandermonde.
- Solusi SPL ini akan memberikan koefisien [a0,⋯,an]T=a=V−1y.
- Ke n+1 polinomial x0,x1,x2,⋯,xn dapat dianggap sebagai sebuah (salah satu contoh) himpunan polynomial basis functions yang merentang (span) ruang (space) dari semua polinomial derajat n.
Jika titik-titik x0,⋯,xn berbeda, atau dengan kata lain, V memiliki rank yang penuh dan invers dari V−1 ada, maka solusi a=V−1f unik, begitu juga Pn(x).
Error kemudian dapat dihitung dengan cara (MSE): (1kk∑i=1[f(ui)−P3(ui)]2)1/2
Contoh:¶
Aproksimasi fungsi y=f(x)=xsin(2x+π/4)+1 dengan polinomial P3(x) dengan derajat n=3, berdasarkan titik-titik berikut n+1=4:
i0123xi−1012yi=f(xi)1.9371.0001.349−0.995Pertama-tama kita tentukan matriks Vandermonde-nya:
V=[1x0x20x301x1x21x311x2x22x321xnx2nx3n]=[1−11−1100011111248][a0a1a2a3]=[1.9371.0001.349−0.995]- Kita kemudian bisa menggunakan metode Gauss atau Gauss-Newton di Aljabar Linear untuk menemukan solusi dari SPL ini.
# Contoh
x_data = np.array([-1, 0, 1, 2])
y_data = np.array([1.937, 1, 1.349, -0.995])
V = np.vander(x_data, 4, increasing=False) # Fungsi Vandermonde di Numpy
print(V)
[[-1 1 -1 1] [ 0 0 0 1] [ 1 1 1 1] [ 8 4 2 1]]
a = np.linalg.solve(V, y_data) # Selesaikan SPL-nya
print(a)
[-0.66316667 0.643 0.36916667 1. ]
# Look at the polynomial
p = np.poly1d(a)
print(np.poly1d(p))
3 2 -0.6632 x + 0.643 x + 0.3692 x + 1
def f(x):
return x*np.sin(2*x+np.pi/4)+1
x = np.linspace(-1, 2, 100)
y_int = p(x)
y_org = f(x)
plt.plot(x, y_int, label = "Iterpolation")
plt.plot(x, y_org, label = "Original Function")
plt.stem(x_data, y_data, label = "data points", linefmt='C2:', markerfmt = 'C2o')
plt.legend()
plt.show()
np.polynomial.polynomial.polyvander(x_data, 3)
array([[ 1., -1., 1., -1.], [ 1., 0., 0., 0.], [ 1., 1., 1., 1.], [ 1., 2., 4., 8.]])
Aplikasi Interpolasi¶
- Data filling
- Function approximation
- Fundamental component of other algorithms
- Root finding (secant method)
- Optimization, minima/maxima (successive parabolic interpolation)
- Numerical integration and differentiation
Interpolasi Lagrange (hal 215)¶
Diberikan N+1 titik-titik (x0,y0),(x1,y1),…,(xN,yN) dan memisalkan xi semuanya unik, interpolasi polinomialnya PN(x) dapat ditulis sebagai:
PN(x)=N∑i=0yiℓi(x)dimana
ℓi(x)=N∏j=0,j≠ix−xjxi−xj=x−x0xi−x0x−x1xi−x1⋯x−xi−1xi−xi−1x−xi+1xi−xi+1⋯x−xNxi−xNdengan ℓi(xi)=1 dan ∀j≠i, ℓi(xj)=0.
Contoh (di buku): N=1 Lagrange Polynomial¶
Diberikan 2 titik (x0,y0) dan (x1,y1) bentuk Lagrange dari PN(x) adalah
ℓ0(x)=x−x1x0−x1dan
ℓ1(x)=x−x0x1−x0sehingga
P1(x)=ℓ0(x)⋅y0+ℓ1(x)⋅y1=x−x1x0−x1⋅y0+x−x0x1−x0⋅y1Salah satu hal yang penting dari polinomial Lagrange adalah ℓi(x)=1 ketika x=xi dan untuk ℓj(x)=0 untuk j≠i.
# Di Python
data = np.array([[-1.5, -0.5], [0.0, 0.5]])
N = data.shape[0] - 1
M = data.shape[0]
x = np.linspace(-2.0, 2.0, 100)
# Hitung Basis Lagrange (\ell_i(x))
def lagrange_basis(x, data):
basis = np.ones((data.shape[0], x.shape[0]))
for i in range(data.shape[0]):
for j in range(data.shape[0]):
if i != j:
basis[i, :] *= (x - data[j, 0]) / (data[i, 0] - data[j, 0])
return basis
# Hitung interpolasi polynomial interpolant dari (x,y) menggunakan basis Lagrange
def poly_interpolant(x, data):
P = np.zeros(x.shape[0])
basis = lagrange_basis(x, data)
for n in range(data.shape[0]):
P += basis[n, :] * data[n, 1]
return P
# Plot full polynomial P_N(x)
fig = plt.figure()
axes = fig.add_subplot(1, 1, 1)
axes.plot(x, poly_interpolant(x, data), label="$P_{%s}(x)$" % N)
for point in data:
axes.plot(point[0], point[1], 'ko')
axes.set_title("$P_N(x)$")
axes.set_xlabel("x")
axes.set_ylabel("$P_N(x)$")
plt.show()
Contoh di Buku Hal 216¶
data_1 = np.array([[0.0, math.cos(0.0)], [1.2, math.cos(1.2)]])
data_2 = np.array([[0.2, math.cos(0.2)], [1.0, math.cos(1.0)]])
X = np.linspace(0.0, 1.2, 100)
plt.plot(X, poly_interpolant(X, data_1), label = "Iterpolasi Lagrange 1")
plt.plot(X, poly_interpolant(X, data_2), label = "Iterpolasi Lagrange 1")
plt.plot(X, [math.cos(x) for x in X], label = "Fungsi Asli (Cosinus)")
x_data = np.append(data_1[:,0],data_2[:,0])
y_data = np.append(data_1[:,1],data_2[:,1])
plt.stem(x_data, y_data, label = "data points", linefmt='C2:', markerfmt = 'C2o')
plt.legend()
plt.show()
Contoh Lain: Interpolasi 6 titik dari sin(πx)¶
- Gunakan 6 titik untuk approksimasi sin pada interval x∈[−1,1].
- Apa yang terjadi jika N→∞?
- Plot error antara f(x) dan PN(x).
num_points = 3
data = np.empty((num_points, 2))
data[:, 0] = np.linspace(-1, 1, num_points)
data[:, 1] = np.sin(2.0 * np.pi * data[:, 0])
N = data.shape[0] - 1 # Degree of polynomial
M = data.shape[0]
x = np.linspace(-1.0, 1.0, 100)
# Plot individual basis functions
fig = plt.figure()
axes = fig.add_subplot(1, 1, 1)
basis = lagrange_basis(x, data)
for i in range(N + 1):
axes.plot(x, basis[i, :], label="$\ell_{%s}(x)$" % i)
axes.set_title("Maisng-masing Basis Lagrange $\ell_i(x)$")
axes.set_xlabel("x")
axes.set_ylabel("$\ell_i(x)$")
axes.legend(loc=1)
# Plot polynomial P_N(x)
fig = plt.figure()
axes = fig.add_subplot(1, 1, 1)
axes.plot(x, poly_interpolant(x, data), label="$P_{%s}(x)$" % N)
axes.plot(x, np.sin(2.0 * np.pi * x), 'r--', label="True $f(x)$")
for point in data:
axes.plot(point[0], point[1], 'ko')
axes.set_title("$P_N(x)$")
axes.set_xlabel("x")
axes.set_ylabel("$P_N(x)$")
plt.show()
Fungsi Runge's¶
- Interpolasi f(x)=11+25x2 menggunakan sembarang 6 titik di x∈[−1,1].
- Coba N=11.
- Apa yang terjadi ketika N membesar?
np.exp(2)
7.38905609893065
def f(x):
return 1.0 / (1.0 + 25.0 * x**2)
x = np.linspace(-1, 1, 100)
num_points = 100
data = np.empty((num_points, 2))
data[:, 0] = np.linspace(-1, 1, num_points)
data[:, 1] = f(data[:, 0])
N = data.shape[0] - 1
# Plot the results
fig = plt.figure()
axes = fig.add_subplot(1, 1, 1)
axes.plot(x, poly_interpolant(x, data), 'b', label="$P_6(x)$")
axes.plot(x, f(x), 'k', label="True $f(x)$")
axes.plot(data[:, 0], data[:, 1], 'ro', label="data")
axes.set_title("Interpolasi fungsi Runge")
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.legend(loc=1)
plt.show()
Hikmah:¶
- Hindari menginterpolasi dengan derajat yang terlalu tinggi. Mulai dari derajat rendah, lalu tambahkan perlahan.
- Hindari extrapolasi - Selalu verifikasi jika x diluar batas domain data
Analisa Error¶
Theorem: Lagrange Remainder Theorem - Misal f(x)∈CN+1[−1,1], maka f(x)=PN(x)+RN(x) dimana PN(x) adalah interpolasi polinomialnya dan RN(x)=Q(x)f(N+1)(c)(N+1)!withc∈[−1,1] dengan Q(x)=N∏i=0(x−xi)=(x−x0)(x−x1)⋯(x−xN).
- Meminimumkan error pendekatan Lagrange berarti meminimumkan fungsi Q(x)
- Bagaimana memilih titik-titiknya agar Q(x) minimal?
Teorema di Buku
Polynomial Newton
- Apa nilai ao, a1, a2, ... ?
Diagonal dari tabel ini:
Contoh
Errornya
import math
def f(x):
return 3*math.sin(2*x)
f(1)
2.727892280477045
End of Module
Jangan lupa kolom komentar bukan untuk berdiskusi/bertanya, untuk keperluan tersebut silahkan klik tautan untuk menuju Forum terkait modul ini.
What's Next?
Referensi:
- Johansson, R. (2018). Numerical Python: Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib. Apress.
- John H. Mathews, Numerical Methods for Mathematics, Prentice Hall, 1992 [Refernsi Utama]
- Heath, M. T. (2018). Scientific computing: an introductory survey (Vol. 80). SIAM.
- Conte, S. D., u0026amp; De Boor, C. (2017). Elementary numerical analysis: an algorithmic approach (Vol. 78). SIAM.
No comments:
Post a Comment
Relevant & Respectful Comments Only.