Komputasi Numerik
AP - 09
Persamaan Diferensial Biasa
Nama : Kevin Bazli Santoso
NPM : 140310220033
Hari/Tanggal : Jumat/26 May 2023
Waktu : 07:30 - 16:30
Asisten : Azhar Aiman Dzulfiqar
LABORATORIUM KOMPUTASI
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS PADJADJARAN
2023
LEMBAR PENGESAHAN
KN 09
Persamaan Diferensial Biasa
( )
1. Tujuan Praktikum
Dalam modul ini mahasiswa diharapkan mampu memecahkan masalah
persamaan diferensial biasa menggunakan metode Euler dan Runge – Kutta.
2. Tugas Pendahuluan
2.1. Diketahui PDB sebagai berikut:
• 𝑑𝑦
= 5 exp(−0.2 𝑡 2 ) − 𝑦 2 dengan 𝑦(0) = 0
𝑑𝑡
• 𝑑𝑦
+ 𝑡𝑦 2 = 1 dengan 𝑦(0) = 1.
𝑑𝑡
• 𝑑𝑦
+ 10𝑦 = exp(− 𝑡) dengan 𝑦(0) = 5
𝑑𝑡
Tentukan 𝑦(0.1) menggunakan metode Forward Euler! Gunakan variasi ℎ ∈
{0.01 ; 0.001 ; 0.0001}
𝑑𝑦
2.1.1. = 5 exp(−0.2 𝑡 2 ) − 𝑦 2 dengan 𝑦(0) = 0
𝑑𝑡
def f(y,t):
return 5*np.exp(-0.2*t**2)-y**2
for i in range(n-1):
y[i+1] = y[i]+ f(y[i], x[i])*h
x[i+1] = x[i]+h
2.1.2. 𝑑𝑦
+ 𝑡𝑦 2 = 1 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 1.
𝑑𝑡
2.1.2.1. Listingan program
h = float(input('masukan nilai h atau interval :
'))
x_akhir = 0.1
x_awal = 0
n = int((x_akhir-x_awal)/h)
y = np.zeros(n)
x = np.zeros(n)
y[0]= 1
x[0]= x_awal
def f(y,t):
return 1-t*y**2
for i in range(n-1):
y[i+1] = y[i]+ f(y[i], x[i])*h
x[i+1] = x[i]+h
2.1.3. 𝑑𝑦
+ 10𝑦 = exp(− 𝑡) 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 5
𝑑𝑡
def f(y,t):
return exp(-t)-10*y
for i in range(n-1):
y[i+1] = y[i]+ f(y[i], x[i])*h
x[i+1] = x[i]+h
• 𝑑𝑦
+ 𝑡𝑦 2 = 1 dengan 𝑦(0) = 1.
𝑑𝑡
• 𝑑𝑦
+ 10𝑦 = exp(− 𝑡) dengan 𝑦(0) = 5
𝑑𝑡
User akan pertama diminta untuk memasukan nilai h atu interval
yang diinginkan yang untuk kasus ini adalah ℎ ∈ {0.01 ; 0.001 ;
0.0001}. Setelah memasukkan nilai interval h, program akan
melakukan iterasi sebanyak yang diperlukan untuk mencapai
titik akhir yang ditentukan. Dalam setiap iterasi, nilai y dihitung
menggunakan rumus iteratif Forward Euler yaitu: y[i+1] = y[i] +
f(y[i], x[i])*h, di mana f(y,t) adalah fungsi yang diberikan dalam
PDB, dan x dan y adalah variabel yang menyimpan nilai x dan y
pada setiap langkah. Selain itu, program juga menggunakan
fungsi odeint dari library scipy untuk menghitung dan mencari
solusi eksak(analitik) dari PDB. Solusi eksak tersebut akan
digunakan untuk memperoleh nilai eksak pada titik akhir. Dalam
hal ini, kita menggunakan odeint dengan mengirimkan fungsi f,
nilai awal y[0], dan array t yang berisi nilai x dari setiap langkah
untuk memperoleh solusi eksak.
def f(y,t) :
return 5*np.exp(-0.2*t**2) - y**2
t = np.zeros(n+1)
y = np.zeros(n+1)
t[0] = t0
y[0] = y0
k = np.linspace(t0, xn, n)
sol = odeint(f, y0, t)
eksak = float(sol[-1])
error = abs (y[-1]-eksak)
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
print('\nnilai galat dari metode ini adalah : ',
error,"\n")
2.2.2. 𝑑𝑦
+ 𝑡𝑦 2 = 1 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 1
𝑑𝑡
def f(y,t) :
return 1 - t * y**2
t = np.zeros(n+1)
y = np.zeros(n+1)
t[0] = t0
y[0] = y0
k = np.linspace(t0, xn, n)
sol = odeint(f, y0, t)
eksak = float(sol[-1])
error = abs (y[-1]-eksak)
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
print('\nnilai galat dari metode ini adalah : ',
error,"\n")
2.2.3. 𝑑𝑦
+ 10𝑦 = exp(− 𝑡) 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 5
𝑑𝑡
2.2.3.1. Listing Program
t0 = 0
y0 = input("Masukkan nilai y0 : ")
h = float(input("Masukkan nilai interval : "))
xn = 0.1
n = int((xn - t0)/h)
def f(y,t) :
return np.exp(-t) - 10*y
t = np.zeros(n+1)
y = np.zeros(n+1)
t[0] = t0
y[0] = y0
k = np.linspace(t0, xn, n)
sol = odeint(f, y0, t)
eksak = float(sol[-1])
error = abs (y[-1]-eksak)
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
print('\nnilai galat dari metode ini adalah : ',
error,"\n")
Dapat dilihat bahwa nilai galat metode RK4 lebih kecil berarti lebih
mendekati nilai analitik
2.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 :
Metode yang digunakan adalah metode backward euler, metode ini
memiliki penerunan rumus yang mirip dengan metode forwar Euler.
Perbedaanya hanya ada di t yang dihasilkan yang dimana jika FE bernilai
maju BE akan bernilai mundur. Berikut penurunan rumusnya
Dari deret taylor
𝑦𝑖 ′′𝑖 ∆𝑥 2
𝑦𝑖−1 = 𝑦𝑖 − 𝑦𝑖 𝑖′ ∆𝑥 + − ⋯
2!
Jika nilai ∆𝑥 kecil, maka suku yang mengandung pangkat yang lebih
tinggi dari dua akan sangat kecil atau mendekati 0 sehingga dapat
diabaikan sehingga dapat disederhanakan menjadi persamaan
𝑦𝑖−1 = 𝑦𝑖 − 𝑦 𝑖′ ∆𝑥
Dengan demikian, dapat disimpulkan bahwa dalam metode Euler,
kemiringan 𝛷 = 𝑦𝑖 ′ = 𝑓(𝑥𝑖 , 𝑦𝑖), sehingga persamaan dapat dituliskan
menjadi :
𝑦𝑖−1 = 𝑦𝑖 − 𝑓(𝑥𝑖 , 𝑦𝑖 )∆𝑥
Dengan n = 1, 2, 3, dan seterusnya persmuaan berikut mnejadi persamaan
yang kita cari.
3. TUGAS AKHIR
3.1. Jelaskan mengapa nilai ℎ sangat berpengaruh terhadap error yang
dihasilkan! 𝑑𝑦 = 4𝑡 3 + 𝑡 2 + 10𝑡 + 7 Selesaikan persamaan
𝑑𝑡
diferensial biasa di atas secara analitik!
Jawab :
Syarat batas pada persamaan biasa sangat dibutuhkan untuk menentukan
nilai dari perulangan yang berlangsung serta menentukan batas sampai
iterasi ke berapa yang diperlukan agar si PDB ini mempunyai nilai akhir.
Kalua tidak ada batas naka operasi numerik dari PDB ini tidak ada akhirnya
atau akan terus menerus. Hal ini disebabkan pada dasarnya solusi numerik
merupakan solusi dengan hampiran yang hanyaka mendekati nilai eksak
dan tidak mungkin sama atau menyentuh nilai eksak.
𝑑𝑦
= 4𝑡 3 + 𝑡 2 + 10𝑡 + 7
𝑑𝑥
∫ 𝑑𝑦 = ∫ 4𝑡 3 + 𝑡 2 + 10𝑡 + 7
1
𝑦 = 𝑡 4 + 𝑡 3 + 5𝑡 2 + 7𝑡 + 𝑐
3
3.2. Pergerakan 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 !
Jawab :
3.2.1. Listingan Program
a = 0
b = 10
h = 0.01
dx = h
N = int((b-a)/dx)
x = np.linspace(a,b,N+1)
y1 = np.zeros(N+1)
y1[0] = 0
y1[1] = dx*0 + 0
for i in range(N-1):
if 0<=i<=1:
y1[i+2] = (2-dx)*y1[i+1]+(-(5000/5000)+dx-
(50000/5000)*dx**2)*y1[i]+dx**2*(5000/5000)
else:
y1[i+2] = (2-dx)*y1[i+1]+(-(5000/5000)+dx-
(50000/5000)*dx**2)*y1[i]+dx**2*(0/5000)
ysum1 = sum(y1)
print("Total Jarak Tempuh Benda Selama %.f s adalah
%.7fm" %(b,ysum1))
plt.plot(x,y1,"g")
plt.title("Jarak Tempuh Terhadap Waktu")
plt.ylabel("Posisi")
plt.xlabel("Waktu")
plt.grid()
plt.show()
3.2.2. Tampilan program
= 𝟏 + 𝒚 𝐞𝐱𝐩(−𝒕) dengan 𝑦 (1) = 10 dan ℎ ∈ {0.1 ; 0.01} . Tentukan
3.3. 𝒅𝒚
𝒅𝒕
nilai 𝑦(0)!
3.3.1. Listing Program
def backward_euler(f, x0, y0, xn, h):
n = int((x0-xn)/h)
for i in range(n+1):
yn = y0 - h * f(x0, y0)
y0 = yn
x0 = x0 - h
return yn
# Titik hampiran
xn = 0.0
# Fungsi f(x, y)
f = lambda x, y: 1 + y * np.exp(-x)
# Nilai eksak
y = lambda x: sy.N((-
sy.functions.special.error_functions.Ei(sy.exp(-
x))+sy.functions.special.error_functions.Ei(sy.exp(-
1)).n(chop=True)+10*sy.exp(sy.exp(-1)))*sy.exp(-
sy.exp(-x)))
yn = y(xn)
# Nilai awal
x0 = 1 ; y0 = 10
# Selisih
h = [0.1, 0.01]
# Mencetak nilai hampiran
print("Backward Euler")
print(("y(%.1f) = %.7f" %(xn, yn)))
3.3.2. Tampilan Program
4. Kesimpulan
PDB dapat diselesaikan dengan metode numerik. Pada modul ini ada dua metode
yang diajarkan yanitu Forward euler dan Runge-Kutta 4. Saat penurunan deret
taylor kita dapat menemukan satu metode lagi yaitu Backward Euler. Metode
Runge kutta 4 memiliki galat yang lebih kecil disbanding metode forward saat
dibandingkan dengan nilai analitik