Definisi Interpolasi Spline
Interpolasi spline adalah teknik numerik yang digunakan untuk membangun fungsifungsi polinomial berdasar sekumpulan titik data (node) sehingga fungsi tersebut tidak hanya melewati semua titik tersebut, tetapi juga memiliki turunan yang kontinu pada tiap titik pertemuan. Kata spline diambil dari istilah teknik konstruksisebuah balok fleksibel yang dapat melengkung dengan halus.
Berbeda dengan interpolasi polinomial tunggal (misalnya Lagrange), spline memecah domain menjadi intervalinterval kecil dan menyesuaikan sebuah polinomial rendah (biasanya derajat 3) di tiap interval. Keuntungan utama:
- Kurva yang lebih halus (kontinuitas turunan pertama dan/atau kedua).
- Stabilitas numerik lebih baik, terutama ketika jumlah titik data besar.
- Kontrol lokalperubahan satu titik tidak mengubah seluruh kurva.
Jenisjenis Spline
Berbagai varian spline diciptakan untuk memenuhi kebutuhan khusus. Berikut yang paling umum:
1. Linear Spline
Polinomial berderajat satu pada tiap interval; hanya menjamin kontinuitas nilai, bukan turunan.
2. Quadratic Spline
Polinomial kuadrat; memberikan kontinuitas nilai dan turunan pertama, namun memerlukan lebih banyak kondisi batas.
3. Cubic Spline
Polinomial derajat tiga; paling populer karena memberikan kontinuitas nilai, turunan pertama, dan turunan kedua.
4. Natural Cubic Spline
Variasi cubic spline dengan kondisi batas kedua turunan di ujungujung sama dengan nol (menghasilkan kurva longgar).
5. Clamped (or FixedEnd) Spline
Menetapkan nilai turunan pertama pada kedua ujung (biasanya dari data kecepatan atau kemiringan).
6. BSpline dan NURBS
Generalitas lebih tinggi; menggunakan basis fungsi Bspline yang memungkinkan kontrol yang lebih fleksibel dengan sejumlah kontrol poin.
Rumus Dasar Cubic Spline
Misalkan ada n+1 titik data \((x_0,y_0),\dots,(x_n,y_n)\) dengan \(x_i < x_{i+1}\). Pada tiap interval \([x_i,x_{i+1}]\) kita definisikan:
S_i(x) = a_i + b_i (x-x_i) + c_i (x-x_i)^2 + d_i (x-x_i)^3
Koefisien \(a_i,b_i,c_i,d_i\) harus memenuhi:
- Kondisi interpolasi: \(S_i(x_i)=y_i\) dan \(S_i(x_{i+1})=y_{i+1}\).
- Kontinuitas turunan pertama: \(S_i'(x_{i+1}) = S_{i+1}'(x_{i+1})\).
- Kontinuitas turunan kedua: \(S_i''(x_{i+1}) = S_{i+1}''(x_{i+1})\).
- Kondisi batas: tergantung tipe spline (natural, clamped, dsb).
Jika kita definisikan interval panjang \(h_i = x_{i+1}-x_i\) dan selisih kemiringan \(\Delta_i = \frac{y_{i+1}-y_i}{h_i}\), maka persamaan tridiagonal untuk turunan kedua \(M_i=S_i''(x_i)\) menjadi:
h_{i-1} M_{i-1} + 2 (h_{i-1}+h_i) M_i + h_i M_{i+1} = 6 (_i - _{i-1}) Persamaan ini dibentuk untuk i=1,,n1 dan diselesaikan dengan kondisi batas yang dipilih.
LangkahLangkah Implementasi (Cubic Spline)
- Siapkan data: vektor
xdany, pastikanxterurut. - Hitung h dan :
h[i] = x[i+1]-x[i],[i] = (y[i+1]-y[i])/h[i]. - Buat matriks tridiagonal A dan vektor rhs:
- A(i,i1)=h[i1], A(i,i)=2(h[i1]+h[i]), A(i,i+1)=h[i].
- rhs[i]=6([i]-[i1]).
- Terapkan kondisi batas:
- Natural: set M = M = 0 baris pertama dan terakhir A menjadi 1 pada diagonal, rhs menjadi 0.
- Clamped: masukkan nilai turunan pada ujung ke dalam sistem.
- Selesaikan sistem linear: gunakan metode Thomas (algoritma O(n)) untuk memperoleh
M. - Hitung koefisien spline:
a_i = y_ib_i = _i - (h_i/6)*(2*M_i + M_{i+1})c_i = M_i/2d_i = (M_{i+1}-M_i)/(6*h_i) - Evaluasi: untuk nilai x* cari intervalnya, lalu gunakan persamaan
S_i(x*).
Contoh Kode Python (Natural Cubic Spline)
import numpy as npimport matplotlib.pyplot as pltdef natural_cubic_spline(x, y): n = len(x) - 1 h = np.diff(x) delta = np.diff(y) / h # Matriks tridiagonal A = np.zeros((n+1, n+1)) rhs = np.zeros(n+1) A[0,0] = 1 # natural boundary A[n,n] = 1 for i in range(1, n): A[i, i-1] = h[i-1] A[i, i] = 2*(h[i-1] + h[i]) A[i, i+1] = h[i] rhs[i] = 6*(delta[i] - delta[i-1]) M = np.linalg.solve(A, rhs) # M_i = S''(x_i) # Koefisien tiap interval a = y[:-1] b = delta - h*(2*M[:-1] + M[1:])/6 c = M[:-1]/2 d = (M[1:] - M[:-1])/(6*h) return a, b, c, d, xdef evaluate_spline(a,b,c,d,xk, xv): # cari interval i = np.searchsorted(xk, xv)-1 i = np.clip(i, 0, len(a)-1) dx = xv - xk[i] return a[i] + b[i]*dx + c[i]*dx**2 + d[i]*dx**3# Data contohx = np.array([0, 1, 2, 3, 4, 5], dtype=float)y = np.array([0, 0.8, 0.9, 0.1, -0.8, -1.0])a,b,c,d,knots = natural_cubic_spline(x, y)xs = np.linspace(x[0], x[-1], 400)ys = evaluate_spline(a,b,c,d,knots, xs)plt.plot(x, y, 'o', label='Data')plt.plot(xs, ys, '-', label='Natural Cubic Spline')plt.legend()plt.title('Interpolasi Spline')plt.show() Kode di atas menyelesaikan sistem tridiagonal secara langsung, menghitung koefisien, dan menggambar kurva hasil interpolasi.
Kesimpulan
Interpolasi spline, khususnya cubic spline, menyediakan cara yang efisien dan akurat untuk memperkirakan nilai di antara titiktitik terukur sambil menjaga kelancaran fungsi. Dengan memanfaatkan sifat lokal polinomial berderajat rendah, spline menghindari osilasi yang umum pada interpolasi polinomial tinggi serta memberikan kontrol fleksibel lewat pilihan tipe batas. Baik dalam aplikasi grafis komputer, animasi, pemodelan geofisika, ataupun pengolahan sinyal, pemahaman konsep spline menjadi bekal penting bagi siapa pun yang bekerja dengan data berkelanjutan.
