Interpolasi memaksa kurva menembus setiap titik data — sifat yang justru merugikan ketika data mengandung noise pengukuran. Bola dijatuhkan dan posisinya direkam tiap setengah detik; hasil rekaman tidak akan pernah membentuk parabola sempurna karena keterbatasan alat. Curve fitting mengikuti filosofi berbeda: kurva tidak harus menyentuh data, kurva cukup menangkap pola di balik data. MATLAB menyediakan polyfit dan polyval untuk fitting polinomial least squares — kombinasi yang menjadi standar kalibrasi sensor di industri.

Least Squares: Meminimalkan Kuadrat Residu #

Aturannya: pilih parameter model yang meminimalkan jumlah kuadrat residu. Residu adalah selisih data dengan model, r_i = y_i - p(x_i); fungsi tujuannya J = r_1^2 + r_2^2 + … + r_n^2. Kuadrat membuat semua residu berkontribusi positif dan menghukum penyimpangan besar lebih keras daripada penyimpangan kecil.

Di balik layar, meminimalkan J terhadap koefisien polinomial menghasilkan sistem persamaan linear yang disebut normal equations. Fungsi polyfit menyelesaikan sistem tersebut lewat dekomposisi QR — jalur yang lebih stabil secara numerik daripada menghitung normal equations secara langsung. Kita cukup memanggil polyfit(x, y, derajat); koefisien dikembalikan urut dari pangkat tertinggi ke konstanta, siap dievaluasi dengan polyval.

polyfit dan polyval dalam Aksi #

Studi kasus: jatuh bebas. Fisika memprediksi s = 0.5gt^2, jadi model polinomial derajat 2 adalah kandidat alami. Data pengukuran tujuh titik difit, lalu koefisien tertinggi dibaca sebagai 0.5*g:

matlab
t = [0 0.5 1.0 1.5 2.0 2.5 3.0];
s = [0.11 1.32 4.88 10.95 19.52 30.28 44.02];
p2 = polyfit(t, s, 2);
fprintf('koefisien p2    : a = %.6f, b = %.6f, c = %.6f\n', ...
        p2(1), p2(2), p2(3));
fprintf('estimasi g = 2a : %.4f m/s^2\n', 2*p2(1));
fprintf('prediksi s(3.5) : %.4f meter\n', polyval(p2, 3.5));

Output yang Dihasilkan:

text
koefisien p2    : a = 4.935714, b = -0.215000, c = 0.150000
estimasi g = 2a : 9.8714 m/s^2
prediksi s(3.5) : 59.8600 meter

Mari kita bedah baris-baris kode di atas:

  1. Baris 3 (p2 = polyfit(t, s, 2)): mencari koefisien polinomial derajat 2, s ≈ at^2 + bt + c, yang meminimalkan jumlah kuadrat residu.
  2. Baris 4-5 (fprintf koefisien): p2(1) adalah koefisien pangkat tertinggi (a), p2(3) konstanta (c) — urutan pangkat menurun.
  3. Baris 6 (2*p2(1)): karena a = 0.5*g, gravitasi diperkirakan 2a = 9.87 m/s^2, meleset sekitar 0.6% dari nilai acuan 9.81 — masuk akal untuk data ber-noise.
  4. Baris 7 (polyval(p2, 3.5)): mengevaluasi model pada waktu baru 3.5 detik; prediksi berada sedikit di luar rentang data, tetapi model parabola punya justifikasi fisika.

Memilih Derajat: Underfit, Pas, Overfit #

Derajat polinomial menentukan kapasitas model menekuk. Derajat terlalu rendah menghasilkan underfit: model terlalu kaku untuk menangkap lengkungan data. Derajat berlebihan menghasilkan overfit: model menghafal noise dan bergetar liar di antara titik. Kandidat derajat diuji pada data jatuh bebas di atas:

matlab
SST = sum((s - mean(s)).^2);
for derajat = [1 2 3]
    p = polyfit(t, s, derajat);
    r = s - polyval(p, t);
    R2 = 1 - sum(r.^2)/SST;
    fprintf('derajat %d: SSE = %8.4f, R2 = %.6f, residu maks = %.4f\n', ...
            derajat, sum(r.^2), R2, max(abs(r)));
