Sabtu, 28 Maret 2020

Bagaimana sebuah komputer dapat menghitung akar dari suatu persamaan polinomial? Komputer ‘tidak secerdas manusia’, tetapi perhitungannya cepat. Oleh karena itu, metode numerik lumrah dipakai dalam metode komputasi dibanding metode analitik. Metode numerik salah satunya berpusat pada perhitungan secara berulang sehingga hasil akhirnya semakin mendekati nilai sebenarnya atau nilai analitik. Salah satu metode numerik yang paling mudah untuk menyelesaikan suatu persamaan adalah metode biseksi (“bisection method”).

Anggap kita mempunyai sebuah fungsi f(x) dimana r merupakan salah satu akar dari f(x) sehingga f(r) = 0. Pertama-tama, kita akan mempunyai seri x1, x2, …, xn dengan xn paling mendekati nilai r. x1 dan x2 harus dipilih sehingga r berada di antara keduanya atau x1 < r < x2. Karena f(r) = 0, maka f(x1) dan f(x2) harus memiliki tanda yang berbeda sehingga f(x0)*f(x1) < 0. Sementara itu, x3 adalah nilai tengah dari x1 dan x2 yang diharapkan lebih mendekati nilai r dibandingkan pendahulunya, maka: 
x3 = 0.5 * (x1 + x2)
Kemudian, kita hitung lagi f(x3): Apakah bernilai positif atau negatif? Jika bernilai positif, maka x3 harus dipasangkan dengan yang nilainya negatif dan sebaliknya. Nilai r harus tetap “dikurung” oleh sepasang xi yang baru, sehingga x4 akan dipilih menjadi nilai tengah dari x1 dan x3 ataukah nilai tengah dari x3 dan x2. Seterusnya, hingga mencapai nilai presisi yang diinginkan. (Diterjemahkan dengan penyuntingan dari “Numerical Methods” oleh Chasnov, 2012)

Metode biseksi merupakan metode numerik yang masih terbilang sederhana. Untuk memahaminya, menghitung secara manual menggunakan tabel layak untuk di coba. Berikut adalah contoh menyelesaikan akar dari fungsi kuadrat sederhana f(x) = x2 – 25.

Akar pertama, tebakan awal x1 = -6 dan x2 = -1.

iterationx1x2x_midf1f2f_mid
1-6.000-1.000-3.50011.000-24.000-12.750
2-6.000-3.500-4.75011.000-12.750-2.440
3-6.000-4.750-5.38011.000-2.4403.890
4-5.380-4.750-5.0603.890-2.4400.630
5-5.060-4.750-4.9100.630-2.440-0.930
6-5.060-4.910-4.9800.630-0.930-0.160
7-5.060-4.980-5.0200.630-0.1600.230
8-5.020-4.980-5.0000.230-0.1600.040
9-5.000-4.980-4.9900.040-0.160-0.060
10-5.000-4.990-5.0000.040-0.060-0.010

Akar kedua, tebakan awal x1 = 0 dan x2 = 7.

iterationx1x2x_midf1f2f_mid
10.0007.0003.500-25.00024.000-12.750
23.5007.0005.250-12.75024.0002.560
33.5005.2504.380-12.7502.560-5.860
44.3805.2504.810-5.8602.560-1.840
54.8105.2505.030-1.8402.5600.310
64.8105.0304.920-1.8400.310-0.780
74.9205.0304.980-0.7800.310-0.230
84.9805.0305.000-0.2300.3100.040
94.9805.0004.990-0.2300.040-0.100
104.9905.0005.000-0.1000.040-0.030

Pengulangan/iteration dapat terus dilanjutkan sampai selisih x1 dan x2 kurang dari nilai presisi tertentu. 
Jika kita plot x1, x2, dan x_mid pada sebuah grafik, x1 dan x2 terus mengerucut ke arah nilai akar r (garis putus-putus) sejalan dengan nilai tengahnya x_mid. (Sehingga metode ini dinamai metode biseksi)
Fungsi sda. tetapi x1 = 0 dan x2 = 30.

Algoritma yang kita lakukan pada penghitungan tabel dapat kita tuliskan kembali ke dalam bahasa pemrograman. Berikut adalah contoh implementasi algoritma metode biseksi dalam naskah kode Python.
"""
contoh metode numerik biseksi
Alwan Darussalam (28/03/2020)
"""

# fungsi tes f(x) = x^2 - 25
fun = lambda x: x**2 - 25

x0 = 0.0
x1 = 30.0
conv = 1e-5
max_iter = 100 

f0 = fun(x0)
f1 = fun(x1)

#collect_x0 = [x0]
#collect_x1 = [x1]

# syarat metode bisection berlaku hanya jika f0*f1 < 0
if f0 * f1 < 0:
    for i in range(max_iter):
        x2 = x0 + 0.5 * (x1 - x0)
        f2 = fun(x2)

        if f0 * f2 < 0:
            x1 = x2 # geser x1 ke kiri
        else:
            x0 = x2 # geser x0 ke kanan
#        collect_x0.append(x0)
#        collect_x1.append(x1)       
        if abs(f2) <= conv:
            print("Perhitungan konvergen di x =", x2)
            break # menghentikan loop
    r = x2
    print('Sehingga, r=', r, 'f(r)=', f2)
else:
    print("r tidak terkurung, ubah nilai x0 atau x1")

Metode biseksi sudah terimplementasi secara praktis dalam SciPy. (scipy.optimize.bisect) Masukan yang diperlukan cukup fungsi yang akan diselesaikan serta tebakan pertama untuk x1 dan x2. Walaupun begitu, menulis naskah metode biseksi dari awal sangat bagus untuk latihan memahami algoritma pemrograman.

Post a Comment:

EXPERIRON

Jika hidup dapat diibaratkan sebagai kumpulan gelombang baik dan gelombang buruk, dapatkah kita mengukur pengalaman sebagai mode diskrit yang terbentuk akibat superposisi keduanya?