Berapa populasi bakteri dua jam lagi? Kapan cadangan persediaan habis? Pertanyaan begini tidak dijawab oleh sintaks MATLAB, melainkan oleh model — persamaan yang kita susun dari pemahaman tentang masalahnya. Pemodelan matematika adalah jembatan antara dunia nyata dan komputer: kita menyederhanakan masalah lewat asumsi, memilih variabel yang relevan, menuliskan persamaannya, menyelesaikannya, lalu menguji hasilnya terhadap data. Chapter ini mempraktikkan siklus tersebut tuntas pada satu studi kasus: pertumbuhan koloni bakteri dari data laboratorium, dari tabel angka mentah sampai prediksi dan diagnosis kegagalan model.

  • Siklus pemodelan: masalah nyata → asumsi → variabel → persamaan → solusi → validasi
  • Linearisasi data eksponensial dengan log dan polyfit
  • Prediksi, residu, dan galat relatif model
  • Gejala overfitting dan batas validitas model

Siklus Pemodelan Matematika #

Aturan mainnya: model bukan kebenaran, melainkan persamaan yang cukup benar untuk tujuan tertentu. Pemodelan selalu bergerak dalam siklus, bukan garis lurus — solusi yang gagal divalidasi mengirim kita kembali ke meja asumsi.

Diagram di atas dibaca dari kiri ke kanan: (1) kita rumuskan masalah nyata secara terukur, (2) kita buang detail yang tidak memengaruhi jawaban, (3) kita tetapkan variabel bebas, variabel terikat, dan parameter, (4) kita terjemahkan hubungan antarvariabel menjadi persamaan, (5) kita selesaikan — analitik bila bisa, numerik bila tidak, (6) kita bandingkan solusi dengan data; jika meleset, panah balik mengirim kita ke langkah asumsi. Mekanisme inilah yang membuat pemodelan jadi prosedur yang bisa diaudit, bukan tebakan.

Studi Kasus: Pertumbuhan Bakteri #

Teknisi laboratorium menghitung koloni bakteri setiap dua jam dan menyerahkan tabel berikut (data fiktif, satuan ribu sel):

Jam ke-0246810
Populasi (ribu)10.015.221.833.548.974.4

Dua kandidat model standar untuk pertumbuhan populasi: eksponensial N(t) = N0*exp(k*t) (sumber makanan tak terbatas) dan logistik (populasi menekan pertumbuhannya sendiri). Data 10 jam pertama masih jauh dari kejenuhan, jadi kita mulai dari model eksponensial. Masalahnya, exp tidak bisa di-fit langsung dengan regresi linear. Triknya adalah linearisasi: ambil logaritma natural kedua ruas sehingga log(N) = log(N0) + k*t — garis lurus terhadap t dengan intercept log(N0) dan slope k.

matlab
jam      = [0 2 4 6 8 10];               % waktu pengamatan (jam)
populasi = [10.0 15.2 21.8 33.5 48.9 74.4];  % populasi (ribu sel)

% model eksponensial N(t) = N0*exp(k*t)  ->  log(N) = log(N0) + k*t
p  = polyfit(jam, log(populasi), 1);     % garis lurus di ruang log
k  = p(1);                               % slope = laju pertumbuhan
N0 = exp(p(2));                          % intercept kembali ke skala asli
fprintf('model          : N(t) = %.4f * exp(%.6f * t)\n', N0, k);
fprintf('waktu ganda    : %.4f jam\n', log(2)/k);

Output yang Dihasilkan:

text
model          : N(t) = 10.0236 * exp(0.199563 * t)
waktu ganda    : 3.4733 jam

Mari kita bedah baris-baris kode di atas:

  1. Baris 1-2 (jam, populasi): data mentah masuk sebagai vektor baris sepanjang enam — data eksperimen di MATLAB selalu berbentuk array.
  2. Baris 4 (komentar linearisasi): rumus transformasi ditulis eksplisit di komentar — pembaca skrip melihat jembatan exp → garis lurus tanpa menebak.
  3. Baris 5 (polyfit(..., 1)): polyfit mencari koefisien polinom derajat 1 (garis) yang meminimalkan jumlah kuadrat residu — least squares — terhadap log(populasi).
  4. Baris 6-7 (k, N0): slope p(1) langsung menjadi laju k; intercept p(2) harus di-exp-kan kembali karena tadi kita bekerja di ruang log.
  5. Baris 8-9 (fprintf): log(2)/k menghitung waktu ganda populasi — turunan langsung dari model, bukan dari data.

Hasilnya terbaca sebagai model: populasi berlipat dua setiap 3.47 jam, dimulai dari 10.02 ribu sel — nyaris sama dengan pengamatan pertama yang bernilai 10.0.

