Tidak semua pengulangan jumlahnya diketahui di depan. Sebuah algoritma numerik berhenti ketika hasilnya “cukup dekat” dengan jawaban, bukan setelah 10 atau 1000 iterasi; program berhenti menghitung ketika sisa langkahnya habis. Untuk keadaan semacam itu, MATLAB menyediakan while — loop yang berjalan selama sebuah kondisi bernilai true dan berhenti begitu kondisi itu bernilai false. Chapter ini membahas sintaksnya, tanda bahaya infinite loop, dua pola yang paling sering dipakai (konvergensi dan bisection), serta cara mensimulasikan do-while yang tidak tersedia di MATLAB.

Sintaks while dan Counter Manual #

Aturan sintaksnya: while kondisi ... end, ditutup keyword end seperti semua blok MATLAB. Mekanisme di balik layar: sebelum setiap iterasi, evaluator menghitung ulang kondisi. Bila hasilnya true, badan loop dijalankan satu putaran; bila false, MATLAB melompat ke pernyataan setelah end. Karena for sendiri sudah menangani kasus jumlah iterasi diketahui, while paling alami dipakai ketika kondisi berhenti berbentuk pertanyaan — “masih belum cukup akurat?”, “data masih tersisa?”.

Bentuk paling sederhana adalah counter manual — kita mengelola variabel hitungan sendiri karena while tidak punya variabel loop bawaan:

matlab
k = 1;
while k <= 5
    fprintf('iterasi ke-%d\n', k);
    k = k + 1;
end

Output yang Dihasilkan:

text
iterasi ke-1
iterasi ke-2
iterasi ke-3
iterasi ke-4
iterasi ke-5

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (k = 1): variabel counter diinisialisasi sebelum loop — tanpa nilai awal, kondisi k <= 5 membandingkan variabel yang tidak ada dan program galat.
  2. Baris 2 (while k <= 5): kondisi diuji ulang sebelum tiap iterasi; iterasi pertama lolos karena 1 <= 5.
  3. Baris 4 (k = k + 1): counter maju satu langkah — baris inilah yang membuat loop bergerak menuju kondisi berhenti.
  4. Baris 5 (end): setelah k mencapai 6, pengujian berikutnya menghasilkan false dan eksekusi melompat ke sini.

Kondisi Berhenti Harus Berubah #

Hukum wajib while: setidaknya satu variabel di dalam kondisi harus berubah nilai oleh badan loop. Bila tidak, kondisi bernilai true selamanya dan program terjebak infinite loop — loop tanpa akhir yang menghabiskan CPU dan tidak pernah menampilkan hasil. Kesalahan klasiknya lupa k = k + 1, atau menulis pembaruan yang salah arah (k = k - 1 pada loop while k <= 5).

Pola Konvergensi: tol dan maxIter #

Dua penjaga wajib mengawal loop numerik yang sehat: toleransi (tol) sebagai target akurasi dan batas iterasi (maxIter) sebagai jaring pengaman bila konvergensi tidak pernah tercapai. Contoh berikut menjumlahkan deret 1/2^i sampai suku barunya lebih kecil dari toleransi:

matlab
tol = 1e-6;
total = 0;
suku = 1;
i = 1;
while abs(suku) >= tol
    suku = 1 / 2^i;
    total = total + suku;
    i = i + 1;
end
fprintf('total = %.7f setelah %d suku\n', total, i - 1);

Output yang Dihasilkan:

text
total = 0.9999990 setelah 20 suku

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (tol = 1e-6): toleransi 0.000001; suku yang lebih kecil dari ini dianggap tidak lagi berarti.
  2. Baris 2-4 (total, suku, i): akumulator, suku terakhir, dan nomor suku diinisialisasi sebelum loop.
  3. Baris 5 (while abs(suku) >= tol): loop berjalan selama suku yang baru ditambahkan masih sebesar toleransi atau lebih — abs() menjaga kebenaran untuk suku bertanda negatif.
  4. Baris 6-8: badan loop menghitung suku ke-i, menambahkannya ke total, lalu memajukan i; ketika 1/2^i < tol, kondisi berikut bernilai false dan loop berhenti dengan sendirinya.

