140310220010
KN-9
PERSAMAAN
DIFERENSIAL BIASA
Nama : Rajib Rafsanjani
NPM : 140310220010
Waktu : 15.00-16.00
LABORATORIUM KOMPUTASI
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS PADJADJARAN
2023
LABORATORIUM KOMPUTASI
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN
ALAM
UNIVERSITAS PADJADJARAN
2023
LEMBAR PENGESAHAN
KN–9
PERSAMAAN DIFERENSIAL BIASA
NPM : 140310220010
Asisten
(………………………………)
I.Tujuan
Mampu memecahkan masalah persamaan diferensial biasa menggunakan metode Euler dan Runge-
Kutta.
II.Tugas Percobaan
Listing Program :
#EULER MAJU
#a
print("a")
import numpy as np
t0 = 0
y0 = input("Masukkan nilai y0 :")
xn = 0.1
h1 = 0.01
h2 = 0.001
h3 = 0.0001
n1 = int((xn - t0)/h1)
n2 = int((xn - t0)/h2)
n3 = int((xn - t0)/h3)
def f(y,t) :
return 5*np.exp(-0.2*t**2) - y**2
t1 = np.zeros(n1+1)
y1 = np.zeros(n1+1)
t2 = np.zeros(n2+1)
y2 = np.zeros(n2+1)
t3 = np.zeros(n3+1)
y3 = np.zeros(n3+1)
t1[0] = t0
y1[0] = y0
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
y1 [i + 1] = y1[i] + h1 * f(y1[i],t1[i])
t1 [i + 1] = t1[i] + h1
for i in range (0, n2) :
y2 [i + 1] = y2[i] + h2 * f(y2[i],t2[i])
t2 [i + 1] = t2[i] + h2
for i in range (0, n3) :
y3 [i + 1] = y3[i] + h3 * f(y3[i],t3[i])
t3 [i + 1] = t3[i] + h3
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
def f(y,t) :
return 1 - t * y**2
for i in range (0, n1) :
y1 [i + 1] = y1[i] + h1 * f(y1[i],t1[i])
t1 [i + 1] = t1[i] + h1
for i in range (0, n2) :
y2 [i + 1] = y2[i] + h2 * f(y2[i],t2[i])
t2 [i + 1] = t2[i] + h2
for i in range (0, n3) :
y3 [i + 1] = y3[i] + h3 * f(y3[i],t3[i])
t3 [i + 1] = t3[i] + h3
print("Nilai y(0.1) dengan h = 0.01 :")
print(y1[-1])
print("Nilai y(0.1) dengan h = 0.001 :")
print(y2[-1])
print("Nilai y(0.1) dengan h = 0.0001 : ")
print(y3[-1])
print("==============================================================
===========")
#c
print("c")
t1[0] = t0
y1[0] = y0
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
y0 = input("Masukkan nilai y0 :")
def f(y,t) :
return np.exp(-t) - 10*y
for i in range (0, n1) :
y1 [i + 1] = y1[i] + h1 * f(y1[i],t1[i])
t1 [i + 1] = t1[i] + h1
for i in range (0, n2) :
y2 [i + 1] = y2[i] + h2 * f(y2[i],t2[i])
t2 [i + 1] = t2[i] + h2
for i in range (0, n3) :
y3 [i + 1] = y3[i] + h3 * f(y3[i],t3[i])
t3 [i + 1] = t3[i] + h3
print("Nilai y(0.1) dengan h = 0.01 :")
print(y1[-1])
print("Nilai y(0.1) dengan h = 0.001 :")
print(y2[-1])
print("Nilai y(0.1) dengan h = 0.0001 : ")
print(y3[-1])
Tampilan Program :
Analisa Program :
Program di atas menggunakan metode Euler untuk menyelesaikan persamaan diferensial
biasa (ODE) dengan membagi interval [t0, xn] menjadi langkah-langkah yang lebih kecil
dengan menggunakan tiga nilai h yang berbeda (h1, h2, h3).
Analisisnya dapat diuraikan sebagai berikut:
a. Persamaan diferensial yang diselesaikan adalah: dy/dt = 5 * exp(-0.2 * t^2) - y^2
Langkah-langkah yang diambil:
Menginisialisasi variabel t0, y0, xn sebagai nilai awal, nilai y0 diambil berdasarkan
angka yang diinput .
Menghitung jumlah langkah n1, n2, dan n3 berdasarkan nilai h1, h2, dan h3.
Membuat array t1, y1, t2, y2, t3, y3 untuk menyimpan nilai-nilai t dan y pada setiap
langkah.
Melakukan iterasi menggunakan metode Euler untuk menghitung nilai y pada setiap
langkah.
Menampilkan nilai y(0.1) yang dihitung menggunakan h1, h2, dan h3.
b. Persamaan diferensial yang diselesaikan adalah: dy/dt = 1 - t * y^2
Langkah-langkah yang diambil:
Menginisialisasi kembali variabel y0 sebagai nilai yang diinput
Mengulangi proses yang sama seperti pada bagian a untuk menghitung dan
menampilkan nilai y(0.1) menggunakan h1, h2, dan h3.
c. Persamaan diferensial yang diselesaikan adalah: dy/dt = exp(-t) - 10 * y
Langkah-langkah yang diambil:
Menginisialisasi kembali variabel y0 sebagai nilai yang diinput .
Mengulangi proses yang sama seperti pada bagian a untuk menghitung dan
menampilkan nilai y(0.1) menggunakan h1, h2, dan h3.
Analisis program ini menunjukkan penggunaan metode Euler untuk menyelesaikan
persamaan diferensial biasa dengan langkah-langkah yang lebih kecil. Semakin kecil nilai h,
semakin akurat hasil yang diperoleh. Nilai h berpengaruh terhadap hasil dan keakuratannya.
2. Selesaikan persoalan no. 1 untuk menentukan 𝑦(0.1) menggunakan metode RK-4! Kemudian
bandingkan hasilnya dengan metode Forward Euler.
Listing Program :
#RUNGE-KUTTA 4
#a
print("a")
import numpy as np
t0 = 0
y0 = input("Masukkan nilai y0 :")
xn = 0.1
h1 = 0.01
h2 = 0.001
h3 = 0.0001
n1 = int((xn - t0)/h1)
n2 = int((xn - t0)/h2)
n3 = int((xn - t0)/h3)
def f(y,t) :
return 5*np.exp(-0.2*t**2) - y**2
t1 = np.zeros(n1+1)
y1 = np.zeros(n1+1)
t2 = np.zeros(n2+1)
y2 = np.zeros(n2+1)
t3 = np.zeros(n3+1)
y3 = np.zeros(n3+1)
t1[0] = t0
y1[0] = y0
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
t2[i+1] = t2[i] + h2
for i in range (0, n3) :
k1 = h3 * f(y3[i], t3[i])
k2 = h3 * f(y3[i] + h3/2, t3[i] + k1/2)
k3 = h3 * f(y3[i] + h3/2, t3[i] + k2/2)
k4 = h3 * f(y3[i] + h3, t3[i] + k3)
y3[i+1] = y3[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t3[i+1] = t3[i] + h3
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
def f(y,t) :
return 1 - t * y**2
for i in range (0, n1) :
k1 = h1 * f(y1[i], t1[i])
k2 = h1 * f(y1[i] + h1/2, t1[i] + k1/2)
k3 = h1 * f(y1[i] + h1/2, t1[i] + k2/2)
k4 = h1 * f(y1[i] + h1, t1[i] + k3)
y1[i+1] = y1[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t1[i+1] = t1[i] + h1
for i in range (0, n2) :
k1 = h2 * f(y2[i], t2[i])
k2 = h2 * f(y2[i] + h2/2, t2[i] + k1/2)
k3 = h2 * f(y2[i] + h2/2, t2[i] + k2/2)
k4 = h2 * f(y2[i] + h2, t2[i] + k3)
y2[i+1] = y2[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t2[i+1] = t2[i] + h2
for i in range (0, n3) :
k1 = h3 * f(y3[i], t3[i])
k2 = h3 * f(y3[i] + h3/2, t3[i] + k1/2)
k3 = h3 * f(y3[i] + h3/2, t3[i] + k2/2)
k4 = h3 * f(y3[i] + h3, t3[i] + k3)
y3[i+1] = y3[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t3[i+1] = t3[i] + h3
print("Nilai y(0.1) dengan h = 0.01 :")
print(y1[-1])
print("Nilai y(0.1) dengan h = 0.001 :")
print(y2[-1])
print("Nilai y(0.1) dengan h = 0.0001 : ")
print(y3[-1])
print("==================================================================
=======")
#c
print("c")
t1[0] = t0
y1[0] = y0
t2[0] = t0
y2[0] = y0
t3[0] = t0
y3[0] = y0
y0 = input("Masukkan nilai y0 :")
def f(y,t) :
return np.exp(-t) - 10*y
for i in range (0, n1) :
k1 = h1 * f(y1[i], t1[i])
k2 = h1 * f(y1[i] + h1/2, t1[i] + k1/2)
k3 = h1 * f(y1[i] + h1/2, t1[i] + k2/2)
k4 = h1 * f(y1[i] + h1, t1[i] + k3)
y1[i+1] = y1[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t1[i+1] = t1[i] + h1
for i in range (0, n2) :
k1 = h2 * f(y2[i], t2[i])
k2 = h2 * f(y2[i] + h2/2, t2[i] + k1/2)
k3 = h2 * f(y2[i] + h2/2, t2[i] + k2/2)
k4 = h2 * f(y2[i] + h2, t2[i] + k3)
y2[i+1] = y2[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t2[i+1] = t2[i] + h2
for i in range (0, n3) :
k1 = h3 * f(y3[i], t3[i])
k2 = h3 * f(y3[i] + h3/2, t3[i] + k1/2)
k3 = h3 * f(y3[i] + h3/2, t3[i] + k2/2)
k4 = h3 * f(y3[i] + h3, t3[i] + k3)
y3[i+1] = y3[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t3[i+1] = t3[i] + h3
print("Nilai y(0.1) dengan h = 0.01 :")
print(y1[-1])
print("Nilai y(0.1) dengan h = 0.001 :")
print(y2[-1])
print("Nilai y(0.1) dengan h = 0.0001 : ")
print(y3[-1])
Tampilan Program :
Analisa Program :
Program di atas mengimplementasikan metode Runge-Kutta orde 4 (RK4) untuk
menyelesaikan persamaan diferensial biasa (ODE) dalam tiga kasus yang berbeda. Program
ini menggunakan beberapa h dan menghitung nilai y pada titik t = 0.1.
Kasus a:
Persamaan diferensial: y' = 5e^(-0.2t^2) - y^2
Metode RK4 digunakan untuk mencari solusi numerik dari ODE ini.
Program ini menghitung nilai y(0.1) dengan tiga nilai h yang berbeda (0.01, 0.001,
0.0001).
Hasilnya dicetak dan ditampilkan.
Kasus b:
Persamaan diferensial: y' = 1 - ty^2
Metode RK4 digunakan untuk mencari solusi numerik dari ODE ini.
Program ini juga menghitung nilai y(0.1) dengan tiga nilai h yang berbeda (0.01,
0.001, 0.0001).
Hasilnya dicetak dan ditampilkan.
Kasus c:
Persamaan diferensial: y' = e^(-t) - 10y
Metode RK4 digunakan untuk mencari solusi numerik dari ODE ini.
Program ini juga menghitung nilai y(0.1) dengan tiga nilai h yang berbeda (0.01,
0.001, 0.0001).
Hasilnya dicetak dan ditampilkan.
Perbandingan dengan metode Euler Maju (Forward Euler): Metode RK4 memberikan hasil
yang lebih akurat dibandingkan dengan metode Euler Maju (Forward Euler) dalam
menyelesaikan ODE. RK4 menggunakan pendekatan yang lebih rumit dengan menggunakan
empat langkah iterasi (k1, k2, k3, k4) untuk menghitung nilai y pada setiap langkah. Hal ini
menghasilkan estimasi yang lebih baik untuk solusi numerik ODE.
Dalam kasus-kasus di atas, dengan menggunakan nilai h yang sama (0.01, 0.001, 0.0001),
metode RK4 memberikan hasil yang lebih akurat dibandingkan dengan metode Euler Maju. Ini
terlihat dari perbedaan nilai y(0.1) yang dihasilkan oleh kedua metode pada setiap kasus.
Jadi, dalam analisis perbandingan dengan metode Euler Maju, metode RK4 memberikan solusi
numerik yang lebih akurat dan dapat diandalkan untuk ODE.
3. Apabila diketahui suatu fungsi diferensial dengan nilai awal 𝑦0 pada titik 𝑡0, bagaimana cara
menentukan nilai 𝑦 pada suatu titik 𝑡 yang terletak sebelum 𝑡0 (𝑡 < 𝑡0)? Metode apa yang digunakan
dan turunkan rumusnya!
Jawab :
Untuk menentukan nilai 𝑦 pada suatu titik 𝑡 yang terletak sebelum 𝑡0 (𝑡 < 𝑡0), yaitu dengan
menggunakan metode Euler Mundur (Backward Euler method). Metode ini adalah metode numerik
yang dapat digunakan untuk menyelesaikan persamaan diferensial biasa (ODE) dengan kondisi awal.
Dalam metode Euler Mundur, kita menggunakan pendekatan ke belakang untuk mencari nilai 𝑦 pada
titik 𝑡. Rumusnya adalah sebagai berikut:
di mana:
𝑦𝑛 adalah nilai 𝑦 pada titik 𝑡ₙ
𝑦𝑛₋₁ adalah nilai 𝑦 pada titik sebelumnya, 𝑡ₙ₋₁
ℎ adalah langkah waktu (interval waktu antara 𝑡ₙ dan 𝑡ₙ₋₁)
𝑓(𝑡ₙ, 𝑦ₙ) adalah fungsi diferensial yang ingin diselesaikan pada titik 𝑡ₙ
II.Tugas Akhir
1. Jelaskan mengapa nilai ℎ sangat berpengaruh terhadap error yang dihasilkan!
Dalam metode numerik seperti metode Euler atau metode Runge-Kutta, kita mengaproksimasi
turunan sebuah fungsi dengan membagi rentang interval kecil ℎ. Semakin kecil nilai ℎ, semakin
halus aproksimasi turunan yang kita peroleh. Dalam hal ini, jika kita menggunakan nilai ℎ yang
terlalu besar, kita dapat kehilangan perubahan signifikan dalam fungsi dan akurasi aproksimasi
turunan akan menurun. Sebaliknya, jika kita menggunakan nilai ℎ yang terlalu kecil, maka itu
akan meningkatkan akurasi
2. kiPergerakan suatu sistem massa, pegas dan damper mengalami pergerakan setelah gaya aktuasi
F(t) diberikan seperti gambar dibawah ini.
Jika persamaan pergerakan oleh massa ini diberikan oleh hukum Newton berupa persamaan:
𝑚𝑥̈ = −𝑘𝑥 − 𝑐𝑥̇ + 𝐹(𝑡) Jika 𝑥(0) = 𝑥̇(0) = 0 , 𝑚 = 5000 𝑘𝑔, 𝑐 = 5000𝑁𝑠/𝑚 , 𝑘 = 50000𝑁/𝑚 dan
gaya aktuasi sebesar 5000 𝑁 untuk 0 ≤ 𝑡 ≤ 1 detik dan 0 𝑁untuk𝑡 > 1 detik. Maka hitunglah
pergerakan dari massa benda selama 10 detik !
3. 𝑑𝑦/𝑑𝑡 = 1 + 𝑦 exp(−𝑡) dengan 𝑦(1) = 10 dan ℎ ∈ {0.1 ; 0.01} . Tentukan nilai 𝑦(0)
Jawab :
Listing Program :
#EULER MUNDUR
#a
print("a")
import numpy as np
t0 = 1
y0 = 10
xn = 0
h1 = 0.1
h2 = 0.01
n1 = int((t0 - xn)/h1)
n2 = int((t0 - xn)/h2)
def f(y,t) :
return 1 + y * np.exp(-t)
t1 = np.zeros(n1+1)
y1 = np.zeros(n1+1)
t2 = np.zeros(n2+1)
y2 = np.zeros(n2+1)
t1[0] = t0
y1[0] = y0
t2[0] = t0
y2[0] = y0
y1 [i + 1] = y1[i] - h1 * f(y1[i],t1[i])
t1 [i + 1] = t1[i] - h1
for i in range (0, n2) :
y2 [i + 1] = y2[i] - h2 * f(y2[i],t2[i])
t2 [i + 1] = t2[i] - h2
Tampilan Program :
KESIMPULAN
Metode Euler Maju: Metode Euler Maju adalah salah satu metode numerik yang paling sederhana
untuk memecahkan persamaan diferensial biasa. Ini menggunakan pendekatan garis lurus untuk
mengaproksimasi solusi dengan memperhitungkan turunan fungsi pada suatu titik. Kelebihan dari
metode ini adalah kemudahan implementasi dan komputasi yang cepat. Namun, metode ini cenderung
menghasilkan kesalahan yang lebih besar dibandingkan dengan metode yang lebih canggih.
Metode Euler Mundur: Metode Euler Mundur juga menggunakan pendekatan garis lurus, tetapi
dengan menggunakan turunan fungsi pada titik yang akan diestimasi. Metode ini lebih stabil daripada
metode Euler Maju dan lebih cocok untuk persamaan diferensial yang memiliki solusi yang tidak
stabil atau berubah tiba-tiba. Namun, metode Euler Mundur mungkin memerlukan iterasi untuk
menemukan nilai solusi yang akurat karena, seperti metode Euler Maju, nilai solusi seringkali tidak
stabil
Metode Runge-Kutta: Metode ini adalah metode numerik yang lebih canggih dan akurat untuk
memecahkan persamaan diferensial biasa, yang menghitung rata-rata tertimbang dari beberapa
pendekatan garis lurus untuk mengaproksimasi solusi. Metode ini lebih sering digunakan dalam
simulasi numerik dan komputasi ilmiah karena memberikan hasil yang lebih akurat daripada metode
Euler Maju atau Euler Mundur.