Anda di halaman 1dari 25

Laporan Praktikum

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

Nama : Kevin Bazli Santoso


NPM : 140310220033
Hari / Tanggal : Jumat/26 May 2023
Waktu / Sesi : 07:30 - 16:30
Asisten : Azhar Aiman Dzulfiqar

Pretest Laporan Akhir

Jatinangor, Tanggal Bulan 2023


Asisten

( )
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
𝑑𝑡

2.1.1.1. Listing Program


import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# Metode Forwards Euler(bikin sendiri)


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]= 0
x[0]= x_awal

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

print ('nilai dari PDB menggunakan metode forward


euler adalah : ', y[-1])
t = np.linspace(x_awal,x_akhir,n)
sol = odeint(f,y[0],t)
eksak = float(sol[-1])
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
error = abs (y[-1]-eksak)
print ('\nnilai galat dari metode ini adalah : ',
error,"\n")

plt.plot(x, y, label='Forward Euler')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Forward Euler Method')
plt.legend()
plt.show()

2.1.1.2. Tampilan Program


2.1.1.2.1. Untuk h = 0.01

2.1.1.2.2. Untuk h = 0.001


2.1.1.2.3. Untuk h = 0.0001

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

print ('nilai dari PDB menggunakan metode forward


euler adalah : ', y[-1])
t = np.linspace(x_awal,x_akhir,n)
sol = odeint(f,y[0],t)
eksak = float(sol[-1])
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
error = abs (y[-1]-eksak)
print ('\nnilai galat dari metode ini adalah :
', error,"\n")

plt.plot(x, y, label='Forward Euler')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Forward Euler Method')
plt.legend()
plt.show()

2.1.2.2. Tampilan Program


2.1.2.2.1. Untuk h = 0.01
2.1.2.2.2. Untuk h = 0.001
2.1.2.2.3. Untuk h = 0.0001

2.1.3. 𝑑𝑦
+ 10𝑦 = exp(− 𝑡) 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 5
𝑑𝑡

2.1.3.1. Listing 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]= 5
x[0]= x_awal

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

print ('nilai dari PDB menggunakan metode forward


euler adalah : ', y[-1])
t = np.linspace(x_awal,x_akhir,n)
sol = odeint(f,y[0],t)
eksak = float(sol[-1])
print('\nnilai eksak dari PDB persamaan berikut
adalah : ',eksak)
error = abs (y[-1]-eksak)
print ('\nnilai galat dari metode ini adalah : ',
error,"\n")

plt.plot(x, y, label='Forward Euler')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Forward Euler Method')
plt.legend()
plt.show()
2.1.3.2. Tampilan Program
2.1.3.2.1. Untuk h = 0.01

2.1.3.2.2. Untuk h = 0.001


2.1.3.2.3. Untuk h = 0.0001
2.1.3.3. Analisa Program
Pada tugas ini kita diharuskan menyelasaikan 3 persmaan PDB
menggunakan metode forward euler. Ada 3 persamaan yang
digunakan yaitu
• 𝑑𝑦
= 5 exp(−0.2 𝑡 2 ) − 𝑦 2 dengan 𝑦(0) = 0
𝑑𝑡

• 𝑑𝑦
+ 𝑡𝑦 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.

Setelah mendapatkan solusi numerik dan solusi eksak, program


mencetak nilai numerik yang didapatkan dari metode Forward
Euler dan nilai eksak yang didapatkan dari odeint. Selanjutnya,
program menghitung galat numerik dengan mengambil selisih
absolut antara nilai numerik dan nilai eksak pada titik akhir.
Galat ini memberikan informasi tentang sejauh mana metode
Forward Euler mendekati solusi eksak.
Terakhir, program memplot hasil numerik dari metode Forward
Euler menggunakan library matplotlib. Plot menunjukkan
bagaimana nilai y berubah seiring dengan nilai x sesuai dengan
solusi numerik. Plot ini memberikan gambaran visual tentang
bentuk kurva solusi numerik.
2.2. Selesaikan persoalan no. 1 untuk menentukan 𝑦(0.1) menggunakan metode
RK-4! Kemudian bandingkan hasilnya dengan metode Forward Euler
𝑑𝑦
2.2.1. = 5 exp(−0.2 𝑡 2 ) – 𝑦 2 dengan 𝑦(0) = 0
𝑑𝑡

2.2.1.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 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

for i in range (0, n) :


k1 = h * f(y[i], t[i])
k2 = h * f(y[i] + h/2, t[i] + k1/2)
k3 = h * f(y[i] + h/2, t[i] + k2/2)
k4 = h * f(y[i] + h, t[i] + k3)
y[i+1] = y[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t[i+1] = t[i] + h

print('nilai dari PDB menggunakan metode RK4 adalah


: ', y[-1])

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")

plt.plot(t, y, label='metode RK4')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Metode RK4')
plt.legend()
plt.show()
2.2.1.2. Tampilan Program
2.2.1.2.1. Untuk h = 0.01

2.2.1.2.2. Untuk h = 0.001


2.2.1.2.3. Untuk h = 0.0001

2.2.2. 𝑑𝑦
+ 𝑡𝑦 2 = 1 𝑑𝑒𝑛𝑔𝑎𝑛 𝑦(0) = 1
𝑑𝑡

2.2.2.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 1 - t * y**2
t = np.zeros(n+1)
y = np.zeros(n+1)

t[0] = t0
y[0] = y0

for i in range (0, n) :


k1 = h * f(y[i], t[i])
k2 = h * f(y[i] + h/2, t[i] + k1/2)
k3 = h * f(y[i] + h/2, t[i] + k2/2)
k4 = h * f(y[i] + h, t[i] + k3)
y[i+1] = y[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t[i+1] = t[i] + h

print('nilai dari PDB menggunakan metode RK4 adalah


: ', y[-1])

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")

plt.plot(t, y, label='metode RK4')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Metode RK4')
plt.legend()
plt.show()

2.2.2.2. Tampilan Program


2.2.2.2.1. Untuk h = 0.01
2.2.2.2.2. Untuk h = 0.001
2.2.2.2.3. Untuk h = 0.0001

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

for i in range (0, n) :


k1 = h * f(y[i], t[i])
k2 = h * f(y[i] + h/2, t[i] + k1/2)
k3 = h * f(y[i] + h/2, t[i] + k2/2)
k4 = h * f(y[i] + h, t[i] + k3)
y[i+1] = y[i] + 1/6*(k1 + 2*k2 + 2*k3 + k4)
t[i+1] = t[i] + h
print('nilai dari PDB menggunakan metode RK4 adalah
: ', y[-1])

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")

plt.plot(t, y, label='metode RK4')


plt.xlabel('x')
plt.ylabel('y')
plt.title('Metode RK4')
plt.legend()
plt.show()
2.2.3.2. Tampilan Program
2.2.3.2.1. Untuk h = 0.01

2.2.3.2.2. Untuk h = 0.001


2.2.3.2.3. Untuk h = 0.0001
2.2.3.3. Analisa Program

Kita sekarang akan menggunakan metode Runge-Kutta orde empat


(RK4) untuk memecahkan Persamaan Diferensial Biasa (PDB) yang
diberikan. Program dimulai dengan meminta input dari user berupa
nilai awal y0 dan interval h yang menentukan seberapa kecil langkah-
langkah iterasi yang akan digunakan dalam metode RK4. Selanjutnya,
program menghitung jumlah langkah iterasi yang diperlukan untuk
mencapai titik akhir yang ditentukan.

Dalam setiap iterasi, program menghitung empat kemiringan (k1, k2,


k3, k4) berdasarkan nilai y dan t pada langkah sebelumnya.
Kemiringan ini digunakan untuk mengestimasi perubahan y dalam
satu langkah menggunakan persamaan RK4: y[i+1] = y[i] + 1/6*(k1 +
2*k2 + 2*k3 + k4). Program juga memperbarui nilai t untuk setiap
langkah. Setelah melakukan iterasi, program mencetak nilai numerik
yang didapatkan dari metode RK4. Kemudian, program menggunakan
fungsi odeint dari library scipy untuk menghitung nilai eksak dari
PDB. nilai eksak tersebut digunakan untuk memperoleh nilai eksak
pada titik akhir. Program juga menghitung galat numerik dengan
mengambil selisih absolut antara nilai numerik dan nilai eksak pada
titik akhir.
Dari kedua metode ini jika ditinjau dari nilai galatnya metode RK4
memiliki nilai galat yang cenderung lebih kecil yang berarti car aini
lebih akurat daripada forward euler kita ambil contoh untuk persamaan
ketiga dengan h = 0.0001
• Untuk Metode RK4
• Untuk metode Forward Eeler

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

Anda mungkin juga menyukai