Konsep Fungsi

Fungsi sebagai mesin masukan-keluaran beserta domain dan daerah hasilnya.

Daftar isi

Topik ini membahas fungsi sebagai aturan pemetaan satu masukan ke tepat satu keluaran, beserta domain dan daerah hasilnya. Notasi f(x) f(x) diperkenalkan terlebih dahulu, lalu setiap rumus diverifikasi dengan NumPy, dan demo interaktif menunjukkan perilaku domain pada kasus akar kuadrat. Setelah membaca, fungsi dapat dinyatakan dalam notasi yang benar dan dievaluasi dalam kode dengan domain yang terjaga.

Fungsi sebagai aturan masukan-keluaran#

Fungsi (function) adalah aturan yang memetakan setiap masukan dari satu himpunan ke tepat satu keluaran. Masukan diletakkan di dalam kurung setelah nama fungsi, sedangkan hasilnya disebut nilai fungsi. Notasi f(x) f(x) dibaca “f dari x”, dan f(x)=2x+1 f(x) = 2x + 1 berarti fungsi bernama f f mengalikan masukan dengan dua lalu menambahkan satu. Nilainya dihitung dengan mengganti x x dengan angka tertentu, sehingga f(−1)=−1 f(-1) = -1 dan f(3)=7 f(3) = 7 .

Kondisi satu keluaran per masukan menjadi pembeda antara fungsi dan relasi biasa. Relasi x↦±x x \mapsto \pm\sqrt{x} memetakan 4 ke dua nilai sekaligus, yaitu 2 dan −2 -2 , sehingga relasi itu bukan fungsi. Sebaliknya, f(x)=x2 f(x) = x^2 sah sebagai fungsi meskipun dua masukan berbeda dapat menghasilkan keluaran yang sama, karena yang dituntut hanyalah keunikan arah dari masukan ke keluaran. Pada grafik, kondisi ini diperiksa dengan uji garis vertikal (vertical line test), yaitu setiap garis vertikal memotong grafik paling banyak satu kali.

Gambar berikut memproyeksikan dua masukan pada sumbu horizontal ke nilai fungsinya pada sumbu vertikal. Setiap x x pada domain memiliki tepat satu pasangan (x,f(x)) (x, f(x)) . Contoh berikut menggambar grafik itu dengan matplotlib untuk dua masukan pilihan, lalu menyimpannya sebagai berkas SVG.

python Contoh: menggambar pemetaan masukan-keluaran
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3.0, 3.0, 100)
y = 2.0 * x + 1.0

fig, ax = plt.subplots(figsize=(6, 3))
ax.plot(x, y, color="#1a5fb4", label="f(x) = 2x + 1")
for xi in (-1.0, 3.0):
    yi = 2.0 * xi + 1.0
    ax.plot([xi, xi], [0.0, yi], linestyle="--", color="#77767b", linewidth=1)
    ax.plot([0.0, xi], [yi, yi], linestyle="--", color="#77767b", linewidth=1)
    ax.plot([xi], [yi], "o", color="#c01c28", markersize=5)
ax.axhline(0.0, color="#000000", linewidth=0.8)
ax.axvline(0.0, color="#000000", linewidth=0.8)
ax.set_xlabel("x (masukan)")
ax.set_ylabel("f(x) (keluaran)")
ax.set_title("Pemetaan masukan ke keluaran pada f(x) = 2x + 1")
ax.legend(loc="upper left")
fig.savefig("pemetaan-fungsi.svg")
Proyeksi dua masukan ke nilai fungsinya pada garis lurus menaik

Domain dan daerah hasil#

Daerah asal atau domain adalah himpunan semua masukan yang diperbolehkan, sedangkan daerah hasil atau range adalah himpunan semua keluaran yang mungkin terjadi. Domain dibaca langsung dari rumusnya, yaitu pembagian menuntut penyebut bukan nol, akar kuadrat menuntut isi yang tidak negatif, dan logaritma menuntut isi positif. Daerah hasil ditentukan dengan memvariasikan x x pada seluruh domainnya, lalu menghimpun keluaran yang muncul. Untuk fungsi akar kuadrat, keduanya dinyatakan sebagai

f(x)=x,Df={x∈R:x≥0}. f(x) = \sqrt{x}, \qquad D_f = \{x \in \mathbb{R} : x \ge 0\}.

