Fungsi multivariabel adalah fungsi yang menerima dua masukan atau lebih dan mengembalikan tepat satu nilai keluaran. Topik ini membahas notasi , permukaan tiga dimensi yang dihasilkannya, pembacaan peta kontur sebagai proyeksinya, serta evaluasi fungsi dua variabel menggunakan NumPy. Setelah topik ini selesai, fungsi dua variabel dapat dinyatakan dengan benar, dievaluasi pada kisi masukan, dan perilakunya dapat dibaca dari bentuk permukaan maupun konturnya. Pemahaman ini menjadi dasar bagi turunan parsial dan gradien yang menggunakan fungsi multivariabel sebagai objek kerjanya.
Dari satu variabel ke dua variabel#
Fungsi satu variabel memetakan satu masukan ke satu keluaran, sedangkan fungsi dua variabel menerima sepasang masukan sekaligus. Notasi dibaca “f dari x dan y”, dan setiap pasangan masukan menghasilkan tepat satu nilai. Contoh yang digunakan sepanjang topik ini adalah
sehingga dan juga. Dua pasangan masukan berbeda boleh menghasilkan keluaran yang sama, karena syarat kefungsannya tetap terpenuhi.
Domain fungsi dua variabel adalah himpunan pasangan masukan yang sah, dan untuk domainnya adalah seluruh bidang . Fungsi dengan pembagian atau akar kuadrat memiliki domain yang lebih sempit, misalnya menuntut . Keluaran fungsinya tetap satu bilangan, sehingga wajar dilambangkan . Dengan lambang itu, setiap pasangan pada bidang datar dipasangkan dengan satu ketinggian .
Contoh konkret yang mudah dibayangkan adalah catatan sensor suhu di sebuah ruangan. Nilai suhu pada titik pengukuran bergantung pada dua koordinat letak sensornya, yaitu jarak horizontal dan jarak vertikal dari sudut ruangan, sehingga suhu merupakan fungsi . Model prediksi konsumsi listrik gedung bekerja serupa karena keluarannya bergantung pada luas lantai dan jumlah penghuni sekaligus. Pola dua masukan menuju satu keluaran inilah yang membedakan fungsi multivariabel dari fungsi satu variabel.
Permukaan dan peta kontur#
Grafik fungsi satu variabel berupa kurva pada bidang datar, sedangkan grafik berupa permukaan di ruang tiga dimensi. Setiap titik pada domain diberi ketinggian sebesar , dan himpunan seluruh titik hasilnya membentuk permukaan. Untuk , permukaannya berbentuk mangkuk yang landai di sekitar titik asal dan makin tinggi ke arah tepinya. Titik terendahnya berada di dengan nilai .
Permukaan tiga dimensi sulit dibaca langsung pada layar datar, sehingga permukaan biasanya diproyeksikan menjadi peta kontur (contour plot). Garis kontur menghubungkan semua titik yang memiliki nilai fungsi sama, sebagaimana peta topografi menghubungkan titik-titik berketinggian sama. Pada peta kontur , garis-garisnya berupa lingkaran konsentris di sekitar titik asal, dan lingkaran yang lebih jauh dari pusat mewakili nilai yang lebih tinggi. Kontur yang rapat menandakan permukaan yang curam, sedangkan kontur yang renggang menandakan bagian yang landai. Gambar berikut memperlihatkan permukaan dan peta konturnya berdampingan.
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
"""Permukaan mangkuk f(x, y) = x^2 + y^2."""
return x**2 + y**2
x = np.linspace(-3.0, 3.0, 60)
y = np.linspace(-3.0, 3.0, 60)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure(figsize=(6, 3))
ax1 = fig.add_subplot(1, 2, 1, projection="3d")
ax1.plot_surface(X, Y, Z, cmap="viridis", linewidth=0, antialiased=True)
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_zlabel("f")
ax1.set_title("$f(x, y) = x^2 + y^2$")
ax2 = fig.add_subplot(1, 2, 2)
c = ax2.contour(X, Y, Z, levels=[1, 4, 9, 16], colors="#1a5fb4")
ax2.clabel(c, fmt="%.0f", fontsize=8)
ax2.set_xlabel("x")
ax2.set_ylabel("y")
ax2.set_title("Peta kontur")
ax2.set_aspect("equal")
fig.tight_layout()
fig.savefig("permukaan-dan-kontur.svg")Panel kiri menampilkan permukaan mangkuk, sedangkan panel kanan menampilkan proyeksinya ke bidang datar. Ketinggian yang sama selalu ditemui pada lingkaran yang berjarak sama dari pusat, sehingga konturnya konsentris. Dari peta tersebut, letak titik terendah langsung terbaca pada pusat lingkaran tanpa perlu menghitung apa pun. Kemampuan membaca peta kontur seperti ini penting ketika gradien dibahas, karena panah gradien selalu tegak lurus garis kontur.
Evaluasi fungsi dua variabel dengan NumPy#
NumPy mengevaluasi fungsi dua variabel pada array masukan sekaligus tanpa perulangan manual, sama seperti pada fungsi satu variabel. Kasus dua masukan menambahkan satu langkah, yaitu membangun kisi pasangan menggunakan np.meshgrid. Fungsi kemudian diterapkan pada kisi tersebut, sehingga keluarannya juga berbentuk kisi berukuran sama. Berkas berikut mendefinisikan , mengevaluasinya pada beberapa titik, lalu mencari titik terendah pada kisi.
import numpy as np
def f(x, y):
"""Permukaan mangkuk f(x, y) = x^2 + y^2."""
return x**2 + y**2
# evaluasi pada beberapa pasangan masukan
for x, y in [(0.0, 0.0), (1.0, 2.0), (-2.0, 1.0), (3.0, -3.0)]:
print(f"f({x:+.1f}, {y:+.1f}) = {f(x, y):.1f}")
# evaluasi pada kisi masukan dua dimensi menggunakan meshgrid
x = np.linspace(-3.0, 3.0, 13)
y = np.linspace(-3.0, 3.0, 13)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
print("ukuran kisi keluaran :", Z.shape)
print("nilai terendah kisi :", Z.min())
i, j = np.unravel_index(np.argmin(Z), Z.shape)
print(f"letak titik terendah : x = {x[j]:.1f}, y = {y[i]:.1f}")f(+0.0, +0.0) = 0.0
f(+1.0, +2.0) = 5.0
f(-2.0, +1.0) = 5.0
f(+3.0, -3.0) = 18.0
ukuran kisi keluaran : (13, 13)
nilai terendah kisi : 0.0
letak titik terendah : x = 0.0, y = 0.0Empat baris pertama mengonfirmasi penghitungan manual, misalnya , dan menunjukkan dua pasangan berbeda yang menghasilkan nilai sama. Kisi memuat 169 evaluasi sekaligus yang diperoleh dari satu pemanggilan fungsi. Nilai terendah pada kisi adalah 0.0 yang letaknya ditemukan menggunakan np.argmin bersama np.unravel_index, dan hasilnya bertepatan dengan pusat mangkuk yang terlihat pada gambar sebelumnya. Pencarian titik terendah pada kisi seperti ini adalah versi kasar dari optimasi yang dirapikan oleh gradient descent.
Demo interaktif: peta kontur#
Demo berikut menampilkan peta kontur yang sama beserta titik masukan yang dapat digerakkan. Geser slider dan , lalu amati letak titik pada peta beserta nilai yang ditampilkan. Titik yang berjarak sama dari pusat selalu menampilkan nilai yang sama, karena nilai fungsinya hanya bergantung pada jarak ke pusat. Pindahkan titik ke lalu ke untuk memastikan keduanya sama-sama bernilai .
Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Peta kontur f(x, y) = x² + y²</title>
<style>
body { font-family: sans-serif; margin: 12px; color: #241f31; }
.baris { display: flex; align-items: center; gap: 10px; margin: 8px 0; flex-wrap: wrap; }
input[type="range"] { width: 190px; }
#peta { background: #f6f5f4; border-radius: 6px; }
#nilai { margin-top: 8px; padding: 10px 12px; border-radius: 6px; background: #e6f4ea; font-size: 1.05em; }
</style>
</head>
<body>
<div class="baris">
<label for="sx">x = <span id="vx">2.0</span></label>
<input id="sx" type="range" min="-4" max="4" step="0.1" value="2">
<label for="sy">y = <span id="vy">0.0</span></label>
<input id="sy" type="range" min="-4" max="4" step="0.1" value="0">
</div>
<canvas id="peta" width="420" height="300"></canvas>
<div id="nilai"></div>
<script>
var skala = 32; // piksel per satuan
var cx = 210, cy = 150; // letak titik asal pada kanvas
function f(x, y) { return x * x + y * y; }
function gambar() {
var kanvas = document.getElementById("peta");
var ctx = kanvas.getContext("2d");
ctx.clearRect(0, 0, kanvas.width, kanvas.height);
// sumbu x dan y
ctx.strokeStyle = "#c9c5c1";
ctx.beginPath();
ctx.moveTo(0, cy); ctx.lineTo(kanvas.width, cy);
ctx.moveTo(cx, 0); ctx.lineTo(cx, kanvas.height);
ctx.stroke();
// garis kontur pada level f = 1, 4, 9, 16 (jari-jari 1, 2, 3, 4)
var jari = [1, 2, 3, 4];
for (var k = 0; k < jari.length; k++) {
ctx.beginPath();
ctx.arc(cx, cy, jari[k] * skala, 0, 2 * Math.PI);
ctx.strokeStyle = "#9a9996";
ctx.stroke();
ctx.fillStyle = "#77767b";
ctx.fillText("f = " + (jari[k] * jari[k]), cx + jari[k] * skala - 36, cy - 4);
}
// titik masukan yang digerakkan slider
var x = parseFloat(document.getElementById("sx").value);
var y = parseFloat(document.getElementById("sy").value);
ctx.beginPath();
ctx.arc(cx + x * skala, cy - y * skala, 5, 0, 2 * Math.PI);
ctx.fillStyle = "#c01c28";
ctx.fill();
document.getElementById("vx").textContent = x.toFixed(1);
document.getElementById("vy").textContent = y.toFixed(1);
document.getElementById("nilai").textContent =
"f(" + x.toFixed(1) + ", " + y.toFixed(1) + ") = " + f(x, y).toFixed(2);
}
document.getElementById("sx").addEventListener("input", gambar);
document.getElementById("sy").addEventListener("input", gambar);
gambar();
</script>
</body>
</html>Di mana hal ini ditemui dalam kode#
Model machine learning yang memprediksi satu nilai dari banyak fitur pada dasarnya adalah fungsi multivariabel. Model taksiran harga hunian yang menerima luas bangunan dan lokasi menyatakan keduanya sebagai dua masukan dan , lalu mengembalikan satu keluaran berupa taksiran harga. Model konsumsi listrik yang menerima luas lantai dan suhu luar bekerja dengan pola yang sama. Semakin banyak fitur yang digunakan, semakin banyak masukannya, tetapi keluarannya tetap satu nilai.
Fungsi loss (loss function) juga berbentuk multivariabel, hanya saja masukannya berupa bobot model dan keluarannya berupa ukuran kesalahan. Model dengan dua bobot menghasilkan permukaan loss di ruang tiga dimensi, dan pelatihan model berarti mencari titik terendah pada permukaan itu. Cara membaca permukaan dan peta kontur pada topik ini persis menjadi cara memvisualisasikan pencarian titik terendah tersebut. Fungsi dengan tiga bobot atau lebih sulit digambarkan, tetapi konsep kisi, evaluasi, dan kontur tetap berlaku apa adanya.
Ringkasan#
- Fungsi dua variabel menerima sepasang masukan dan mengembalikan tepat satu nilai, dan domainnya adalah himpunan pasangan masukan yang sah.
- Grafik berupa permukaan tiga dimensi, sedangkan peta kontur menghimpun titik-titik bernilai sama pada garis, dan kontur yang rapat menandakan kemiringan yang curam.
- NumPy mengevaluasi fungsi dua variabel pada kisi masukan menggunakan
np.meshgrid, dan operasi berikutnya berjalan pada seluruh sel sekaligus. - Model prediksi dan fungsi loss pada machine learning keduanya merupakan fungsi multivariabel, sehingga pencarian nilai terendahnya adalah pekerjaan pada permukaan.
Referensi#
- Calculus Volume 3 — OpenStax — Definisi fungsi beberapa variabel, domainnya, dan garis taraf (level curve) pada contoh-contohnya.
- NumPy 2.1 documentation — NumPy project
— Dokumentasi
np.meshgrid,np.linspace, dan operasi array yang digunakan pada contoh evaluasi kisi. - Mathematics for Machine Learning — Cambridge University Press — Bab vektor dan optimasi menghubungkan fungsi berdimensi banyak dengan pelatihan model.