Sejauh ini kita menghitung nilai fungsi pada titik yang kita pilih sendiri. Dunia data sering bekerja terbalik: sensor suhu mencatat nilai setiap jam penuh, lalu laporan insiden menanyakan suhu pada pukul 02.30 — waktu yang tidak pernah diukur. Interpolasi menjawab kebutuhan itu dengan membangun fungsi yang melewati semua titik data, lalu membaca nilai fungsi tersebut di antara titik-titik pengukuran. MATLAB membungkus pekerjaan ini dalam satu panggilan interp1 untuk data satu dimensi dan interp2 untuk grid dua dimensi.
Interpolasi atau Fitting? #
Pilih pendekatan sesuai sifat data: layak dilalui kurva, atau ber-noise sehingga kurva cukup mendekati? Interpolasi memaksa kurva melewati setiap titik secara tepat — cocok untuk tabel fungsi atau data kalibrasi yang presisi. Curve fitting membiarkan kurva meleset sedikit demi menangkap pola — cocok untuk data eksperimen yang bergejolak.
| Aspek | Interpolasi | Curve Fitting |
|---|---|---|
| Hubungan dengan titik data | melewati setiap titik tepat | boleh meleset (ada residu) |
| Asumsi data | presisi, layak dilalui | mengandung noise |
| Pertanyaan yang dijawab | berapa nilai di antara titik? | pola apa yang mengatur data? |
| Fungsi MATLAB | interp1, interp2 | polyfit, fminsearch |
Curve fitting menyusul pada chapter berikutnya.
interp1: Interpolasi Linear Satu Dimensi #
Bentuk dasarnya: interp1(x, y, q) dengan x titik data (harus naik), y nilai data, dan q titik query. Metode default adalah 'linear': MATLAB mencari dua tetangga x_i <= q < x_i+1, lalu mengambil nilai berbobot di antara keduanya — rumus polosnya p = y_i + (q - x_i)*(y_i+1 - y_i)/(x_i+1 - x_i). Untuk query pada jam 2.5, tetangganya adalah jam 2 (24.8 derajat) dan jam 3 (26.5 derajat), sehingga hasilnya 24.8 + 0.5*(26.5 - 24.8) = 25.65.
jam = [0 1 2 3 4 5];
suhu = [22.0 23.1 24.8 26.5 26.1 25.0];
fprintf('linear : suhu(2.5) = %.4f\n', interp1(jam, suhu, 2.5));Output yang Dihasilkan:
linear : suhu(2.5) = 25.6500Mari kita bedah baris-baris kode di atas:
- Baris 1 (
jam = ...): vektor waktu pengukuran dalam jam; elemen harus terurut naik agar pencarian tetangga berjalan benar. - Baris 2 (
suhu = ...): nilai pengukuran yang panjangnya sama denganjam— pasangan (jam, suhu) adalah titik data interpolasi. - Baris 3 (
fprintf(...)):interp1(jam, suhu, 2.5)mencari interval [2, 3], lalu mengembalikan nilai berbobot 25.65.
pchip dan spline: Interpolasi Kubik #
Interpolasi linear menghasilkan garis patah: kemiringan melompat di setiap titik data. Untuk data yang mencerminkan proses halus (posisi, suhu, konsentrasi), kita bisa menyambung titik dengan potongan kubik. Dua metode standar: 'pchip' (Piecewise Cubic Hermite) dan 'spline' (cubic spline).
Di balik layar, pchip menghitung kemiringan di tiap titik secara lokal, lalu menyambung setiap pasangan tetangga dengan polinomial kubik Hermite. Kemiringannya dibatasi sehingga kurva jarang melewati batas nilai data (anti-overshoot). Adapun spline membangun satu sistem persamaan tridiagonal untuk seluruh titik agar turunan kedua kontinu di setiap sambungan — hasilnya paling mulus, tetapi lonjakan di satu titik sedikit menjalar ke kurva sekitarnya.
fprintf('linear : suhu(2.5) = %.4f\n', interp1(jam, suhu, 2.5));
fprintf('pchip : suhu(2.5) = %.4f\n', interp1(jam, suhu, 2.5, 'pchip'));
fprintf('spline : suhu(2.5) = %.4f\n', interp1(jam, suhu, 2.5, 'spline'));Output yang Dihasilkan:
linear : suhu(2.5) = 25.6500
pchip : suhu(2.5) = 25.8625
spline : suhu(2.5) = 25.8062Ketiga metode berbeda karena bentuk kurva di antara titik tidak diketahui — interpolasi hanya menduga. Perbandingan praktisnya:
| Metode | Kekhalusan | Karakter dan biaya |
|---|---|---|
nearest | tangga | paling murah; tidak pernah overshoot |
linear | garis patah | murah; tidak overshoot; kemiringan melompat |
pchip | kubik lokal | biaya sedang; menjaga bentuk data, overshoot kecil |
spline | kubik global | paling halus (turunan kedua kontinu); bisa bergetar pada data loncat |
Ekstrapolasi: Nilai di Luar Rentang Data #
Interpolasi hanya berlaku di dalam rentang data. Jika query berada di luar rentang x — misalnya jam 6.5 padahal data berhenti di jam 5 — interp1 mengembalikan NaN secara default, bukan menebak. Opsi 'extrap' memaksa MATLAB melanjutkan rumus terakhir ke luar rentang, tetapi hasilnya murni dugaan tanpa jangkar data.
v = interp1(jam, suhu, 6.5); % default menghasilkan NaN
fprintf('isnan(suhu(6.5)) = %d\n', isnan(v));
fprintf('extrap : suhu(6.5) = %.4f\n', ...
interp1(jam, suhu, 6.5, 'linear', 'extrap'));Output yang Dihasilkan:
isnan(suhu(6.5)) = 1
extrap : suhu(6.5) = 23.3500interp2: Interpolasi Bilinear pada Grid 2D #
Data dua dimensi — elevasi tanah, peta suhu — hidup pada grid. Fungsi interp2(X, Y, Z, xq, yq) menerima grid Z beserta koordinatnya, lalu mengembalikan nilai pada titik query. Metode default 'linear' adalah bilinear: interpolasi dilakukan pada sumbu X, hasilnya diinterpolasi lagi pada sumbu Y — rata-rata berbobot dari empat tetangga grid.
xg = [10 20 30]; % koordinat X (km)
yg = [0; 10]; % koordinat Y (km)
Z = [100 110 125; 96 104 118]; % elevasi (meter)
fprintf('interp2: elevasi di (15, 5) = %.4f meter\n', ...
interp2(xg, yg, Z, 15, 5));Output yang Dihasilkan:
interp2: elevasi di (15, 5) = 102.5000 meterTitik (15, 5) berada di tengah empat simpul grid bernilai 100, 110, 96, dan 104, sehingga rata-rata berbobotnya (100 + 110 + 96 + 104)/4 = 102.5. Metode 'spline' juga tersedia pada interp2 untuk permukaan yang lebih halus.
Runge Phenomenon: Jebakan Polinomial Derajat Tinggi #
Intuisi pemula: supaya kurva makin akurat, pakai satu polinomial derajat tinggi yang melewati semua titik. Runge phenomenon membantah intuisi itu. Fungsi uji klasik f(x) = 1/(1 + 25x^2) pada rentang [-1, 1] diinterpolasi dengan 11 titik rata; polinomial derajat 10 yang melalui titik-titik tersebut bergetar hebat di dekat tepi rentang.
f = @(x) 1./(1 + 25*x.^2);
x11 = linspace(-1, 1, 11);
y11 = f(x11);
p10 = polyfit(x11, y11, 10); % polinomial interpolasi derajat 10
xd = linspace(-1, 1, 401);
fprintf('galat maks polinomial-10 = %.4f\n', ...
max(abs(polyval(p10, xd) - f(xd))));
fprintf('galat maks pchip = %.4f\n', ...
max(abs(interp1(x11, y11, xd, 'pchip') - f(xd))));
fprintf('galat maks spline = %.4f\n', ...
max(abs(interp1(x11, y11, xd, 'spline') - f(xd))));Output yang Dihasilkan:
galat maks polinomial-10 = 1.9156
galat maks pchip = 0.0178
galat maks spline = 0.0220Polinomial derajat 10 meleset hingga 1.92 di dekat tepi — padahal di 11 titik data galatnya nol persis. Potongan kubik pchip dan spline pada data yang sama meleset kurang dari 0.03.
Berkas contoh.m pada bagian bawah halaman memuat seluruh contoh chapter ini: interpolasi tiga metode, uji NaN dan 'extrap', demo Runge, serta interpolasi bilinear 2D.
Ringkasan #
interp1(x, y, q) mengembalikan nilai antar titik data: 'linear' murah dan aman, 'pchip' kubik lokal penjaga bentuk, 'spline' kubik global paling halus. Query di luar rentang menghasilkan NaN kecuali opsi 'extrap' dinyalakan — gunakan dengan hati-hati. interp2 melakukan interpolasi bilinear pada grid dua dimensi. Satu polinomial derajat tinggi adalah jebakan Runge: galat tepi meledak meskipun kurva melewati semua titik data.