Tabel berikut merangkum beberapa contoh yang sering ditemui.

FungsiDomainDaerah hasil
f(x)=2x+1 f(x) = 2x + 1 semua bilangan realsemua bilangan real
f(x)=x2 f(x) = x^2 semua bilangan real[0,∞) [0, \infty)
f(x)=x f(x) = \sqrt{x} [0,∞) [0, \infty) [0,∞) [0, \infty)
f(x)=1x f(x) = \frac{1}{x} x≠0 x \neq 0 y≠0 y \neq 0

Domain bukan sekadar formalitas, karena pada kode domain muncul sebagai batasan masukan yang harus divalidasi. Fungsi konversi satuan menerima bilangan apa pun, sedangkan fungsi pembagian tarif per jam perlu menolak nilai nol pada penyebutnya. Menyebutkan domain sejak awal mencegah kekeliruan ketika fungsi dipanggil dengan masukan di luar dugaan.

Mengevaluasi fungsi dengan NumPy#

NumPy mengevaluasi fungsi pada seluruh array sekaligus. Pola ini disebut evaluasi tervektorisasi (vectorized evaluation), yakni operasi matematika diterapkan pada setiap elemen array tanpa perulangan eksplisit. Evaluasi tervektorisasi cocok dengan gagasan fungsi matematika, karena satu aturan diterapkan seragam pada banyak masukan. Berkas berikut mendefinisikan fungsi konversi suhu, mengevaluasinya untuk satu masukan dan untuk satu array, lalu menguji domain akar kuadrat.

python evaluasi_fungsi.py
import numpy as np


def celsius_ke_fahrenheit(c):
    """Konversi suhu: setiap masukan Celsius dipetakan ke satu keluaran Fahrenheit."""
    return 9.0 * c / 5.0 + 32.0


# evaluasi untuk satu masukan
print("20 C menjadi", celsius_ke_fahrenheit(20.0), "F")

# evaluasi untuk banyak masukan sekaligus dengan array NumPy
c = np.array([0.0, 10.0, 20.0, 30.0, 40.0])
print("masukan  :", c)
print("keluaran :", celsius_ke_fahrenheit(c))

# akar kuadrat hanya terdefinisi untuk masukan nonnegatif
x = np.array([1.0, 4.0, 9.0])
print("sqrt(x)  :", np.sqrt(x))
text Keluaran
20 C menjadi 68.0 F
masukan  : [ 0. 10. 20. 30. 40.]
keluaran : [ 32.  50.  68.  86. 104.]
sqrt(x)  : [1. 2. 3.]

Baris keluaran pertama memeriksa rumus pada satu masukan, yaitu 20 C menjadi 68 F, dan nilainya dapat dihitung ulang secara manual. Dua baris berikutnya memperlihatkan pemetaan satu lawan satu, karena keluaran pada posisi kesekian selalu berasal dari masukan pada posisi yang sama. Baris terakhir menegaskan bahwa akar kuadrat hanya dievaluasi pada masukan yang tidak negatif karena domainnya memang terbatas.

Demo interaktif: mesin fungsi#

Demo berikut meniru mesin masukan-keluaran. Isi nilai x x , pilih salah satu fungsi, lalu tekan tombol Hitung. Fungsi 2x 2x dan x2 x^2 menerima masukan apa pun, sedangkan x \sqrt{x} menampilkan pesan domain ketika masukannya negatif. Jalankan demo, coba masukan −4 -4 pada ketiga fungsi, lalu amati bahwa hanya fungsi akar kuadrat yang menolak masukan itu.

