Topik ini membahas fungsi sinus dan kosinus sebagai koordinat titik pada lingkaran satuan, gelombang yang dihasilkannya, serta sifat periodik dan simetrinya. Nilai pada sudut-sudut istimewa dihitung dengan NumPy, gelombangnya digambar dengan matplotlib, dan setiap sifat diverifikasi secara komputasi pada ribuan titik sekaligus. Setelah topik ini selesai dibaca, kedua fungsi tersebut dapat dibaca langsung dari geometri lingkaran maupun dari grafiknya, dan kaitannya dengan sinyal periodik dapat dikenali dalam kode.
Koordinat titik pada lingkaran satuan#
Lingkaran satuan adalah lingkaran berjari-jari satu yang berpusat di titik asal. Apabila sebuah titik bergerak pada lingkaran itu mulai dari , posisinya setelah menempuh busur sejauh radian dinyatakan oleh pasangan koordinat berikut. Titik yang berputar pada lingkaran inilah sumber fungsi sinus dan kosinus.
Jarak horizontal titik P terhadap titik asal bernilai , sedangkan jarak vertikalnya bernilai . Jari-jari menuju titik P berperan sebagai sisi miring yang panjangnya satu, sehingga kedua koordinat itu sekaligus menjadi definisi kedua fungsi. Definisi semacam ini berlaku untuk sudut apa pun, termasuk sudut yang melampaui , tanpa perlu mengubah segitiga acuannya di setiap kuadran.
Skrip berikut menghitung posisi titik pada , lalu menggambar lingkaran satuan beserta proyeksinya. Sudut tersebut dipilih sebagai contoh biasa karena tidak jatuh pada sumbu maupun sudut istimewa. Baca skripnya terlebih dahulu, kemudian bandingkan hasilnya dengan diagram di bawahnya.
import numpy as np
import matplotlib
matplotlib.use("Agg") # backend tanpa jendela, cocok untuk menyimpan berkas
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5.5, 5))
ax.set_aspect("equal")
theta = np.deg2rad(52.0)
x_p = np.cos(theta)
y_p = np.sin(theta)
# lingkaran satuan berwarna abu-abu
t = np.linspace(0.0, 2 * np.pi, 400)
ax.plot(np.cos(t), np.sin(t), color="#999999", linewidth=1.5)
# proyeksi titik P pada kedua sumbu
ax.plot([0, x_p], [y_p, y_p], color="#d62728", linewidth=2.2) # jarak horizontal: cos
ax.plot([x_p, x_p], [0, y_p], color="#2ca02c", linewidth=2.2) # jarak vertikal: sin
ax.plot([0, x_p], [0, y_p], color="#1f77b4", linewidth=2.2) # jari-jari ke titik P
ax.plot(x_p, y_p, "o", color="#1f77b4", markersize=7)
ax.plot(0, 0, "o", color="#444444", markersize=4)
# busur kecil penanda sudut
busur = np.linspace(0.0, theta, 80)
ax.plot(0.28 * np.cos(busur), 0.28 * np.sin(busur), color="#444444", linewidth=1.2)
# label
ax.text(0.34, 0.13, "θ", fontsize=13, ha="center", color="#444444")
ax.text(x_p / 2 - 0.09, y_p / 2 + 0.05, "1", color="#1f77b4", fontsize=13, ha="center")
ax.text(x_p / 2, y_p + 0.05, "cos θ", color="#d62728", fontsize=12, ha="center")
ax.text(x_p + 0.05, y_p / 2, "sin θ", color="#2ca02c", fontsize=12, ha="left")
ax.text(x_p + 0.10, y_p + 0.14, "P = (cos θ, sin θ)", fontsize=12,
ha="left", color="#333333")
ax.set_xlim(-1.25, 2.1)
ax.set_ylim(-1.25, 1.45)
ax.axis("off")
plt.tight_layout()
plt.savefig("lingkaran-satuan.svg")Skrip tersebut mengonversi sudutnya ke radian melalui np.deg2rad, menghitung np.cos dan np.sin-nya, lalu menggambar garis merah dan hijau menuju kedua sumbu. Hasilnya disimpan sebagai berkas lingkaran-satuan.svg berikut. Label pada diagramnya menggunakan nama kedua fungsi, sehingga pasangan garis dan fungsinya terbaca langsung.
Bentuk diagram tersebut menegaskan peran kedua fungsi sebagai panjang. Nilai keduanya selalu berada di antara dan karena keduanya adalah jarak pada lingkaran berjari-jari satu. Positif atau negatifnya ditentukan oleh kuadran tempat titik P berada, dan hal itu terbaca langsung dari arah horizontal maupun vertikalnya.
Sudut-sudut istimewa#
Sebagian sudut menghasilkan nilai sinus dan kosinus yang bentuk tepatnya diketahui, misalnya dan . Sudut-sudut tersebut disebut sudut istimewa dan lazim dijadikan titik pemeriksa saat menguji kode trigonometri. Skrip berikut mencetak nilai kedua fungsi pada sudut istimewa dari sampai .
import numpy as np
sudut = [0.0, np.pi / 6, np.pi / 4, np.pi / 3, np.pi / 2]
nama = ["0", "π/6", "π/4", "π/3", "π/2"]
for n, t in zip(nama, sudut):
print(f"θ = {n:>4}: cos θ = {np.cos(t):+.4f}, sin θ = {np.sin(t):+.4f}")θ = 0: cos θ = +1.0000, sin θ = +0.0000
θ = π/6: cos θ = +0.8660, sin θ = +0.5000
θ = π/4: cos θ = +0.7071, sin θ = +0.7071
θ = π/3: cos θ = +0.5000, sin θ = +0.8660
θ = π/2: cos θ = +0.0000, sin θ = +1.0000Keluaran tersebut cocok dengan bentuk tepat yang dihitung secara manual. Nilai adalah hampiran , sedangkan adalah hampiran . Pola yang terlihat juga bermakna, yaitu kosinus pada suatu sudut sama dengan sinus sudut pengengkapnya, misalnya muncul sebagai sekaligus . Setiap barisnya memenuhi , yaitu hubungan yang diturunkan dari teorema Pythagoras.
Gelombang sinus dan kosinus#
Apabila sudut diperbesar terus-menerus, titik pada lingkaran satuan berputar, dan kedua koordinatnya naik-turun berulang. Kurva kedua fungsi terhadap oleh karena itu berbentuk gelombang. Skrip berikut menggambar kedua gelombang tersebut pada rentang sampai radian.
import numpy as np
import matplotlib
matplotlib.use("Agg") # backend tanpa jendela, cocok untuk menyimpan berkas
import matplotlib.pyplot as plt
t = np.linspace(-2 * np.pi, 2 * np.pi, 600)
plt.figure(figsize=(6, 3))
plt.plot(t, np.sin(t), label="sin θ", color="#1f77b4", linewidth=1.8)
plt.plot(t, np.cos(t), label="cos θ", color="#d62728", linewidth=1.8, linestyle="--")
plt.axhline(0, color="#999999", linewidth=0.8)
plt.xticks(
np.arange(-2 * np.pi, 2.5 * np.pi, np.pi / 2),
[r"$-2\pi$", r"$-\frac{3\pi}{2}$", r"$-\pi$", r"$-\frac{\pi}{2}$", "0",
r"$\frac{\pi}{2}$", r"$\pi$", r"$\frac{3\pi}{2}$", r"$2\pi$"],
)
plt.ylim(-1.5, 1.5)
plt.xlabel("θ (radian)")
plt.ylabel("nilai fungsi")
plt.legend(loc="upper right")
plt.grid(True, color="#dddddd", linewidth=0.6)
plt.tight_layout()
plt.savefig("gelombang-sinus.svg")Berkas gelombang-sinus.svg dihasilkan oleh plt.savefig pada baris terakhir skrip tersebut. Label sumbu horizontalnya menggunakan kelipatan , sehingga posisi perulangannya terbaca langsung. Hasilnya ditampilkan berikut ini.
Dua perilaku terbaca langsung dari grafik. Kedua kurva selalu berada di antara dan serta berulang setiap radian, dan kurva kosinus merupakan kurva sinus yang digeser ke kiri. Geseran seperempat periode itu menyebabkan kedua fungsi saling mengimbangi, yaitu salah satunya mencapai puncak ketika yang lain menembus nol.
Mencoba gelombang secara interaktif#
Demo berikut menyandingkan lingkaran satuan dengan gelombang yang dihasilkannya. Geser penggesernya dari 0 sampai 720 derajat untuk dua putaran penuh, lalu amati titik biru pada lingkaran dan titik merah pada gelombang yang bergerak serempak. Angka kosinus dan sinus di bawah kanvas berubah mengikuti posisi titiknya. Setelah satu putaran terlewati, titik pada lingkaran kembali ke tempat semula, sedangkan gelombangnya berlanjut, sesuatu yang tidak terlihat pada satu lingkaran saja.
Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Demo lingkaran satuan dan gelombang sinus</title>
<style>
body { font-family: sans-serif; margin: 0; padding: 10px; color: #222; }
canvas { background: #fafafa; border: 1px solid #ddd; max-width: 100%; }
.baris { margin-top: 6px; font-size: 14px; }
.nilai { display: inline-block; min-width: 90px; font-weight: bold; }
</style>
</head>
<body>
<canvas id="kanvas" width="560" height="300"></canvas>
<div class="baris">
<label for="sudut">Sudut: <span id="teksSudut">104</span>° dari 0 sampai 720° (dua putaran)</label>
<input type="range" id="sudut" min="0" max="720" value="104" style="width: 100%">
</div>
<div class="baris">cos θ = <span class="nilai" id="nilaiCos"></span> sin θ = <span class="nilai" id="nilaiSin"></span></div>
<script>
const kanvas = document.getElementById('kanvas');
const ctx = kanvas.getContext('2d');
const slider = document.getElementById('sudut');
const pusatX = 110, pusatY = 150, jari = 90;
const gelX0 = 250, gelX1 = 540, gelTengah = 150, gelTinggi = 60;
function gambar() {
const derajat = Number(slider.value);
const radian = derajat * Math.PI / 180;
ctx.clearRect(0, 0, kanvas.width, kanvas.height);
// lingkaran satuan (digambar dengan skala jari-jari 90 piksel)
ctx.beginPath();
ctx.arc(pusatX, pusatY, jari, 0, 2 * Math.PI);
ctx.strokeStyle = '#999999';
ctx.lineWidth = 1.5;
ctx.stroke();
// titik P pada lingkaran; sumbu y kanvas ke bawah sehingga sin dibalik tanda
const px = pusatX + jari * Math.cos(radian);
const py = pusatY - jari * Math.sin(radian);
ctx.beginPath();
ctx.moveTo(pusatX, pusatY);
ctx.lineTo(px, py);
ctx.strokeStyle = '#1f77b4';
ctx.lineWidth = 2.2;
ctx.stroke();
ctx.beginPath();
ctx.arc(px, py, 5, 0, 2 * Math.PI);
ctx.fillStyle = '#1f77b4';
ctx.fill();
// posisi titik pada gelombang, lalu garis putus-putus penghubungnya
const wx = gelX0 + (gelX1 - gelX0) * (radian / (4 * Math.PI));
const wy = gelTengah - gelTinggi * Math.sin(radian);
ctx.beginPath();
ctx.moveTo(px, py);
ctx.lineTo(wx, wy);
ctx.strokeStyle = '#bbbbbb';
ctx.lineWidth = 1;
ctx.setLineDash([4, 3]);
ctx.stroke();
ctx.setLineDash([]);
// kurva merah yang sudah ditempuh sampai sudut saat ini
ctx.beginPath();
let pertama = true;
for (let i = 0; i <= 400; i++) {
const t = 4 * Math.PI * i / 400;
if (t > radian) break;
const x = gelX0 + (gelX1 - gelX0) * t / (4 * Math.PI);
const y = gelTengah - gelTinggi * Math.sin(t);
if (pertama) { ctx.moveTo(x, y); pertama = false; } else { ctx.lineTo(x, y); }
}
ctx.strokeStyle = '#d62728';
ctx.lineWidth = 2;
ctx.stroke();
// titik pada gelombang dan garis nol
ctx.beginPath();
ctx.arc(wx, wy, 5, 0, 2 * Math.PI);
ctx.fillStyle = '#d62728';
ctx.fill();
ctx.beginPath();
ctx.moveTo(gelX0, gelTengah);
ctx.lineTo(gelX1, gelTengah);
ctx.strokeStyle = '#999999';
ctx.lineWidth = 1;
ctx.stroke();
document.getElementById('teksSudut').textContent = String(derajat);
document.getElementById('nilaiCos').textContent = Math.cos(radian).toFixed(4);
document.getElementById('nilaiSin').textContent = Math.sin(radian).toFixed(4);
}
slider.addEventListener('input', gambar);
gambar();
</script>
</body>
</html>Pada kode sumbernya, posisi titik dihitung dengan Math.cos dan Math.sin yang menerima radian, kemudian titik gelombang digambar pada posisi horizontal sebanding dengan sudut yang ditempuh. Garis putus-putus abu-abu menghubungkan kedua titik, sehingga ketinggian gelombang terlihat sama dengan jarak vertikal titik lingkarannya. Perilaku berulang inilah alasan lingkaran satuan dan gelombang selalu dibahas berdampingan.
Sifat periodik dan simetri#
Fungsi sinus dan kosinus berulang persis setiap radian, yaitu sifat yang disebut periodik. Kedua fungsi juga memiliki simetri yang berbeda, sebab membuat sinus menjadi fungsi ganjil, sedangkan membuat kosinus menjadi fungsi genap. Seluruh sifat itu dapat diperiksa sekaligus dengan mencari selisih terbesar pada kisi titik yang rapat. Skrip berikut meneliti 200001 titik pada rentang sampai radian.
import numpy as np
t = np.linspace(-10.0, 10.0, 200001)
# kedua fungsi berulang persis setiap 2π radian
sisa_periode_sin = np.max(np.abs(np.sin(t + 2 * np.pi) - np.sin(t)))
sisa_periode_cos = np.max(np.abs(np.cos(t + 2 * np.pi) - np.cos(t)))
print(f"maks |sin(t + 2π) - sin(t)| = {sisa_periode_sin:.2e}")
print(f"maks |cos(t + 2π) - cos(t)| = {sisa_periode_cos:.2e}")
# sinus yang digeser π/2 ke kiri berubah menjadi kosinus
sisa_geser = np.max(np.abs(np.sin(t + np.pi / 2) - np.cos(t)))
print(f"maks |sin(t + π/2) - cos(t)| = {sisa_geser:.2e}")
# sinus fungsi ganjil dan kosinus fungsi genap
sisa_ganjil = np.max(np.abs(np.sin(-t) + np.sin(t)))
sisa_genap = np.max(np.abs(np.cos(-t) - np.cos(t)))
print(f"maks |sin(-t) + sin(t)| = {sisa_ganjil:.2e}")
print(f"maks |cos(-t) - cos(t)| = {sisa_genap:.2e}")maks |sin(t + 2π) - sin(t)| = 2.78e-16
maks |cos(t + 2π) - cos(t)| = 2.78e-16
maks |sin(t + π/2) - cos(t)| = 1.11e-16
maks |sin(-t) + sin(t)| = 0.00e+00
maks |cos(-t) - cos(t)| = 0.00e+00Dua baris pertama menunjukkan periodisitas, baris ketiga menunjukkan hubungan geseran , sedangkan dua baris terakhir menunjukkan simetri ganjil dan genap. Selisih berordo pada tiga baris pertama bukan nol sempurna karena aritmetika float, sedangkan dua baris terakhir memang mencetak nol persis karena operasinya simetris pada tingkat bit. Pola pemeriksaan seperti ini, yaitu mencari selisih terbesar pada kisi titik rapat, dapat digunakan ulang untuk menguji hampir semua rumus trigonometri.
Di mana hal ini ditemui dalam kode#
Gelombang sinus adalah bentuk dasar sinyal berulang, mulai dari nada audio hingga catatan sensor periodik. Pembangkitan sinyal pada praktiknya berupa penghitungan pada deretan waktu , dengan menyatakan frekuensinya. Baris kode berikut mengambil delapan sampel dari gelombang satu hertz pada laju delapan sampel per detik.
import numpy as np
# delapan sampel gelombang 1 Hz pada laju 8 sampel per detik
t = np.arange(8) / 8.0
gelombang = np.sin(2 * np.pi * t)
print(np.round(gelombang, 4))[ 0. 0.7071 1. 0.7071 0. -0.7071 -1. -0.7071]Keluarannya berupa satu siklus lengkap yang naik menuju , turun melalui , mencapai , lalu kembali mendekati nol. Susunan seperti ini adalah bentuk paling sederhana dari pemrosesan sinyal digital, dan pengubahan frekuensi maupun amplitudo cukup dilakukan pada faktor di dalam np.sin. Di luar sinyal, pasangan np.cos dan np.sin juga menjadi cara standar menghasilkan posisi berputar pada grafika, misalnya lintasan kamera atau titik-titik pada diagram lingkaran.
Ringkasan#
- Titik pada lingkaran satuan di sudut berkoordinat , sehingga kedua fungsi terbaca langsung sebagai jarak horizontal dan vertikal.
- Nilai kedua fungsi selalu berada di antara dan , dan keduanya berulang persis setiap radian.
- Hubungan menjadikan gelombang kosinus sebagai gelombang sinus yang digeser seperempat periode.
- Sinus merupakan fungsi ganjil dan kosinus fungsi genap, sedangkan seluruh sifat itu terverifikasi dengan mencari selisih terbesar pada kisi titik rapat.
Referensi#
- numpy.sin — NumPy Developers — Dokumentasi fungsi sinus NumPy yang menerima sudut dalam radian.
- numpy.allclose — NumPy Developers — Dokumentasi fungsi perbandingan dengan toleransi yang disarankan untuk memeriksa kesamaan float.
- Pyplot — Matplotlib
— Referensi fungsi
pyplotyang digunakan pada skrip penggambar gelombang. - Trigonometry — Khan Academy — Unit pembelajaran terbuka tentang lingkaran satuan, grafik sinus, dan sifat periodiknya.