Membuat berkas kuadrat.m hanya demi satu baris y = x^2 + 1 terasa berlebihan, tetapi fungsi sependek itu justru sering kita butuhkan: sekadar membulatkan, mengalikan dengan konstanta, atau menyaring nilai. MATLAB menyediakan anonymous function — fungsi satu baris yang didefinisikan tanpa berkas, langsung di dalam ekspresi. Bentuknya singkat, tetapi dua perilakunya perlu dipahami betul: anonymous function adalah function handle, dan variabel luar yang dipakainya ditangkap sebagai nilai saat definisi. Cakupan chapter ini:
- sintaks
f = @(x) ekspresidengan nol, satu, atau beberapa input - mekanisme capture variabel luar saat fungsi dibuat
- pemakaian anonymous function sebagai argumen fungsi seperti
fzero
Anatomi @(input) ekspresi #
Aturannya: anonymous function ditulis nama = @(input) ekspresi — operator @ membuat function handle, kurung tepat setelah @ mendaftarkan input, dan ekspresi setelahnya adalah seluruh isi fungsi (boleh hanya satu pernyataan executable). Mekanisme di balik layar: @(x) x^2 + 1 membuat objek bertipe function_handle yang menyimpan daftar input dan ekspresinya; memanggil f(3) mengevaluasi ekspresi dengan x diikat ke 3 dan mengembalikan hasilnya. Jumlah input bebas — dari nol sampai banyak:
% satu input
f = @(x) x^2 + 1;
fprintf('f(3) = %d\n', f(3));
fprintf('f(-2) = %d\n', f(-2));
% dua input sekaligus
rata = @(a, b) (a + b) / 2;
fprintf('rata(8,3) = %.2f\n', rata(8, 3));
% nol input juga bisa
sapa = @() 'Halo dari anonymous function!';
disp(sapa());Output yang Dihasilkan:
f(3) = 10
f(-2) = 5
rata(8,3) = 5.50
Halo dari anonymous function!Mari kita bedah baris-baris kode di atas:
- Baris 2 (
f = @(x) x^2 + 1;):fmenjadi function handle dengan satu input; ekspresix^2 + 1adalah seluruh badan fungsi. - Baris 7 (
rata = @(a, b) (a + b) / 2;): dua input dipisah koma di dalam kurung@; ekspresi boleh memakai keduanya. - Baris 11 (
sapa = @() 'Halo...';): kurung kosong berarti tanpa input;sapa()selalu mengembalikan char yang sama.
Penangkapan Variabel: Nilai, Bukan Referensi #
Anonymous function boleh memakai variabel yang ada di workspace saat fungsi dibuat — perilaku ini disebut capture (atau closure). Aturan pentingnya: yang ditangkap adalah nilainya, bukan tautan ke variabelnya. Dokumentasi MATLAB menyatakannya gamblang: nilai-nilai itu tetap tersimpan di dalam handle walaupun variabel aslinya dihapus atau diubah setelahnya. Bukti kecil berikut mengubah k setelah g dibuat:
% variabel luar ditangkap SEBAGAI NILAI saat definisi (bukan referensi)
k = 2;
g = @(x) k * x;
k = 100;
fprintf('g(5) = %d (memakai k saat definisi, bukan k sekarang)\n', g(5));Output yang Dihasilkan:
g(5) = 10 (memakai k saat definisi, bukan k sekarang)g(5) menghasilkan 10, bukan 500 — g menyimpan salinan k = 2 dari detik definisinya, dan penugasan k = 100 tidak menyentuh salinan itu. Konsekuensinya praktis: untuk memberi anonymous function nilai baru, kita harus membuat handle baru, bukan mengubah variabel lamanya.
Anonymous Function sebagai Argumen #
Kekuatan utama anonymous function muncul saat ia dikirim sebagai input fungsi lain — banyak fungsi MATLAB menerima function handle untuk bisa bekerja atas rumus apa pun. Contoh klasiknya fzero(f, x0), fungsi bawaan yang mencari akar persamaan f(x) = 0 dimulai dari tebakan x0:
% anonymous function dikirim sebagai argumen fungsi lain
akar = fzero(@(x) x^3 - 2*x - 5, 2);
fprintf('akar = %.6f\n', akar);
% dipanggil per elemen lewat arrayfun
kuadrat = @(x) x.^2;
hasil = arrayfun(kuadrat, [1 2 3 4]);
fprintf('kuadrat : %d %d %d %d\n', hasil);Output yang Dihasilkan:
akar = 2.094551
kuadrat : 1 4 9 16Mari kita bedah baris-baris kode di atas:
- Baris 2 (
akar = fzero(@(x) x^3 - 2*x - 5, 2);): handle dibuat di tempat (temporary) sebagai argumen pertama;fzeromemanggilnya berulang kali dengan berbagai nilaixsampai akar2.094551ditemukan. - Baris 6 (
hasil = arrayfun(kuadrat, [1 2 3 4]);):arrayfun(f, v)memanggilfsekali per elemenvlalu mengumpulkan hasilnya — pola yang akrab dengan operator titik, tetapi bekerja untuk ekspresi apa pun.
Pola fzero(@(x) ..., x0) inilah alasan anonymous function jarang berdiri sendiri: fungsi numerik seperti fzero, integral, dan ode45, serta fungsi plot, semuanya meminta handle — dan rumus pendek paling natural ditulis langsung di posisi argumen.
Kapan Memakai Anonymous Function #
| Aspek | Anonymous function | Berkas fungsi |
|---|---|---|
| Panjang isi | satu ekspresi | tidak terbatas |
Berkas .m | tidak perlu | wajib, nama = nama fungsi |
| Variabel luar | ditangkap saat definisi | hanya lewat input |
| Cocok untuk | rumus pendek, argumen fzero/plot | logika banyak langkah |
help | tidak ada | ada (help text) |
Aturan praktis kita: bila fungsinya satu ekspresi dan hidupnya singkat, tulis anonymous; begitu butuh if, loop, atau lebih dari beberapa baris, pindahkan ke berkas fungsi. Kedua bentuk menghasilkan function handle yang bisa dipanggil dan dioper dengan cara sama — perbedaannya hanya tempat hidup definisinya. Berkas contoh.m di bagian bawah halaman menjalankan seluruh contoh chapter ini secara berurutan.
Ringkasan #
Anonymous function mendefinisikan fungsi satu ekspresi tanpa berkas: f = @(x) ekspresi membuat function handle yang dipanggil seperti fungsi biasa. Variabel workspace yang terlihat saat definisi ditangkap sebagai nilai — perubahan variabel setelahnya tidak memengaruhi handle, dan nilai baru menuntut handle baru. Karena ringkas dan lahir di dalam ekspresi, bentuk ini paling sering dipakai sebagai argumen fungsi numerik seperti fzero, integral, dan arrayfun. Untuk logika yang lebih panjang dari satu ekspresi, berkas fungsi tetap rumah yang tepat.