Keluaran tombol Hitung selalu satu bilangan untuk satu masukan, dan sifat itu persis sama dengan definisi fungsi pada bagian pertama. Pesan domain memperlihatkan cara domain ditegakkan dalam kode, yaitu masukan diperiksa terlebih dahulu sebelum fungsi dihitung. Pada program sungguhan, pemeriksaan semacam ini mencegah nilai nan maupun error menjalar ke perhitungan berikutnya. Uji pula dua masukan berbeda pada fungsi kuadrat, misalnya 3 dan -3, untuk melihat bahwa dua masukan berbeda menghasilkan keluaran yang sama, dan kejadian itu tetap sah menurut definisi fungsi. Skrip demo ini pendek karena definisi setiap fungsinya hanya satu baris, dan pola definisi itulah yang digunakan kembali pada evaluasi array NumPy.

Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Mesin fungsi</title>
<style>
  body { font-family: sans-serif; margin: 14px; color: #241f31; }
  .baris { margin: 10px 0; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  #masukan { width: 90px; padding: 4px 6px; }
  select, button { padding: 5px 10px; }
  button { cursor: pointer; }
  #hasil { margin-top: 10px; padding: 12px; border-radius: 6px; background: #f6f5f4;
           font-size: 1.05em; min-height: 1.2em; }
  #hasil.bebas { background: #e6f4ea; }
  #hasil.gagal { background: #fce8e6; }
</style>
</head>
<body>
  <div class="baris">
    <label for="masukan">Masukan x =</label>
    <input id="masukan" type="number" value="5" step="any">
    <select id="pilihan">
      <option value="dua">f(x) = 2x</option>
      <option value="kuadrat">f(x) = x&#178;</option>
      <option value="akar">f(x) = &#8730;x</option>
    </select>
    <button id="tombol" type="button">Hitung</button>
  </div>
  <div id="hasil">Tekan Hitung untuk mengevaluasi fungsi.</div>
<script>
  function evaluasi(jenis, x) {
    if (jenis === "dua") {
      return { ok: true, nilai: 2 * x };
    }
    if (jenis === "kuadrat") {
      return { ok: true, nilai: x * x };
    }
    if (jenis === "akar") {
      if (x < 0) {
        return { ok: false, pesan: "tidak terdefinisi, karena akar kuadrat memerlukan masukan nonnegatif" };
      }
      return { ok: true, nilai: Math.sqrt(x) };
    }
  }
  document.getElementById("tombol").addEventListener("click", function () {
    var x = parseFloat(document.getElementById("masukan").value);
    var jenis = document.getElementById("pilihan").value;
    var kotak = document.getElementById("hasil");
    if (isNaN(x)) {
      kotak.className = "gagal";
      kotak.textContent = "Masukan belum berupa angka.";
      return;
    }
    var r = evaluasi(jenis, x);
    if (r.ok) {
      kotak.className = "bebas";
      kotak.textContent = "f(" + x + ") = " + r.nilai;
    } else {
      kotak.className = "gagal";
      kotak.textContent = "f(" + x + ") " + r.pesan;
    }
  });
</script>
</body>
</html>

Di mana hal ini ditemui dalam kode#

Fungsi pemrograman mewarisi kontrak yang sama dengan fungsi matematika, yaitu masukan yang dinyatakan dan satu nilai kembalian. Tanda tangan fungsi (function signature) merupakan cara menulis domain dalam bentuk tipe data, misalnya parameter bertipe bilangan bulat positif pada fungsi penghitung luas persegi panjang. Fungsi murni (pure function) menegaskan kesetaraan itu lebih jauh, karena keluarannya hanya ditentukan oleh masukan tanpa efek samping. Titik akhir (endpoint) sebuah API juga bekerja dengan kontrak yang sama, yaitu permintaan menjadi masukan dan respons menjadi satu keluaran. Konvensi ini membuat fungsi dapat diuji dengan pasangan masukan-keluaran, sama seperti f(−1)=−1 f(-1) = -1 diverifikasi di atas.

Pada machine learning, fungsi aktivasi (activation function) adalah pemetaan dari satu bilangan ke satu bilangan, misalnya sigmoid yang memetakan setiap bilangan real ke rentang (0,1) (0, 1) . Domain dan daerah hasilnya menentukan apakah keluaran dapat digunakan sebagai probabilitas. Ketika fungsi digunakan di luar domainnya, baik nan maupun exception dapat muncul, dan keduanya merupakan kelalaian validasi masukan, bukan kesalahan rumusnya.

Ringkasan#

  • Fungsi memetakan setiap masukan ke tepat satu keluaran, dan notasi f(x) f(x) menyatakan nilai keluaran untuk masukan x x .
  • Domain menghimpun masukan yang sah, sedangkan daerah hasil menghimpun semua keluaran yang mungkin, dan keduanya dibaca dari rumus fungsi.
  • NumPy mengevaluasi fungsi pada seluruh array sekaligus, tetapi tidak melempar exception untuk masukan di luar domain, sehingga validasi masukan tetap diperlukan.

Referensi#