Turunan numerik (beda tengah)
Polinomial diberikan sebagai list koefisien: coeffs = [c0, c1, c2, ...] berarti
Hitung turunan 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) adalah kemiringan f di titik x: seberapa cepat output berubah jika input digeser sedikit.
f′(x)≈2hf(x+h)−f(x−h)Galat beda maju hf(x+h)−f(x) sebanding dengan h. Galat beda tengah sebanding dengan h2, jadi dengan h=10−5 galatnya kira-kira 10−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 h terlalu kecil (misalnya 10−12): pembulatan floating point akan mendominasi.
Penjelasan
Yang diminta. Hitung f′(x) untuk polinomial coeffs tanpa menurunkan rumusnya, cukup dengan mengevaluasi f di dua titik.
Ide kunci. Turunan adalah kemiringan. Kemiringan garis antara x−h dan x+h adalah
2hf(x+h)−f(x−h)Dengan h kecil, garis ini hampir sama dengan garis singgung di x. Versi “tengah” ini galatnya sebanding dengan h2, jauh lebih kecil daripada beda maju yang galatnya sebanding dengan h.
Langkah di kode:
f = lambda t: sum(c * t ** i for i, c in enumerate(coeffs)).enumeratememberi pangkatiuntuk setiap koefisienc, jadi[1, -3, 0, 2]berarti 1−3t+2t3.- Kembalikan
(f(x + h) - f(x - h)) / (2 * h)denganh = 1e-5.
Cek manual. coeffs = [0, 0, 1] berarti f(x)=x2, jadi f′(3)=6. Hasil numeriknya 6.0000000000…, dengan galat sekitar 10−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
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.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.