Kod yang dipaparkan dalam dokumen ini diuji menggunakan Python versi 3.10.12 bersama sandaran-sandaran berikut:
- numpy=1.25.0
- matplotlib=3.7.1
Pers. 5.7 yang muncul dalam bahagian 5.1 berbentuk begini \[ X\frac{e^X}{e^X-1} = 5. \tag{A.1}\]
Agak sukar untuk menyelesaikan persamaan ini pakai tangan jadi kita rujuk kaedah berangka.
Secara ringkasnya, kaedah berangka cuba mendapat jawapan penghampiran melalui pemanipulasian angka. Bandingkan dengan kaedah beraljabar yang mendapat jawapan tepat melalui mantik terhadap simbol. Contoh kaedah berangka ialah pencarian titik silang antara graf dengan garis \(y=0\) melalui cuba jaya berulang kali.
Bagi mendapatkan nilai \(X\) dalam pers. A.1, kita harus akui ia sama dengan \[ X\frac{e^X}{e^X-1} - 5 = 0 \] lalu kita gantikan 0 menjadi pembolehubah \(y\), \[ X\frac{e^X}{e^X-1} - 5 = y. \tag{A.2}\] Persamaan ini mewakili graf \(x\) melawan \(y\). Nilai \(X\) yang kita mahukan ialah apabila \(y=0\). Permasalahan ini telah bertukar menjadi permasalahan pencarian titik silang graf dengan garis \(y=0\).
Kaedah paling mudah nak faham dan buat untuk mencari titik silang graf dengan garis \(y=0\) ialah kaedah pembahagi dua. Langkah-langkahnya ialah seperti berikut:
kiri dan kanan. Jauh-jauh pun tidak mengapa asalkan titik persilangan itu berada di antara dua titik ini.tengah lalu kita peroleh dua julat: julat [kiri, tengah] dan julat [tengah, kanan].kiri=kiri dan kanan=tengah.kiri=tengah dan kanan=kanan.jarak antara kiri dan kanan lebih kecil dari ketepatan yang diinginkan. Ambil nilai tengah sebagai jawapan.Kod yang dipaparkan dalam dokumen ini diuji menggunakan Python versi 3.10.12 bersama sandaran-sandaran berikut:
```{python}
def persilangan_pembahagi_dua(
fungsi, # fungsi yang kita nak tahu puncanya (titik persilangan)
kiri: float,
kanan: float,
ketepatan: float = 1.0e-6
) -> float:
# [1] Pilih dua titik, `kiri` dan `kanan`.
jarak = abs(kanan-kiri)
had: int = 100 # Untuk letak had berapa kali boleh ulang
ulangan: int = 1 # Untuk kira berapa kali dah ulang
while jarak > ketepatan:
# [2] Dapatkan titik `tengah`
tengah = (kiri+kanan)/2.
# [3] Semak sama ada ada persilangan berlaku
# di julat pertama [`kiri`,`tengah`]
if (fungsi(kiri)*fungsi(tengah)) < 0:
# Jika ya:
# Balik ke langkah (1) dengan nilai baru kiri=kiri dan kanan=tengah
# Ulangan [1] Pilih dua titik, `kiri` dan `kanan`.
kiri = kiri
kanan = tengah
else:
# Jika tidak:
# Balik ke langkah (1) dengan nilai baru kiri=tengah dan kanan=kanan
# Ulangan [1] Pilih dua titik, `kiri` dan `kanan`.
kiri = tengah
kanan = kanan
# [4] Ulang langkah [1] - [3] sampai `jarak <= ketepatan`
jarak = abs(kanan-kiri)
# Kalau dah lebih had, kita keluar.
# Kita tak nak benda ni ulang sampai kiamat tak berhenti.
ulangan += 1
if ulangan == had:
raise ValueError(
f'Sudah {had} kali diulang tetapi masih tak jumpa jawapan.'
)
return tengah
```kiri dan kanan berpisah jauh sangat, maka pencarian titik persilangan akan ambil masa yang lama kerana jaraknya hanya dibahagi dua setiap kali.kiri dan kanan yang awal. Sekiranya tidak, maka kaedah ini tidak akan membuahkan apa-apa hasil.Sebelum kita mulakan penyelesaian, kita perlu tahu dahulu adakah fungsi yang kita ada ini bersilang dengan garis \(y=0\) tidak? Kita cuba lukis graf untuk tengok wujud ke tak persilangan tersebut. Oleh itu, kita takrifkan dulu fungsi untuk pers. A.2.
```{python}
import numpy as np
def formula(x: float) -> float:
return x*np.exp(x)/(np.exp(x) - 1) -5
```Kemudian, bolehlah kita lukis grafnya.
```{python}
import matplotlib.pyplot as plt
x = np.linspace(0.1, 10)
y = formula(x)
plt.plot(x, y)
plt.axhline(y=0, linewidth=0.8, color='black')
plt.show()
```
Nampaknya, titik persilangan tersebut berada di antara \(x=4\) dan \(x=6\). Kedua-dua nilai ini boleh jadi nilai kiri dan kanan asal untuk kaedah pembahagi dua.
Apabila sudah diketahui wujud titik persilangan, maka bolehlah kita gerakkan algoritma pencarian titik silang melalui pembahagian dua.
```{python}
jawapan = persilangan_pembahagi_dua(formula, kiri=4, kanan=6)
```Nilai x ialah 4.965113639831543 apabila y=0
Kita boleh semak jawapan ini dengan graf.