end

Output yang Dihasilkan:

text
derajat 1: SSE = 127.9453, R2 = 0.920946, residu maks = 6.2632
derajat 2: SSE =   0.0486, R2 = 0.999970, residu maks = 0.1807
derajat 3: SSE =   0.0325, R2 = 0.999980, residu maks = 0.1290

Garis lurus (derajat 1) jelas underfit: residu mencapai 6.3 meter. Derajat 2 membaik ribuan kali lipat. Derajat 3 hanya memperbaiki sedikit — peningkatan marginal semacam itu adalah sinyal untuk berhenti menaikkan derajat.

Overfit paling dramatis terlihat pada 10 titik data ber-noise yang difit dengan derajat 9 — jumlah titik tepat cukup untuk polinomial yang menembus semua data:

matlab
x = 0:9;
y = 0.5*x.^2 + 0.3*x + [0.05 -0.08 0.06 -0.05 0.09 -0.04 0.07 -0.06 0.04 -0.08];
p9  = polyfit(x, y, 9);                  % melewati semua titik data
xd  = 0:0.25:9;
model = 0.5*xd.^2 + 0.3*xd;              % kurva sebenarnya
fprintf('derajat 9: residu maks di titik data = %.2e\n', ...
        max(abs(y - polyval(p9, x))));
fprintf('derajat 9: galat maks antar titik    = %.4f\n', ...
        max(abs(polyval(p9, xd) - model)));

Output yang Dihasilkan:

text
derajat 9: residu maks di titik data = 7.26e-11
derajat 9: galat maks antar titik    = 1.0498

Model derajat 9 nyaris sempurna di titik data (residu 7e-11), tetapi di antara titik kurvanya meleset 1.05 dari kurva sebenarnya — dua puluh kali lipat amplitudo noise. Kurva menghafal noise, bukan pola.

Analisis Residu dan R^2 #

Kualitas fit diukur dua cara. Pertama, R^2 = 1 - SSE/SST, dengan SSE jumlah kuadrat residu dan SST variasi total data; nilai 1 berarti model menjelaskan seluruh variasi. Kedua — dan lebih penting — pola residu: residu yang sehat tersebar acak di sekitar nol tanpa bentuk melengkung. Residu yang melengkung sistematis menandakan model kurang derajat; residu yang membesar di ujung menandakan model tidak cocok untuk ekstrapolasi.

Perlu dicatat: R^2 selalu naik ketika derajat ditambah — bahkan noise murni sekalipun “dijelaskan” oleh polinomial derajat n-1. Karena itu R^2 bukan satu-satunya hakim; gunakan bersama analisis residu dan penalaran jumlah parameter versus jumlah data.

Fit Nonlinear dan Curve Fitting Toolbox #

Tidak semua kurva adalah polinomial. Pertumbuhan eksponensial N = Ae^(kt) dapat dilinierkan: polyfit(t, log(N), 1) menghasilkan slope k — trik yang kita pakai penuh pada chapter Memilih Metode Numerik. Untuk model yang tidak bisa dilinierkan, MATLAB menyediakan Curve Fitting Toolbox: fungsi fit(x, y, 'poly2') mengembalikan objek kurva lengkap dengan statistik goodness-of-fit, dan fittype mendefinisikan model kustom; lsqcurvefit pada Optimization Toolbox menyelesaikan least squares nonlinear langsung pada parameter aslinya.

Ringkasan #

polyfit(x, y, derajat) memfit polinomial least squares dan polyval(p, x) mengevaluasinya; koefisien terurut pangkat menurun. Derajat dipilih lewat keseimbangan: underfit meninggalkan pola, overfit menghafal noise — residu maksimum yang jauh lebih besar di antara titik daripada di titik data adalah gejala overfit klasik. R^2 = 1 - SSE/SST membandingkan model dengan variasi data, tetapi naik terus bersama derajat, jadi pasangkan dengan analisis pola residu. Model nonlinear dilinierkan dengan transformasi log atau diserahkan pada fminsearch dan fungsi toolbox MATLAB.