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:
k = 1;
while k <= 5
fprintf('iterasi ke-%d\n', k);
k = k + 1;
endOutput yang Dihasilkan:
iterasi ke-1
iterasi ke-2
iterasi ke-3
iterasi ke-4
iterasi ke-5Mari kita bedah baris-baris kode di atas:
- Baris 1 (
k = 1): variabel counter diinisialisasi sebelum loop — tanpa nilai awal, kondisik <= 5membandingkan variabel yang tidak ada dan program galat. - Baris 2 (
while k <= 5): kondisi diuji ulang sebelum tiap iterasi; iterasi pertama lolos karena 1 <= 5. - Baris 4 (
k = k + 1): counter maju satu langkah — baris inilah yang membuat loop bergerak menuju kondisi berhenti. - Baris 5 (
end): setelahkmencapai 6, pengujian berikutnya menghasilkanfalsedan 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:
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:
total = 0.9999990 setelah 20 sukuMari kita bedah baris-baris kode di atas:
- Baris 1 (
tol = 1e-6): toleransi 0.000001; suku yang lebih kecil dari ini dianggap tidak lagi berarti. - Baris 2-4 (
total,suku,i): akumulator, suku terakhir, dan nomor suku diinisialisasi sebelum loop. - 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. - Baris 6-8: badan loop menghitung suku ke-i, menambahkannya ke total, lalu memajukan
i; ketika1/2^i < tol, kondisi berikut bernilaifalsedan 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]:
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:
akar ~ 1.414214 setelah 20 iterasiMari kita bedah baris-baris kode di atas:
- Baris 1-2 (
a = 1; b = 2): batas interval awal; tandaf(a)danf(b)berlawanan, menjamin akar berada di antara keduanya. - Baris 6 (
while (b - a) > tol && iter < maxIter): dua syarat berpasangan — interval masih lebih lebar dari toleransi dan iterasi belum menyentuh batas;maxItermencegah infinite loop bila logika pemilihan interval keliru. - Baris 7 (
c = (a + b) / 2): titik tengah interval sebagai kandidat akar baru. - Baris 8-11 (
if ... b = c ... else a = c): hasil kali dua nilai fungsi negatif berarti tanda berlawanan — akar dipastikan di setengah kiri, jadi batasbditarik kec; sebaliknya batasayang ditarik. Ukuran interval selalu terpangkas separuh. - 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:
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:
kapasitas = 128Mari kita bedah baris-baris kode di atas:
- Baris 2 (
while true): kondisitruemembuat loop berjalan tanpa akhir secara sengaja — keberhentian diserahkan kebreak. - Baris 3-4 (
kapasitas = kapasitas * 2; if ...): badan loop dieksekusi dulu, kondisikapasitas >= 100baru diuji setelahnya — persis semantikdo-while. - Baris 5 (
break): keluar seketika dari loop saat syarat terpenuhi; tanpabreak, pola ini menjadi infinite loop sungguhan. Kita bedahbreaklebih 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.