Analisis Numerik Persamaan Diferensial Bandul Teredam
•
Computational Physics

Gaya yang bekerja pada bandul adalah
-
Gaya Berat, diambil hanya bagian tangensial (tegak lurus dengan arah ayunan). Negatif karena arahnya selalu berkebalikan dengan arah geraknya
-
Gaya gesek udara, bergantung pada kecepatan sudut
-
Gaya Tegang Tali, yang saling menghilangkan dengan bagian normal pada gaya gravitasi
Sehingga total dari gayanya menurut Hukum Newton II adalah
Karena digunakan sebagai variabel utama, dan (CATATAN: adalah percepatan pada sumbu tangensial dari gerak ayunan, selanjutnya akan didefinisikan sebagai waktu). Maka agar percepatan bisa menjadi percepatan sudut, harus dibagi yang merupakan panjang tali (radius ayunan)
Sehingga persamaan gaya menjadi
yang dapat disusun ulang sebagai
Kondisi & Persoalan
Diketahui bahwa:
- Koefisien redaman,
- Massa bandul,
- Panjang tali,
- Percepatan gravitasi,
- Langkah waktu, dan
Kondisi awal (pada ) adalah…
Artinya bandul disimpangkan sebesar 90 derajat dan dilepaskan dari keadaan diam.
CATATAN: Semakin kecil timestep maka hasil aproksimasi akan semakin baik. Karena metode iterasi digunakan untuk menghitung pada keadaan pada waktu saat ini dari keadaan pada waktu sebelumnya
Carilah sudut bandul dalam fungsi waktu untuk 18 detik pertama!
Solusi
Untuk menyelesaikan Persamaan Diferensial Biasa (PDB) orde-2, bisa dianggap sebagai 2 persamaan PDB orde-1. Maka dimisalkan bahwa
⚠️ Sayangnya pada permasalahan ini, tidak ada solusi eksak (dari metode analitik) yang bisa dijadikan perbandingan galat dari metode numerik yang akan digunakan.
Kode Python dan Analisis
Jadi konsep utama dari metode numerik adalah untuk menghitung nilai maka dibutuhkan nilai dari iterasi sebelumnya yang dikalikan dengan atau timestep, dan untuk menghitung maka dibutuhkan nilai dari iterasi sebelumnya yang juga dikalikan dengan . merupakan hasil dari persamaan diferensial biasa dari persoalan di atas.
Inisiasi Library Numpy dan Matplotlib Serta Mengatur Ukuran Grafik
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (12,7)
Inisiasi Tetapan dan Nilai Awal
g = 9.81 # percepatan gravitasi (m/s^2)
L = 1.2 # panjang tali (m)
m = 0.5 # massa (kg)
c = 0.16 # koefisien redaman (N.s/m)
t0 = 0 # waktu awal (s)
tf = 18 # waktu akhir (s)
theta0 = np.pi/2 # posisi awal (rad)
omega0 = 0 # kecepatan awal (rad/s)
Inisiasi Fungsi Persamaan Diferensial Orde 2 Yang Akan Didekati Solusinya
Terdapat tiga masukan yaitu t (waktu), theta (nilai sudut simpangan) pada waktu tertentu, omega (kecepatan sudut) pada waktu tertentu.
f = lambda t, theta, omega: -c/m * omega - g/L * np.sin(theta)
Inisiasi Fungsi-fungsi Metode Numerik
Fungsi-fungsi ini menyelesaikan persamaan diferensial orde dua dari bentuk dengan kondisi awal = y0
dan = y_dot_0
. Semua fungsi-fungsi di bawah membutuhkan enam masukan:
f
: sebuah fungsi yang menghitung turunan untuk nilait
,y
, dany'
tertentu.y0
: nilai awal paday_dot_0
: nilai awal padaxmin
: nilai minimum t untuk menyelesaikan persamaan diferensialxmax
: nilai maksimum t untuk menyelesaikan persamaan diferensialh
: ukuran langkah numerik
Metode Titik Tengah
Fungsi ini menghitung nilai y
pada setiap titik pada interval yang diberikan dengan menggunakan metode Midpoint. Solusi numerik dari persamaan diferensial dihitung menggunakan rumus iteratif, dimulai dari nilai awal y0
dan y_dot_0
pada titik xmin
. Nilai y
dan y'
pada setiap iterasi dihitung berdasarkan nilai-nilai pada iterasi sebelumnya. Setelah mencapai xmax
, fungsi mengembalikan Array NumPy yang berisi nilai-nilai y
pada setiap titik dalam interval yang diberikan.
def MidPointODE(f, y0, y_dot_0, xmin, xmax, h):
# by default xmax is not included, we add h to address this
t = np.arange(xmin, xmax + h, h)
N = len(t)
y = np.zeros((N,2))
y[0] = [y0, y_dot_0]
for i in range(1, N):
tm = t[i-1] + h/2
ym = y[i-1] + h/2 * np.array([f(t[i-1], h * y[i-1, 0], y[i-1, 1]),
f(t[i-1], h * y[i-1, 0], y[i-1, 1])])
y[i] = y[i-1] + h * np.array([y[i-1, 1],
f(tm, ym[0], ym[1])])
return t, y
Metode Euler Termodifikasi (Metode Heun)
Fungsi ini menghitung nilai y
pada setiap titik pada interval yang diberikan dengan menggunakan metode Modified Euler. Solusi numerik dari persamaan diferensial dihitung menggunakan rumus iteratif, dimulai dari nilai awal y0
dan y_dot_0
pada titik xmin
. Nilai y
dan y'
pada setiap iterasi dihitung berdasarkan nilai-nilai pada iterasi sebelumnya. Setelah mencapai xmax
, fungsi mengembalikan Array NumPy yang berisi nilai-nilai y
pada setiap titik dalam interval yang diberikan.
def ModEulerODE(f, y0, y_dot_0, xmin, xmax, h):
# by default xmax is not included, we add h to address this
t = np.arange(xmin, xmax + h, h)
N = len(t)
y = np.zeros((N,2))
y[0] = [y0, y_dot_0]
for i in range(1, N):
slopeStart = np.array([y[i-1, 1],
f(t[i-1], y[i-1, 0], y[i-1, 1])])
yk1 = y[i-1, 0] + h * slopeStart[0]
yk2 =y[i-1, 1] + h * slopeStart[1]
slopeEnd = np.array([y[i-1, 1],
f(t[i], yk1, yk2)])
y[i] = y[i-1] + h/2 * (slopeStart + slopeEnd)
return t, y
Metode Runge-Kutta Orde 4
Algoritma fungsi:
- Buat sebuah array nilai t menggunakan fungsi
arange
dari NumPy, dimulai darixmin
dan berakhir dixmax
dengan ukuran langkah sebesarh
- Kemudian, inisialisasi sebuah matriks nol
y
, dengan bentuk(N, 2)
(N baris, 2 kolom), di manaN
adalah panjang arrayt
- Baris pertama
y
diatur ke nilai awaly0
dany_dot_0
, dan baris selanjutnya dihitung menggunakan metode Runge-Kutta orde keempat - Untuk setiap baris
i
(iterasi pengulangan for) dalamy
, fungsi menghitung empat kemiringank1
,k2
,k3
, dank4
menggunakan nilaiy
sebelumnya dan fungsi turunanf
- Kemiringan ini kemudian digabungkan menggunakan rata-rata berbobot untuk mendapatkan nilai baru
y
pada langkah waktu berikutnya - Bobot yang digunakan untuk rata-rata adalah 1/6, 1/3, 1/3, dan 1/6, sesuai dengan metode Runge-Kutta orde keempat. Akhirnya, fungsi mengembalikan array
t
dany
def RungeKutta4(f, y0, y_dot_0, xmin, xmax, h):
# by default xmax is not included, we add h to address this
t = np.arange(xmin, xmax + h, h)
N = len(t)
y = np.zeros((N, 2))
y[0] = [y0, y_dot_0]
for i in range(1, N):
k1 = h * np.array([y[i-1, 1], f(t[i-1], y[i-1, 0], y[i-1, 1])])
k2 = h * np.array([y[i-1, 1] + k1[1]/2, f(t[i-1] + h/2, y[i-1, 0] + k1[0]/2, y[i-1, 1] + k1[1]/2)])
k3 = h * np.array([y[i-1, 1] + k2[1]/2, f(t[i-1] + h/2, y[i-1, 0] + k2[0]/2, y[i-1, 1] + k2[1]/2)])
k4 = h * np.array([y[i-1, 1] + k3[1], f(t[i-1] + h, y[i-1, 0] + k3[0], y[i-1, 1] + k3[1])])
y[i] = y[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
return t, y
Metode Adam-Bashford Orde 4
Algoritma Fungsi:
t
: merupakan array yang memuat nilai-nilai waktu pada setiap langkah waktu yang diperoleh dengannp.arange()
N
: merupakan jumlah langkah waktu yang dilakukany
: merupakan array yang memuat nilai-nilai y dan turunannya pada tiap langkah waktu, yang diinisialisasi dengan kondisi awalfor i in range(1,4)
: merupakan loop for pertama yang digunakan untuk menghitung nilai-nilaiy
pada 4 langkah waktu pertama menggunakan metode Runge-Kutta Orde 4. Penjelasan dijabarkan pada fungsi Runge-Kutta Orde 4 di atasfor i in range(4,N)
: merupakan loop for kedua yang digunakan untuk menghitung nilai-nilaiy
pada langkah waktu selanjutnya menggunakan metode Adams-Bashforth orde 4thm
: merupakan variabel yang digunakan untuk menghitung nilaiy
pada langkah waktu ke-i+1
wm
: merupakan variabel yang digunakan untuk menghitung nilai turunan y pada langkah waktu ke-i+1
return t, y
: mengembalikan nilai array t dan y sebagai hasil dari perhitungan pendekatan
def AdamsBashforth4(f, y0, y_dot_0, xmin, xmax, h):
# by default xmax is not included, we add h to address this
t = np.arange(xmin, xmax + h, h)
N = len(t)
y = np.zeros((N, 2))
y[0] = [y0, y_dot_0]
for i in range(1, 4):
k1 = h * np.array([y[i-1, 1], f(t[i-1], y[i-1, 0], y[i-1, 1])])
k2 = h * np.array([y[i-1, 1] + k1[1]/2, f(t[i-1] + h/2, y[i-1, 0] + k1[0]/2, y[i-1, 1] + k1[1]/2)])
k3 = h * np.array([y[i-1, 1] + k2[1]/2, f(t[i-1] + h/2, y[i-1, 0] + k2[0]/2, y[i-1, 1] + k2[1]/2)])
k4 = h * np.array([y[i-1, 1] + k3[1], f(t[i-1] + h, y[i-1, 0] + k3[0], y[i-1, 1] + k3[1])])
y[i] = y[i-1] + (k1 + 2*k2 + 2*k3 + k4) / 6
for i in range(4,N):
thm = 55 * y[i-1, 1] - 59 * y[i-2, 1] + 37 * y[i-3, 1] - 9 * y[i-4, 1]
wm = 55 * f(t[i-1], y[i-1, 0], y[i-1, 1]) - 59 * f(t[i-2], y[i-2, 0], y[i-2, 1]) + 37 * f(t[i-3], y[i-3, 0], y[i-3, 1]) - 9 * f(t[i-4], y[i-4, 0], y[i-4, 1])
y[i] = y[i-1] + h/24 * np.array([thm, wm])
return t, y
Aproksimasi Hitungan dan Plot Grafik
Di mana t
adalah array dari waktu dari detik ke-0 sampai detik ke-18. Sementara, data[:,0]
(kolom ke-0) adalah array dari sudut simpangan dari detik ke-0 sampai detik ke-18. Dan kolom ke-1 dari data
adalah array kecepatan sudut dari detik ke-0 sampai detik ke-18. Di mana data
adalah hasil pendekatan dari beberapa metode
Digunakan Langkah Waktu 0.02
h = 0.02 # langkah waktu
t, modEuler = ModEulerODE(f, theta0, omega0, t0, tf, h)
t, midPoint = MidPointODE(f, theta0, omega0, t0, tf, h)
t, rk4 = RungeKutta4(f, theta0, omega0, t0, tf, h)
t, ab4 = AdamsBashforth4(f, theta0, omega0, t0, tf, h)
plt.plot(t, midPoint[:,0], label="Midpoint Method")
plt.plot(t, modEuler[:,0], label="Modified Euler's Method")
plt.plot(t, rk4[:,0], label="4th Order Runge-Kutta Method")
plt.plot(t, ab4[:,0], label="4th Order Adam-Bashford Method")
plt.legend()
plt.title("Grafik Sudut Simpangan Terhadap Waktu Pada Bandul Matematis Teredam")
plt.xlabel("Waktu (s)")
plt.ylabel("Simpangan (rad)")
plt.show()
Digunakan langkah waktu 0.001
h = 0.001 # langkah waktu
t, modEuler = ModEulerODE(f, theta0, omega0, t0, tf, h)
t, midPoint = MidPointODE(f, theta0, omega0, t0, tf, h)
t, rk4 = RungeKutta4(f, theta0, omega0, t0, tf, h)
t, ab4 = AdamsBashforth4(f, theta0, omega0, t0, tf, h)
plt.plot(t, midPoint[:,0], label="Midpoint Method")
plt.plot(t, modEuler[:,0], label="Modified Euler's Method")
plt.plot(t, rk4[:,0], label="4th Order Runge-Kutta Method")
plt.plot(t, ab4[:,0], label="4th Order Adam-Bashford Method")
plt.legend()
plt.title("Grafik Sudut Simpangan Terhadap Waktu Pada Bandul Matematis Teredam")
plt.xlabel("Waktu (s)")
plt.ylabel("Simpangan (rad)")
plt.show()
Bisa dilihat bahwa dengan langkah waktu yang lebih kecil, selisih dari keempat metode sangat kecil, dan grafik yang dihasilkan berhimpitan.