Bisection: while di Praktik #

Metode bisection mencari akar persamaan dengan membelah interval dua bagian berulang kali, dan berhenti saat interval sudah cukup sempit — contoh nyata loop yang jumlah iterasinya tidak diketahui di depan. Program berikut mencari akar x^2 - 2 = 0 (yakni √2) pada interval [1, 2]:

matlab
a = 1;
b = 2;
tol = 1e-6;
maxIter = 100;
iter = 0;
while (b - a) > tol && iter < maxIter
    c = (a + b) / 2;
    if (c^2 - 2) * (a^2 - 2) < 0
        b = c;   % akar ada di setengah kiri
    else
        a = c;   % akar ada di setengah kanan
    end
    iter = iter + 1;
end
fprintf('akar ~ %.6f setelah %d iterasi\n', (a + b) / 2, iter);

Output yang Dihasilkan:

text
akar ~ 1.414214 setelah 20 iterasi

Mari kita bedah baris-baris kode di atas:

  1. Baris 1-2 (a = 1; b = 2): batas interval awal; tanda f(a) dan f(b) berlawanan, menjamin akar berada di antara keduanya.
  2. Baris 6 (while (b - a) > tol && iter < maxIter): dua syarat berpasangan — interval masih lebih lebar dari toleransi dan iterasi belum menyentuh batas; maxIter mencegah infinite loop bila logika pemilihan interval keliru.
  3. Baris 7 (c = (a + b) / 2): titik tengah interval sebagai kandidat akar baru.
  4. Baris 8-11 (if ... b = c ... else a = c): hasil kali dua nilai fungsi negatif berarti tanda berlawanan — akar dipastikan di setengah kiri, jadi batas b ditarik ke c; sebaliknya batas a yang ditarik. Ukuran interval selalu terpangkas separuh.
  5. Baris 15 (fprintf ...): titik tengah interval akhir dilaporkan sebagai hampiran akar — 1.414214, sangat dekat dengan √2 ≈ 1.4142136.

do-while Tidak Ada: Pola while true #

Beberapa bahasa menyediakan do-while — loop yang menguji kondisi setelah badan dijalankan, sehingga minimal satu iterasi selalu terjadi. MATLAB tidak punya konstruksi itu. Kita mensimulasikannya dengan while true (kondisi selalu benar) dan break di dalam badan loop:

matlab
kapasitas = 1;
while true
    kapasitas = kapasitas * 2;
    if kapasitas >= 100
        break;   % keluar dari loop yang sengaja tanpa batas
    end
end
fprintf('kapasitas = %d\n', kapasitas);

Output yang Dihasilkan:

text
kapasitas = 128

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 (while true): kondisi true membuat loop berjalan tanpa akhir secara sengaja — keberhentian diserahkan ke break.
  2. Baris 3-4 (kapasitas = kapasitas * 2; if ...): badan loop dieksekusi dulu, kondisi kapasitas >= 100 baru diuji setelahnya — persis semantik do-while.
  3. Baris 5 (break): keluar seketika dari loop saat syarat terpenuhi; tanpa break, pola ini menjadi infinite loop sungguhan. Kita bedah break lebih lanjut pada Chapter break dan continue.

Berkas contoh.m pada bagian bawah halaman menjalankan keempat pola di atas — counter, konvergensi deret, bisection, dan simulasi do-while — dalam satu script utuh.

Ringkasan #

while menguji kondisi sebelum setiap iterasi dan berhenti begitu kondisi bernilai false. Badan loop wajib mengubah minimal satu variabel kondisi; kalau tidak, program terjebak infinite loop yang hanya bisa dihentikan dengan Ctrl+C. Loop numerik yang sehat menggandeng toleransi dengan batas iterasi, seperti deret konvergen dan bisection yang kita praktikkan. Untuk semantik do-while, gunakan pola while true + break karena MATLAB tidak menyediakan konstruksi bawaannya.