b belajar.myudak

Turunan numerik (beda tengah)

Polinomial diberikan sebagai list koefisien: coeffs = [c0, c1, c2, ...] berarti

f(x)=c0+c1x+c2x2+…f(x) = c_0 + c_1 x + c_2 x^2 + \dots

Hitung turunan f′(x)f'(x) secara numerik dengan beda tengah, h = 1e-5. Jangan menurunkan rumusnya secara simbolik: tujuannya adalah teknik yang bisa dipakai untuk fungsi apa pun.

coeffs = [0, 0, 1], x = 3   →  ≈ 6      // f(x) = x², f'(3) = 6
coeffs = [5, 2], x = -7     →  ≈ 2

Definisi turunan

f′(x)f'(x) adalah kemiringan ff di titik xx: seberapa cepat output berubah jika input digeser sedikit.

f′(x)≈f(x+h)−f(x−h)2hf'(x) \approx \frac{f(x+h) - f(x-h)}{2h}

Galat beda maju f(x+h)−f(x)h\frac{f(x+h) - f(x)}{h} sebanding dengan hh. Galat beda tengah sebanding dengan h2h^2, jadi dengan h=10−5h = 10^{-5} galatnya kira-kira 10−1010^{-10}.

Kenapa ini penting di ML

Backpropagation menghitung gradien secara analitik (cepat, tapi mudah salah implementasi). Beda tengah lambat, karena butuh 2 kali evaluasi per parameter, tapi hampir pasti benar. Karena itu beda tengah dipakai untuk gradient check: bandingkan keduanya, dan kalau berbeda jauh, backprop-mu salah. Kita akan memakainya lagi di node N1.

Jangan memilih hh terlalu kecil (misalnya 10−1210^{-12}): pembulatan floating point akan mendominasi.

Penjelasan

Yang diminta. Hitung f′(x)f'(x) untuk polinomial coeffs tanpa menurunkan rumusnya, cukup dengan mengevaluasi ff di dua titik.

Ide kunci. Turunan adalah kemiringan. Kemiringan garis antara x−hx - h dan x+hx + h adalah

f(x+h)−f(x−h)2h\frac{f(x+h) - f(x-h)}{2h}

Dengan hh kecil, garis ini hampir sama dengan garis singgung di xx. Versi “tengah” ini galatnya sebanding dengan h2h^2, jauh lebih kecil daripada beda maju yang galatnya sebanding dengan hh.

Langkah di kode:

  1. f = lambda t: sum(c * t ** i for i, c in enumerate(coeffs)). enumerate memberi pangkat i untuk setiap koefisien c, jadi [1, -3, 0, 2] berarti 1−3t+2t31 - 3t + 2t^3.
  2. Kembalikan (f(x + h) - f(x - h)) / (2 * h) dengan h = 1e-5.

Cek manual. coeffs = [0, 0, 1] berarti f(x)=x2f(x) = x^2, jadi f′(3)=6f'(3) = 6. Hasil numeriknya 6.0000000000…6.0000000000\ldots, dengan galat sekitar 10−1010^{-10}.

Yang dikembalikan: satu float.

Kesalahan umum: membagi dengan h alih-alih 2 * h; memakai h yang terlalu kecil (1e-12) sehingga galat pembulatan mendominasi.

Topik
kalkulusgradienfinite difference
Petunjuk 1

Buat dulu fungsi kecil f(t) yang menghitung nilai polinomial di t.

Petunjuk 2

Beda tengah: (f(x + h) - f(x - h)) / (2h). Ini jauh lebih akurat daripada (f(x + h) - f(x)) / h.

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.