Deret dan Pengenalan Taylor

Menghampiri fungsi menggunakan deret.

Daftar isi

Topik ini memperkenalkan deret sebagai penjumlahan tak hingga yang suku-sukunya mengikuti satu pola, lalu menerapkan gagasan itu pada deret Taylor yang menghampiri fungsi halus menggunakan polinomial. Perilaku konvergensinya diamati lebih dahulu pada deret geometri, kemudian diuji pada exe^x dan sin⁡x\sin x dengan pembanding langsung berupa np.exp dan np.sin. Setelah membaca, hampiran Taylor dapat dituliskan dan dihitung, serta jumlah suku yang diperlukan untuk tingkat ketelitian tertentu dapat ditetapkan dari data keluaran kode.

Deret dan jumlah parsial#

Deret (series) adalah penjumlahan tak hingga ∑kak\sum_{k} a_k, dan nilainya didekati melalui jumlah parsial (partial sum), yaitu hasil penjumlahan NN suku pertama. Deret disebut konvergen apabila jumlah parsialnya menuju satu nilai tetap ketika NN membesar. Contoh yang paling mudah diukur adalah deret geometri (geometric series) yang setiap sukunya dikalikan satu rasio yang sama,

∑k=1∞rk=r+r2+r3+⋯=r1−runtuk ∣r∣<1. \sum_{k=1}^{\infty} r^k = r + r^2 + r^3 + \cdots = \frac{r}{1 - r} \qquad \text{untuk } |r| < 1.

Pada rasio r=1/2r = 1/2, deretnya berupa 1/2+1/4+1/8+⋯1/2 + 1/4 + 1/8 + \cdots dan rumus di atas menyatakan jumlahnya 11. Syarat ∣r∣<1|r| < 1 menentukan konvergensi, karena rasio yang besarnya melebihi satu membuat setiap suku semakin besar dan jumlah parsialnya membesar tanpa henti. Program berikut menambahkan sukunya satu per satu untuk memastikan jumlah parsialnya benar-benar bergerak ke arah nilai itu.

python Contoh: jumlah parsial deret geometri dengan r = 1/2
import numpy as np

# jumlah parsial deret geometri 1/2 + 1/4 + 1/8 + ... menuju 1
r = 0.5
for N in (1, 2, 4, 8, 16, 32):
    S = r * (1.0 - r**N) / (1.0 - r)
    print(f"N = {N:2d} : jumlah parsial = {S:.6f}")
text Keluaran
N =  1 : jumlah parsial = 0.500000
N =  2 : jumlah parsial = 0.750000
N =  4 : jumlah parsial = 0.937500
N =  8 : jumlah parsial = 0.996094
N = 16 : jumlah parsial = 0.999985
N = 32 : jumlah parsial = 1.000000

Setiap penggandaan NN menggerus jarak menuju 11 menjadi setengahnya, sebagaimana terlihat dari 0.0039060.003906 pada N=8N = 8 yang menyusut menjadi 0.0000150.000015 pada N=16N = 16. Pola penyusutan ini persis sifat deret geometri, karena setiap suku baru seperdua dari sisa jumlah sebelumnya. Deret Taylor menggunakan mekanisme penjumlahan yang sama, tetapi sukunya disusun dari turunan fungsi, bukan dari rasio tetap.

Deret Taylor dan hampiran polinomial#

Deret Taylor (Taylor series) menghampiri fungsi halus ff di sekitar satu titik pusat menggunakan polinomial yang koefisiennya ditetapkan oleh turunan fungsi di titik itu. Semakin tinggi orde polinomialnya, semakin banyak informasi turunan yang tercakup, dan semakin lebar pula daerah tempat hampirannya meyakinkan. Di sekitar titik nol, bentuknya adalah

f(x)≈∑k=0nf(k)(0)k! xk. f(x) \approx \sum_{k=0}^{n} \frac{f^{(k)}(0)}{k!}\,x^k.

Dua fungsi yang digunakan di seluruh komputasi memiliki bentuk Taylor yang rapi, yaitu eksponensial dan sinus. Keduanya dituliskan sebagai deret tak hingga yang benar-benar sama dengan fungsi asalnya pada seluruh garis bilangan,

ex=∑k=0∞xkk!,sin⁡x=∑k=0∞(−1)k x2k+1(2k+1)!. e^x = \sum_{k=0}^{\infty} \frac{x^k}{k!}, \qquad \sin x = \sum_{k=0}^{\infty} \frac{(-1)^k\,x^{2k+1}}{(2k+1)!}.