Prediksi dan Galat terhadap Data #

Langkah validasi: prediksi model dievaluasi pada titik-titik yang sama dengan data, lalu residunya dihitung.

matlab
pred = N0 * exp(k*jam);
fprintf('%4s %10s %10s %10s\n', 't', 'data', 'model', 'residu');
for i = 1:numel(jam)
    fprintf('%4d %10.2f %10.2f %+10.3f\n', jam(i), populasi(i), ...
            pred(i), populasi(i) - pred(i));
end
galatRel = mean(abs(populasi - pred) ./ populasi) * 100;
fprintf('galat relatif rata-rata = %.2f persen\n', galatRel);
fprintf('prediksi t=12 jam       = %.2f ribu sel\n', N0*exp(k*12));

Output yang Dihasilkan:

text
   t       data      model     residu
   0      10.00      10.02     -0.024
   2      15.20      14.94     +0.260
   4      21.80      22.27     -0.469
   6      33.50      33.19     +0.307
   8      48.90      49.47     -0.574
  10      74.40      73.74     +0.658
galat relatif rata-rata = 1.18 persen
prediksi t=12 jam       = 109.91 ribu sel

Residu bergantian tanda dan tidak menunjukkan pola sistematik — itu tanda derau pengukuran acak, bukan model yang salah bentuk. Galat relatif rata-rata 1.18 persen cukup untuk memakai model ini sebagai alat prediksi jangka pendek.

Overfitting: Ketika Model Terlalu Patuh pada Data #

Polinom derajat 5 punya enam koefisien bebas — tepat sama dengan jumlah titik data. Polinom semacam itu bisa melewati keenam titik persis, residu nol. Apakah model itu lebih baik? Kita uji lewat ekstrapolasi:

matlab
q = polyfit(jam, populasi, 5);
fprintf('overfit derajat 5, t=12 = %.2f ribu sel\n', polyval(q, 12));
fprintf('overfit derajat 5, t=20 = %.2f ribu sel\n', polyval(q, 20));
fprintf('eksponensial,      t=20 = %.2f ribu sel\n', N0*exp(k*20));

Output yang Dihasilkan:

text
overfit derajat 5, t=12 = 137.10 ribu sel
overfit derajat 5, t=20 = 2748.80 ribu sel
eksponensial,      t=20 = 542.51 ribu sel

Polinom derajat 5 memperkirakan 2748.80 ribu sel pada jam ke-20 — lima kali lipat prediksi eksponensial. Mekanisme kegagalannya: polinom derajat tinggi melengkung liar di luar rentang data karena koefisiennya disetel untuk menghapus derau, bukan untuk menangkap mekanisme pertumbuhan.

Batas Validitas dan Asumsi Eksplisit #

Model eksponensial kita berdiri di atas asumsi: sumber makanan tak terbatas, tidak ada kematian, suhu konstan. Semakin lama simulasi berjalan, semakin jauh realitas berpisah dari asumsi itu — pada jam ke-20 model menjanjikan 542.51 ribu sel, sementara cawan laboratorium pasti jenuh jauh sebelum itu. Di titik itulah model logistik dN/dt = r*N*(1 - N/K) mengambil alih: parameter K (kapasitas lingkungan) memaksa pertumbuhan melambat saat populasi menembusnya — dan menghentikan ledakan palsu.

Asumsi model eksponensialKonsekuensiBatas praktis
Nutrisi tak terbatasN tumbuh tanpa hentivalid hanya saat N << K
Tidak ada kematian sellaju k murni kelahirantidak berlaku untuk kultur tua
Lingkungan konstank, N0 tetaprusak bila suhu berubah

Berkas contoh.m pada bagian bawah halaman menjalankan seluruh alur — linearisasi, fit, tabel residu, uji overfitting, dan plot perbandingan kedua model — dalam satu script utuh.

Ringkasan #

Pemodelan bergerak dalam siklus: masalah nyata, asumsi, variabel, persamaan, solusi, validasi, lalu kembali ke asumsi bila meleset. Studi kasus bakteri menunjukkan linearisasi log mengubah model eksponensial menjadi garis yang bisa di-fit polyfit, menghasilkan N(t) = 10.0236*exp(0.199563*t) dengan galat relatif 1.18 persen. Polinom derajat 5 yang menempel sempurna pada data justru menghasilkan ekstrapolasi kacau (2748.80 vs 542.51 ribu sel) — bukti bahwa overfitting adalah musuh prediksi. Terakhir, setiap model membawa asumsi yang menentukan batas validitasnya; di luar batas itu, ganti modelnya, bukan panjangkan waktunya.