Hampiran sinus hanya memuat pangkat ganjil dengan tanda berselang-seling, dan setiap orde yang lebih tinggi menambah satu suku baru. Pangkat genap tidak muncul karena seluruh turunan berorde genap dari sinus di titik nol bernilai nol. Program berikut menghitung hampiran tersebut pada tiga titik dengan empat pilihan orde, lalu membandingkannya dengan nilai np.sin pada titik yang sama.

python Contoh: polinomial Taylor sin(x) dibandingkan np.sin
import math
import numpy as np

def taylor_sin(x, orde):
    suku = 0.0
    for k in range(orde // 2 + 1):
        pangkat = 2 * k + 1
        suku += (-1.0) ** k * x**pangkat / math.factorial(pangkat)
    return suku

for x in (0.5, 1.0, 3.0):
    for orde in (1, 3, 5, 7):
        hampiran = taylor_sin(x, orde)
        print(f"x = {x:3.1f}, orde {orde} : hampiran = {hampiran: .6f}, sin eksak = {np.sin(x):.6f}")
    print()
text Keluaran
x = 0.5, orde 1 : hampiran =  0.500000, sin eksak = 0.479426
x = 0.5, orde 3 : hampiran =  0.479167, sin eksak = 0.479426
x = 0.5, orde 5 : hampiran =  0.479427, sin eksak = 0.479426
x = 0.5, orde 7 : hampiran =  0.479426, sin eksak = 0.479426

x = 1.0, orde 1 : hampiran =  1.000000, sin eksak = 0.841471
x = 1.0, orde 3 : hampiran =  0.833333, sin eksak = 0.841471
x = 1.0, orde 5 : hampiran =  0.841667, sin eksak = 0.841471
x = 1.0, orde 7 : hampiran =  0.841468, sin eksak = 0.841471

x = 3.0, orde 1 : hampiran =  3.000000, sin eksak = 0.141120
x = 3.0, orde 3 : hampiran = -1.500000, sin eksak = 0.141120
x = 3.0, orde 5 : hampiran =  0.525000, sin eksak = 0.141120
x = 3.0, orde 7 : hampiran =  0.091071, sin eksak = 0.141120

Pada x=0.5x = 0.5, hampiran orde tujuh sudah cocok sampai keenam angka desimal, sedangkan pada x=3.0x = 3.0 orde yang sama masih menyisakan selisih sekitar 0.050.05. Hampiran Taylor bersifat lokal, yaitu akurat di dekat titik pusatnya dan melemah ketika xx menjauh. Serangkaian suku yang lebih banyak tetap memperbaiki hasil pada titik jauh, tetapi jumlah yang diperlukannya membesar, dan pola itu perlu diperhitungkan setiap kali deret digunakan sebagai pengganti fungsi.

Deret eksponensial diperiksa dengan pola yang sama, yaitu menambahkan suku xk/k!x^k/k! sampai jumlah sukunya memadai. Program berikut menggunakan dua titik, yaitu x=1x = 1 yang dekat dengan titik pusat dan x=2x = 2 yang sedikit lebih jauh.

python Contoh: deret Taylor e^x dibandingkan np.exp
import math
import numpy as np

def taylor_exp(x, suku):
    total = 0.0
    for k in range(suku):
        total += x**k / math.factorial(k)
    return total

for x in (1.0, 2.0):
    for n in (3, 5, 10, 15):
        hampiran = taylor_exp(x, n)
        print(f"x = {x:3.1f}, {n:2d} suku : hampiran = {hampiran:.6f}, np.exp = {np.exp(x):.6f}")
    print()
text Keluaran
x = 1.0,  3 suku : hampiran = 2.500000, np.exp = 2.718282
x = 1.0,  5 suku : hampiran = 2.708333, np.exp = 2.718282
x = 1.0, 10 suku : hampiran = 2.718282, np.exp = 2.718282
x = 1.0, 15 suku : hampiran = 2.718282, np.exp = 2.718282

x = 2.0,  3 suku : hampiran = 5.000000, np.exp = 7.389056
x = 2.0,  5 suku : hampiran = 7.000000, np.exp = 7.389056
x = 2.0, 10 suku : hampiran = 7.388713, np.exp = 7.389056
x = 2.0, 15 suku : hampiran = 7.389056, np.exp = 7.389056

Sepuluh suku sudah cukup untuk keenam angka desimal pada kedua titik, dan lima belas suku menutup seluruh selisih yang tersisa. Konvergensi exe^x berlangsung lebih merata dibandingkan dengan sin⁡x\sin x karena sukunya selalu positif dan faktorialnya tumbuh lebih cepat daripada pangkatnya. Perbandingan semacam ini menjadikan jumlah suku sebagai keputusan yang didukung data, bukan tebakan.

Konvergensi pada grafik#

Grafik berikut menggambar sin⁡x\sin x beserta empat polinomial Taylor-nya pada rentang yang lebar, dari −7-7 sampai 77. Skripnya disimpan sebagai berkas yang dapat disunting, dan keluarannya berupa berkas SVG yang disematkan di bawah. Pola yang perlu dicari adalah rentang tempat setiap kurva masih menempel pada sinus sebelum akhirnya menyimpang jauh di kedua ujung.

python gambar_taylor.py
import math
import numpy as np
import matplotlib.pyplot as plt

def taylor_sin(x, orde):
    suku = np.zeros_like(x)
    for k in range(orde // 2 + 1):
        pangkat = 2 * k + 1
        suku += (-1.0) ** k * x**pangkat / math.factorial(pangkat)
    return suku

x = np.linspace(-7, 7, 500)
fig, ax = plt.subplots(figsize=(6, 3.2))
ax.plot(x, np.sin(x), color="#241f31", linewidth=2.5, label="sin(x) eksak")
for orde in (1, 3, 5, 7):
    ax.plot(x, taylor_sin(x, orde), linewidth=1.4, label=f"orde {orde}")
ax.set_ylim(-2.5, 2.5)
ax.set_xlabel("x")
ax.set_ylabel("nilai")
ax.set_title("Polinomial Taylor sin(x) di sekitar titik nol")
ax.legend(loc="lower left", fontsize=8)
ax.grid(True, linestyle=":", linewidth=0.6)
fig.savefig("hampiran-taylor.svg")
Hampiran Taylor sin(x) untuk orde 1, 3, 5, dan 7

Keempat polinomial menempel rapat pada sinus di sekitar titik nol, kemudian melebar jauh pada ujung kiri dan kanan grafik. Polinomial tidak mungkin berperilaku periodik, sehingga kesesuaian di seluruh garis bilangan memang tidak dapat diharapkan dari satu polinomial. Setiap fungsi juga memiliki radius konvergensi (radius of convergence), yaitu rentang di sekitar titik pusat tempat deretnya masih menuju nilai fungsi tersebut.

Demo interaktif: orde polinomial yang dapat diatur#

Demo berikut menggambar sin⁡x\sin x sebagai kurva hitam beserta polinomial Taylor orde pilihan sebagai kurva merah. Geser penggeser orde dari 11 sampai 1515, lalu amati rentang sekitar nol yang makin melebar seiring naiknya orde. Pada orde rendah, kurva merah hanya benar di sekitar nol, sedangkan pada orde 1515 kesesuaiannya menjangkau hampir seluruh lebar gambar sebelum akhirnya menyimpang di tepi.

Di mana hal ini ditemui dalam kode#

Deret Taylor bekerja di balik banyak operasi floating point sehari-hari. Banyak library matematis menghitung sin⁡\sin, cos⁡\cos, dan exp⁡\exp pada rentang kecil melalui evaluasi polinomial yang bentuknya diturunkan dari deret Taylor, kemudian dipersempit dengan identitas trigonometri untuk argumen besar. Keluaran pada topik ini memperlihatkan sifat yang dimanfaatkan library tersebut, yaitu beberapa suku pertama sudah cukup bila argumennya dekat dengan titik pusat.

Fungsi aktivasi pada machine learning menggunakan alasan yang sama ketika kecepatan lebih penting daripada presisi penuh. Hampiran tanh berbasis polinomial atau pecahan rasional memangkas biaya perhitungan pada lapisan yang besar, dan nilai errornya dikendalikan dengan jumlah suku, persis tabel orde pada bagian sebelumnya. Kebiasaan yang dibawa dari topik ini adalah menetapkan jumlah suku berdasarkan pengukuran terhadap fungsi pembandingnya, bukan memperkirakannya tanpa data.

Ringkasan#

  • Deret dinilai melalui jumlah parsialnya, dan deret geometri ∑k=1∞rk\sum_{k=1}^{\infty} r^k konvergen ke r/(1−r)r/(1-r) untuk ∣r∣<1|r| < 1.
  • Deret Taylor menghampiri fungsi halus dengan polinomial yang koefisiennya berasal dari turunan di satu titik pusat.
  • Ketelitian bertambah mengikuti orde, tetapi melemah ketika xx menjauh dari titik pusat, dan setiap deret memiliki radius konvergensinya sendiri.
  • Jumlah suku yang diperlukan ditetapkan dari perbandingan langsung terhadap np.sin dan np.exp, bukan dari perkiraan.

Referensi#