2 Modul Pertemuan 2 15
2.1 Teori Metode Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4 Perhitungan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3 Modul Pertemuan 3 21
3.1 Teori Metode Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Perhitungan Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4 Modul Pertemuan 4 28
4.1 Teori Metode Runge Kutta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.4 Visualisasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5 Modul Pertemuan 6 34
5.1 Teori Adams Bashforth dan Adams Moulton . . . . . . . . . . . . . . . . . . 34
5.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.3 Contoh Kode Penyelesaian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5.3.1 Penyelesaian Metode Adams-Bashforth . . . . . . . . . . . . . . . . . 35
5.3.2 Perbandingan dengan Metode Runge Kutta . . . . . . . . . . . . . . 38
5.3.3 Penyelesaian Metode Adams Moulton . . . . . . . . . . . . . . . . . . 40
5.4 Orde Konvergensi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
1
6 Modul Pertemuan 7 45
6.1 Teori Metode Prediktor Korektor . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.4 Perbandingan dengan Metode Lain . . . . . . . . . . . . . . . . . . . . . . . . 49
7 Modul Pertemuan 9 53
7.1 Teori Metode Linear Shooting . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
8 Modul Pertemuan 10 58
8.1 Teori : Non-Linear Shooting Method . . . . . . . . . . . . . . . . . . . . . . . 58
8.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
8.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
9 Modul Pertemuan 10 64
9.1 Teori Metode Beda Hingga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.2 Instruksi Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
9.3 Contoh Kode Pemrograman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
10 Daftar Tugas 70
10.1 Tugas 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
10.2 Tugas 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
10.3 Tugas 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
10.4 Tugas 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.5 Tugas 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
10.6 Tugas 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
10.7 Tugas 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
10.8 Tugas 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
10.9 Tugas Besar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
11 Soal Kuis 79
12 Soal UTS 80
13 Soal UAS 81
Daftar Pustaka 82
2
SILABUS PEMBERLAJARAN
MATA KULIAH KODE DOSEN PENGAMPU BOBOT (SKS) SEMESTER TANGGAL PENYUSUNAN
PERSAMAAN DIFERENSIAL NUMERIK / MA201547 Abrari Noor Hasmi, S.Si., M.Si. 3 Pilihan 20 Februari 2021
NUMERICAL DIFFERENTIAL EQUATION
CAPAIAN CAPAIAN PEMBELAJARAN LULUSAN (CPL) YANG DITITIPKAN PADA MATA KULIAH
PEMBELAJARAN
(CP) 1. Sikap
S.9 Menunjukkan sikap bertanggungjawab atas pekerjaan di bidang keahliannya secara mandiri
2. Keterampilan Umum
KU.1 Mampu menerapkan pemikiran logis, kritis, sistematis, dan inovatif dalam konteks pengembangan atau implementasi ilmu
pengetahuan dan teknologi yang memperhatikan dan menerapkan nilai humaniora yang sesuai dengan bidang keahliannya;
3. Pengetahuan
P.2 Menguasai prinsip-prinsip pemodelan matematika, program linear, persamaan diferensial, dan metode numerik
4. Keterampilan Khusus
KK.1 Mampu mengidentifikasi, menjelaskan, merumuskan, dan memecahkan permasalahan matematika sederhana melalui pendekatan
matematis
KK.2 Mampu menerapkan konsep dasar matematika untuk menganalisis dan mengkaji keakuratan permasalahan matematika sederhana
sesuai dengan fenomena dan metode yang tepat
3
CAPAIAN PEMBELAJARAN MATA KULIAH (CPMK)
Mahasiswa mampu memaparkan hasil analisis yang telah dilakukan terhadap metode numerik yang digunakan dalam menyelesaikan persamaan
differensial baik secara individu maupun kelompok.
DESKRIPSI Persamaan Diferensial (baik Persamaan Diferensial Biasa maupun Persamaan Diferensial Parsial) kadang tidak dapat diselesaikan menggunakan
SINGKAT MK metode analitik. Oleh karena itu, diperlukan pengetahuan tentang metode penyelesaian numerik. Pada mata kuliah Persamaan Differensial
Numerik, dipelajari metode-metode numerik dalam menyelesaikan persamaan diferensial biasa berbentuk masalah nilai awal dan masalah nilai
batas. Aspek-aspek yang dibahas, meliputi penurunan rumus, implementasi algoritma, serta estimasi eror. Penyelesaian permasalahan numerik
diimplementasikan melalui algoritma dengan bahasa pemrograman menggunakan komputer. Dalam proses perkuliahan, digunakan metode
ceramah dan diskusi aktif. Pemberian tugas (baik mandiri maupun kelompok) dilakukan dengan tujuan membantu mahasiswa dalam memahami
metode-metode numerik dan menggunakan metode numerik untuk menyelesaikan permasalahan diferensial.
BAHAN KAJIAN Dalam mata kuliah ini mahasiswa akan mempelajari pokok bahasan-pokok bahasan sebagai berikut:
PUSTAKA UTAMA
1. Burden, R. L. & Faires, J. D. (2011). Numerical Analysis Ninth Edition. USA: Brooks/Cole, Cengage Learning.
PENDUKUNG
2. Linge, S. & Langtangen, H.P. (2020). Programming for Computations – Python. Switzerland, Springer.
MEDIA 1. Slide
PEMBELAJARAN 2. Kuliah.itk.ac.id
4
3. Google Collaboratory
4. Online Meeting: Zoom/Gmeet
(1) (2) (4) (5) (6) (7) (8) (9) (10) (11) (12)
14
Bab 2
Modul Pertemuan 2
y0 = f (t, y) y(t0 ) = y0
y0 = y − t2 + 1, 0 ≤ t ≤ 2, y(0) = 0.5
Dengan menggunakan metode Euler maju dengan diskretisasi 2−1 , 2−2 , 2−3 , 2−4 , 2−5 , 2−6 .
Diketahui solusi eksak :
y(t) = (t + 1)2 − 0.5et
Dengan membandingkan solusi numerik dengan solusi eksak, tentukan orde dari er-
ror pada metode Euler!
15
2.3 Contoh Kode Pemrograman
Langkah pengerjaan adalah sebagai berikut: 1. Definisikan Nt+1 interval yang akan dihi-
tung, definisikan yi ≈ y(ti ) 2. Gunakan persamaan (1) untuk secara iteratif mengaproks-
masi nilai yi
Hal pertama yang kita lakukan adalah membaca library numpy dan memberikannya
alias untuk memudahkan/mempersingkat pemanggilan fungsi pada library tersebut.
[2]: import numpy as np
import matplotlib.pyplot as plt
Selanjutnya kita akan menentukan inisialisasi solusi masalah nilai awal. Kita perlu
menentukan nilai awal, nilai akhir dan lebar selang. Untuk itu kita akan menggunakan
fungsi numpy.arange dengan masukan tinit, tend, dan dt akan membuat vektor dari waktu
awal, sampai waktu akhir yang antar dua vektor berurutan terjarak sebesar dt. Karena
16
pada dasarnya waktu diakhir tidak dimasukan dalam perhitungan arange, maka waktu
akhir akan dilebihkan sedikit, yaitu sebesar dt.
Setelah membuat diskritisasi waktu, kita tinggal memanggil fungsi fun_Euler yang
telah kita definisikan sebelumnya. Kita dapat melihat hasil aproksimasi solusi dengan
perintah print().
[4]: #parameter masalah
tinit = 0
tend = 2
y0 = 0.5
#diskritisasi waktu
# for i in range(5):
dt = 2**-1
t_1 = np.arange(tinit,tend+dt,dt) #arange untuk membuat vektor dari
,→tinit, tend, dengan beda dt.
#solusi Eksak
t_ex = np.linspace(tinit,tend,201)
y_ex = (t_ex+1)**2-0.5*np.exp(t_ex)
#Visualisasi
plt.figure(figsize = [8.4, 3.2])
plt.plot(t_1,y1, label = r'dt$=2^{-1}$') #lambang $ sebagai simbol untuk
,→latex
17
Lanjutkan untuk diskritisasi waktu yang lain . . . .
[1]: #parameter masalah
tinit = 0
tend = 2
y0 = 0.5
#diskritisasi waktu
for i in range(5):
dt = 2**-(1+i)
t_1 = np.arange(tinit,tend+dt,dt)
y1=fun_Euler(y0,t_1,f)
plt.plot(t_1,y1, label = r'dt$=2^{-%i}$' %(i+1))
18
,→ ---------------------------------------------------------------------------
<ipython-input-1-576a54e3b0ff> in <module>
7 for i in range(5):
8 dt = 2**-(1+i)
----> 9 t_1 = np.arange(tinit,tend+dt,dt)
10 y1=fun_Euler(y0,t_1,f)
11 plt.plot(t_1,y1, label = r'dt$=2{-%i}$' %(i+1))
sedangkan secara numerik apabila lebar selang adalah h maka norm diatas dapat diap-
roksimasi dengan menggunakan metode trapesium dengan cara:
" #1/2
Nt−1
∆ti
E(∆ti ) = |wTaylor2 − y Eksak |2 = (e0 + e Nt ) + ∆ti ∑ ei
2 i =1
dengan ei = (y Euler (ti ) − y Eksak (ti ))2 . Yang dapat disederhanakan dengan mengabaikan
kontribusi a0 dan a N t :
" #1/2
Nt−1
E(∆ti ) = ∆ti ∑ ei
i =1
19
Apabila tidak diketahui solusi eksak, maka bisa diganti dengan solusi dengan nilai ukur-
an waktu terkecil. .
[ ]: def fun_Eksak(t_ex):
#Menghitung solusi eksak
return (t_ex+1)**2-0.5*np.exp(t_ex)
def fun_err(t,y):
"""menentukan metrik euklidean untuk
diskritisasi waktu t dan solusi aproksimasi y"""
y_ex = fun_Eksak(t) #menentukan solusi eksak untuk diskritisasi waktu
,→t
err1 =fun_err(t_1,y1)
print(err1)
Hitung Error untuk diskritisasi waktu yang lain dan plot dengan sumbu x adalah ∆t
dan sumbu y adalah nilai Errornya.
Orde konvergensi dapat diperoleh dari serangkaian solusi numerik dengan parameter
∆ti yang berbeda lalu mengasumsikan bahwa error memiliki bentuk :
E(∆ti )
ln E(∆t
i −1 )
r=
ln(∆ti /∆ti−1 )
Berdasarkan perhitungan solusi numerik, hitung orde konvergensi metode Euler, ban-
dingkan dengan orde teoritik yaitu r = 1
[ ]:
20
Bab 3
Modul Pertemuan 3
Metode Taylor orde ke-n diperoleh dengan mempertahankan suku deret Taylor sam-
pai orde ke-n dan mengabaikan suku ke-n + 1. Misalkan y merupakan solusi dari masa-
lah nilai awal yang diberikan oleh:
Maka suku y0 ‘, y00 0 , · · · dapat diperoleh dengan menurunkan kedua ruas pada masalah
nilai awal dengan t. Perhatikan bahwa turunan yang ada pada ruas kanan haruslah tu-
runan total (bukan turunan parsial), yaitu:
df ∂f ∂ f dy
y00 = f 0 (t) = = +
dt ∂t ∂y dt
y0 = y − t2 + 1, 0 ≤ t ≤ 2, y(0) = 0.5
Tentukan aproksimasi Taylor orde 2 dan orde 4 untuk y(0.5) dengan menggunakan ∆t =
0.5.
21
Penyelesaian Untuk penyelesaian Taylor orde 2 maka diperlukan nilai y00 yang dapat
diperoleh dengan:
∂ ∂
y00 (t) = ( y − t2 + 1) + ( y − t2 + 1) · y 0
∂t ∂y
= −2t + 1 · y0
= −2t + y − t2 + 1
(∆t)2
w1 = w0 + ∆t(w0 − t20 + 1) + (w0 − t20 + 1 − 2t0 )
2
0.52
= 0.5 + 0.5(0.5 − 02 + 1) + (0.5 − 02 + 1 − 2 · 0)
2
= 1.4375
(∆t)2
w2 = w1 + ∆t(w1 − t21 + 1) + (w1 − t21 + 1 − 2t1 )
2
0.52
= 1.4375 + 0.5(1.4375 − 0.52 + 1) + (1.4375 − 0.52 + 1 − 2 · 0.5)
2
= 2.6796
Untuk penyelesaian Taylor orde 4 maka diperlukan pula nilai y000 dan y(4) yang dapat
diperoleh dengan:
∂ ∂
y000 (t) = (−2t + y − t2 + 1) + (−2t + y − t2 + 1) · y0
∂t ∂y
= −2 − 2t + 1 · y0
= −2t + y − t2 − 1
∂ ∂
y (4) ( t ) = (−2t + y − t2 − 1) + (−2t + y − t2 − 1) · y0
∂t ∂y
= −2 − 2t + 1 · y0
= −2t + y − t2 − 1
22
dengan demikian w1 ≈ y(0.5) dapat dihitung dengan
(∆t)2 (∆t)3
w1 = w0 + ∆t(w0 − t20 + 1) + (w0 − t20 + 1 − 2t0 ) + (w0 − t20 − 2t0 − 1)
2 6
(∆t)4
+ (w0 − t20 − 2t0 − 1)
24
0.52 0.53
= 0.5 + 0.5(0.5 − 02 + 1) + (0.5 − 02 + 1 − 2 · 0) + (0.5 − 02 − 2 · 0 − 1)
2 6
0.54
+ (0.5 − 02 − 2 · 0 − 1)
24
= 1.42578
(∆t)2
w2 = w1 + ∆t(w1 − t21 + 1) + (w1 − t21 + 1 − 2t1 )
2
0.52
= 1.4375 + 0.5(1.4375 − 0.52 + 1) + (1.4375 − 0.52 + 1 − 2 · 0.5)
2
= 2.64132
Hasil dari solusi menggunakan beberapa metode numerik dapat dilihat pada tabel
dibawah ini:
y2 + y
y0 = , 1 ≤ t ≤ 3, y (1) = −2
t
Dengan menggunakan metode Euler dan Taylor orde 2,3,4 dengan diskretisasi
2−1 , 2−2 , 2−3 , 2−4 , 2−5 , 2−6 . Diketahui solusi eksak :
2t
y(t) =
1 − 2t
23
1. Tentukan nilai error aproksimasi solusi metode Taylor dengan solusi eksak untuk
masing-masing lebar selang.
2. Gambarkan perbandingan antara solusi eksak dengan solusi numerik (Euler, Taylor
orde 2, Taylor orde 3, Taylor orde 4) untuk lebar selang h = 0.25 pada satu grafik.
Berilah interpretasi hasil yang diperoleh
3. Hitunglah orde konvergensi dari metode Euler, Taylor orde 2, Taylor orde 3, Taylor
orde 4, menggunakan ∆ti = 2−6 dan ∆ti−1 = 2−5
4. Lakukan perhitungan manual masalah nilai awal diatas dengan menggunakan h =
2−1 untuk metode Taylor orde 3.
w0 = y 0
wi+1 = wi + hT n (ti , wi , h)
h 0 h n −1 ( n −1)
T n ( t i , wi , h ) = f ( t i , wi ) + f ( t i , wi ) + · · · + f ( t i , wi )
2 n!
24
[ ]: def fun_Taylor(y0,t,f):
n=len(t) #panjang vektor t
y_ = np.zeros(n) #inisialisasi luaran fungsi
y_[0]=y0 #inisiasi nilai awal
for i in range(n-1): #perulangan utama
h = t[i+1]-t[i] #menghitung lebar selang
y_[i+1]=y_[i]+h*f(t[i],y_[i],h) #algoritma metode Euler, f adalah
,→ruas kanan
Untuk setiap orde metode Taylor kita akan mendefinisikan ruas kanan persamaan di-
fferensial. Sebagai contoh untuk orde 2 kita definisikan fun_T2, sedangkan untuk Taylor
orde 3 kita gunakan fun_T3 sebagai berikut:
[ ]: def fun_T2(t,y,h): #ruas kanan dari persamaan differensial
#return 1+(t-y)**2 -h*(t-y)**3
return (y**2+y)/t +h*(y**3+y**2)/t**2
Selanjutnya kita akan menentukan inisialisasi solusi masalah nilai awal. Kita perlu
menentukan nilai awal, nilai akhir dan lebar selang. Untuk itu kita akan menggunakan
fungsi numpy.arange dengan masukan tinit, tend, dan dt akan membuat vektor dari waktu
awal, sampai waktu akhir yang antar dua vektor berurutan terjarak sebesar dt. Karena
pada dasarnya waktu diakhir tidak dimasukan dalam perhitungan arange, maka waktu
akhir akan dilebihkan sedikit, yaitu sebesar dt.
Setelah membuat diskritisasi waktu, kita tinggal memanggil fungsi fun_Taylor yang
telah kita definisikan sebelumnya. Kita dapat melihat hasil aproksimasi solusi dengan
perintah print().
[ ]: #parameter masalah
tinit = 1
tend = 3
y0 = -2
#diskritisasi waktu
25
dt = 2**-2
t_1 = np.arange(tinit,tend+dt,dt)
# aproksimasi solusi dengan metode Taylor orde 2
y1=fun_Taylor(y0,t_1,fun_T2)
Lanjutkan untuk selang waktu yang lain dan metode yang lain
Jangan lupa untuk Plot
sedangkan secara numerik apabila lebar selang adalah h maka norm diatas dapat diap-
roksimasi dengan menggunakan metode trapesium dengan cara:
" #1/2
Nt−1
∆ti
E(∆ti ) = |wTaylor2 − y Eksak |2 = (e0 + e Nt ) + ∆ti ∑ ei
2 i =1
2
dengan ei = y Taylor2 (ti ) − y Eksak (ti ) . Yang dapat disederhanakan dengan mengabaikan
kontribusi a0 dan a N t :
" #1/2
Nt−1
E(∆ti ) = ∆ti ∑ ei
i =1
Apabila tidak diketahui solusi eksak, maka bisa diganti dengan solusi dengan nilai ukur-
an waktu terkecil.
Selanjutnya kita definisikan fungsi untuk menghitung error untuk setiap pilihan wak-
tu.
[ ]: def fun_Eksak(t_ex):
return 2*t_ex/(1-2*t_ex)
def fun_err(t,y):
y_ex = fun_Eksak(t)
h = t[1] - t[0]
26
e1 = y - y_ex
return np.sqrt(h*e1.dot(e1))
err1 =fun_err(t_1,y1)
print(err1)
0.08267507354985985
Orde konvergensi dapat diperoleh dari serangkaian solusi numerik dengan parameter
∆ti yang berbeda lalu mengasumsikan bahwa error memiliki bentuk :
E(∆ti )
ln E(∆t
i −1 )
r=
ln(∆ti /∆ti−1 )
Berdasarkan perhitungan solusi numerik, hitung orde konvergensi metode Euler, Ta-
ylor orde 2, 3, dan 4, bandingkan dengan orde teoritik yaitu r = 1, 2,3 dan 4
[ ]:
27
Bab 4
Modul Pertemuan 4
28
Metode Heun merupakan metode Runge Kutta orde 3 memiliki skema diskritisasi :
w0 = α
k 1 = f ( t i , wi )
h h
k 2 = f ( t i + , wi + k 1 )
3 3
2h 2h
k 3 = f ( t i + , wi + k 2 )
3 3
h
wi+1 = wi + (k1 + 3k3 )
4
w0 = α
k 1 = f ( t i , wi )
h h
k 2 = f ( t i + , wi + k 1 )
2 2
h h
k 3 = f ( t i + , wi + k 2 )
2 2
k4 = f (ti + h, wi + hk3 )
h
wi+1 = wi + (k1 + 2k2 + 2k3 + k4 )
6
y2 + y
y0 = , 1 ≤ t ≤ 3, y (1) = −2
t
Dengan menggunakan metode Titik Tengah, Euler dimodifikasi, Heun dan Runge Kutta
orde 4 dengan diskretisasi 2−1 , 2−2 , 2−3 , 2−4 , 2−5 , 2−6 .. Diketahui solusi eksak :
2t
y(t) =
1 − 2t
29
memudahkan/mempersingkat pemanggilan fungsi pada library tersebut.
[1]: import numpy as np
return y
Selanjutnya kita tentukan ruas kanan persamaan differensial yang ingin diaproksima-
si
[3]: def f(t,y):
"""ruas kanan dari persamaan differensial """
return (y**2+y)/t
Selanjutnya kita akan menentukan inisialisasi solusi masalah nilai awal. Kita perlu
menentukan nilai awal, nilai akhir dan lebar selang. Untuk itu kita akan menggunakan
fungsi numpy.arange dengan masukan tinit, tend, dan dt akan membuat vektor dari waktu
awal, sampai waktu akhir yang antar dua vektor berurutan terjarak sebesar dt. Karena
pada dasarnya waktu diakhir tidak dimasukan dalam perhitungan arange, maka waktu
akhir akan dilebihkan sedikit, yaitu sebesar dt.
Setelah membuat diskritisasi waktu, kita tinggal memanggil fungsi fun_Midpoint yang
telah kita definisikan sebelumnya. Kita dapat melihat hasil aproksimasi solusi dengan
30
perintah print().
[4]: #parameter masalah
tinit = 1
tend = 3
y0 = -2
#diskritisasi waktu
dt = 2**-2
t_1 = np.arange(tinit,tend+dt,dt)
Selanjutnya kita akan menghitung error solusi persamaan differensial. Kita akan
menggunakan metrik Euclid yang secara formal didefinisikan sebagai:
Z 1/2
4 2
error = |w Midpoint − y Eksak |2 = w Midpoint (t) − y Eksak (t) dt
2
sedangkan secara numerik apabila lebar selang adalah h maka norm diatas dapat diap-
roksimasi dengan
" #1/2
N 2
error = |w Midpoint − y Eksak |2 = h ∑ w Midpoint (ti ) − y Eksak (ti )
i =0
sehingga pada praktiknya kita akan perlu mendefinisikan fungsi solusi eksak, yang bisa
bergantung pada diskritisasi waktu yang kita masukan. Dilanjutkan dengan mendefini-
sikan fungsi untuk menghitung error untuk setiap pilihan waktu.
[5]: def fun_Eksak(t_ex):
#Menghitung solusi eksak
return 2*t_ex/(1-2*t_ex)
def fun_err(t,y):
31
y_ex = fun_Eksak(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err1 =fun_err(t_1,y1)
print(err1)
0.03979050824399428
4.4 Visualisasi
Pada bagian ini kita akan membandingkan secara visual solusi eksak dengan solusi nu-
merik menggunakan metode titik tengah. Untuk itu kita akan menggunakan library ma-
tplotlib.pyplot . Library ini memiliki banyak kemiripan dengan visualisasi pada matlab.
[6]: import matplotlib.pyplot as plt
Selanjutnya kita plot solusi eksak dan solusi numerik dengan menggunakan perin-
tah matplotlib.pyplot.plot . Pada perintah kita menentukan sumbu horizontal dan sum-
bu vertikal. Pada perintah ini ada pilihan untuk memberikan nama/label pada gra-
fik. Nama ini nantinya bisa ditampilkan pada legenda grafik. Selain itu kita bisa me-
nentukan jenis garis yang digunakan, misalnya perintah “–r” untuk garis putus-putus
berwarna merah (green). Kemungkinan garis yang lain dapat dibaca lebih lengkap pa-
da:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html .Legenda grafik di-
tampilkan dengan perintah legend sedang perintah grid untuk menampilkan garis-garis
bantu pada grafik, dan perintah show untuk menampilkan grafik
[7]: t_ex = np.linspace(tinit,tend,201)
plt.plot(t_ex,fun_Eksak(t_ex), label = 'eksak')
plt.plot(t_1,y1,'--r', label = 'Midpoint')
plt.xlabel('t') #label sumbu horizontal
plt.ylabel('y') #label sumbu vertikal
plt.legend()
plt.grid() #menampilkan grid
plt.title('Perbandingan solusi untuk lebar selang 0.25')
plt.show()
32
[ ]:
33
Bab 5
Modul Pertemuan 6
w0 = α
34
h
wi+1 = wi + [ f (ti+1 , wi+1 ) + f (ti , wi )]
2
Perhatikan bahwa wi+1 muncul diruas kiri dan ruas kanan. Secara umum tidak ada solusi
analitik untuk menyelesaikan persamaan diatas, namun bisa digunakan metode mencari
akar persamaan untuk menentukan nilai wi+1 misalnya menggunakan metode Newton-
Raphson.
y2 + y
y0 = , 1 ≤ t ≤ 3, y (1) = −2
t
Dengan menggunakan metode Adams-Bashforth orde 2 dan Adams Moulton orde 2. Di-
ketahui solusi eksak :
2t
y(t) =
1 − 2t
35
y = np.zeros(n)
y[0]=y0
y[1]=y1
h = t[1]-t[0]
f0 = f(t[0],y[0])
f1 = f(t[1],y[1])
for i in range(1,n-1):
y[i+1] = y[i]+h/2*(3*f1-f0)
f0 = f1
f1 = f(t[i+1],y[i+1])
return y
Selanjutnya kita tentukan ruas kanan persamaan differensial yang ingin diaproksima-
si
[3]: def f(t,y):
"""ruas kanan dari persamaan differensial """
return (y**2+y)/t
def fun_Eksak(t_ex):
#Menghitung solusi eksak
return 2*t_ex/(1-2*t_ex)
Selanjutnya kita akan menentukan inisialisasi solusi masalah nilai awal. Kita perlu
menentukan nilai awal, nilai akhir dan lebar selang. Untuk itu kita akan menggunakan
fungsi numpy.arange dengan masukan tinit, tend, dan dt akan membuat vektor dari waktu
awal, sampai waktu akhir yang antar dua vektor berurutan terjarak sebesar dt. Karena
pada dasarnya waktu diakhir tidak dimasukan dalam perhitungan arange, maka waktu
akhir akan dilebihkan sedikit, yaitu sebesar dt.
Setelah membuat diskritisasi waktu, kita tinggal memanggil fungsi fun_AB2 yang te-
lah kita definisikan sebelumnya. Kita dapat melihat hasil aproksimasi solusi dengan per-
intah print().
[4]: #parameter masalah
tinit = 1
tend = 3
y0 = -2
36
#diskritisasi waktu
dt = 2**-2
y1 = fun_Eksak(tinit+dt)
t_1 = np.arange(tinit,tend+dt,dt)
Selanjutnya kita akan menghitung error solusi persamaan differensial. Kita akan
menggunakan metrik Euclid yang secara formal didefinisikan sebagai:
Z 4
1/2
2
E(∆ti ) = |w Num − y Eksak |2 = (y Num (t) − y Eksak (t)) dt
2
sedangkan secara numerik apabila lebar selang adalah h maka norm diatas dapat diap-
roksimasi dengan menggunakan metode trapesium dengan cara:
" #1/2
Nt−1
∆ti
E(∆ti ) = |w Num − y Eksak |2 = (e0 + e Nt ) + ∆ti ∑ ei
2 i =1
dengan ei = (w Num (ti ) − y Eksak (ti ))2 . Yang dapat disederhanakan dengan mengabaikan
kontribusi a0 dan a N t :
" #1/2
Nt−1
E(∆ti ) = ∆ti ∑ ei
i =1
Apabila tidak diketahui solusi eksak, maka bisa diganti dengan solusi dengan nilai ukur-
an waktu terkecil.
[5]: def fun_err(t,y):
y_ex = fun_Eksak(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err1 =fun_err(t_1,y)
37
print(err1)
0.0742393453483327
return y
[7]: y_mid =fun_Midpoint(y0,t_1,f)
err_mid =fun_err(t_1,y_mid)
print(err_mid)
0.03979050824399428
terlihat bahwa secara umum metode titik tengah lebih baik dibandingkan dengan me-
tode Adams-Bashfort. Begitupun apabila dibandingkan secara grafis:
[9]: import matplotlib.pyplot as plt
t_ex = np.linspace(tinit,tend,201)
plt.plot(t_ex,fun_Eksak(t_ex), label = 'eksak')
plt.plot(t_1,y,'--r', label = 'AB2')
plt.plot(t_1,y_mid,'-*g', label = 'Midpoint')
plt.xlabel('t') #label sumbu horizontal
plt.ylabel('y') #label sumbu vertikal
plt.legend()
plt.grid() #menampilkan grid
plt.title('Perbandingan solusi untuk lebar selang 0.25')
38
plt.show()
Meskipun demikian kelebihan dari metode banyak langkah adalah lebih efisien, hal
ini mengingat lebih sedikit komputasi yang dilakukan. Hal ini bisa dilihat misalnya dari
kode berikut yang membandingkan waktu komputasi fungsi midpoint dan AB2 untuk
10000 perulangan.
[10]: import timeit
t_mp = timeit.timeit(lambda: fun_Midpoint(y0,t_1,f), number=10000)
t_ab2 = timeit.timeit(lambda: fun_AB2(y0,y1,t_1,f), number=10000)
print(t_mp, t_ab2)
0.3258266999996522 0.19282049999992523
39
5.3.3 Penyelesaian Metode Adams Moulton
Sebagai contoh untuk kasus persamaan pada modul ini, metode Adams Moulton dua
langkah dapat dituliskan dengan:
" #
h wi2+1 + wi+1 wi2 + wi
wi +1 = wi + +
2 t i +1 ti
dengan menuliskan:
dengan turunan:
dL h 2wi+1 + 1
= 1−
dwi+1 2 t i +1
maka pada setiap langkah metode implisit kita harus menentukan wi+1 sehingga
L(wi+1 ) = 0 berikut adalah contoh implementasi metode Adams Moulton 1 langkah:
[17]: def fun_AM(y0,t,f, fdot):
tol = 10**(-5)
n=len(t)
y = np.zeros(n)
y[0]=y0
h = t[1]-t[0]
f0 = f(t[0],y[0])
for i in range(0,n-1):
ytemp = y[i]
ftemp = f(t[i+1], ytemp)
L = ytemp - y[i] - h/2*(ftemp +f0)
#iterasi menggunakan Newton Raphson
while abs(L)>tol:
dL = (1-h/2*fdot(t[i+1], ytemp))
ytemp = ytemp - L / dL
ftemp = f(t[i+1], ytemp)
L = ytemp - y[i] - h/2*(ftemp +f0)
y[i+1] = ytemp
40
f0 = ftemp
return y
def fdot(t,y):
"""turunan dari ruas kanan dari persamaan differensial """
return (2*y+1)/t
yang apabila dibandingkan dengan metode lain menghasilkan error yang paling kecil:
[19]: err_am1 =fun_err(t_1,yim1)
print(err1, err_mid, err_am1)
Hal ini dapat diamati pula dengan membandingkannya dengan metode orde 2 yang
lain:
[20]: plt.plot(t_ex,fun_Eksak(t_ex), label = 'eksak')
plt.plot(t_1,y,'--r', label = 'AB2')
plt.plot(t_1,y_mid,'-*g', label = 'Midpoint')
plt.plot(t_1,yim1,'-.m', label = 'AM1')
plt.xlabel('t') #label sumbu horizontal
plt.ylabel('y') #label sumbu vertikal
plt.legend()
plt.grid() #menampilkan grid
plt.title('Perbandingan solusi untuk lebar selang 0.25')
plt.show()
41
Meskipun demikian, karena setiap langkahnya harus melakukan iterasi, maka secara
umum untuk lebar yang sama, diperlukan waktu yang lebih lama untuk menggunak-
an metode ini. Meskipun demikian, perlu diingat pula bahwa metode Adams Moulton
dapat menggunakan lebar selang yang lebih besar dibandingkan dengan metode runge
kutta maupun Adams Bashforth
[21]: t_mp = timeit.timeit(lambda: fun_Midpoint(y0,t_1,f), number=10000)
t_ab2 = timeit.timeit(lambda: fun_AB2(y0,y1,t_1,f), number=10000)
t_am2 = timeit.timeit(lambda: fun_AM(y0,t_1,f, fdot), number=10000)
print(t_mp, t_ab2, t_am2)
42
yang dengan demikian r dapat ditentukan dengan :
E(∆ti )
ln E(∆t
i −1 )
r=
ln(∆ti /∆ti−1 )
[93]: alpha = -3
def f_stiff(t,y):
return alpha*y
def f_stiff_dot(t,y):
return alpha
43
def y_stiff_ex(t):
return np.exp(alpha*t)
[94]: tinit =0
tend = 5
y0 = 1
#diskritisasi waktu
dt = 0.7
t_1 = np.arange(tinit,tend+dt,dt)
y_st_mp = fun_Midpoint(y0,t_1,f_stiff)
y_st_am = fun_AM(y0,t_1,f_stiff,f_stiff_dot)
[96]: plt.plot(t_1, y_st_mp, label = 'MP')
plt.plot(t_1, y_st_am, label = 'AM')
plt.plot(t_1,y_stiff_ex(t_1), label = 'Exact')
plt.legend()
[96]: <matplotlib.legend.Legend at 0x15e50db3860>
[ ]:
[ ]:
44
Bab 6
Modul Pertemuan 7
w0 = α, w1 = α1
h
w p = wi + [3 f (ti , wi ) − f (ti−1 , wi−1 )]
2
h
wi+1 = wi + [ f (ti+1 , w p ) + f (ti , wi )]
2
Pada prakteknya w1 bisa diperoleh dari beberapa cara, baik diketahui disoal maupun
diaproksimasi dahulu dengan metode satu langkah, misal metode Runge Kutta.
Perhitungan f (ti−1 , wi−1 ) bisa diperoleh dari perhitungan pada waktu sebelumnya,
sehingga tidak perlu dihitung ulang.
Sebagaimana metode-metode lain, metode prediktor korektor dapat ditingkatkan
ordenya dengan melakukan lebih banyak komputasi. Berikut adalah skema untuk Meto-
de Prediktor Korektor orde 3:
w0 = α, w1 = α1 , w2 = α2
h
w p = wi + [23 f (ti , wi ) − 16 f (ti−1 , wi−1 ) + 5 f (ti−2 , wi−2 )]
12
h
wi +1 = wi + [5 f (ti+1 , w p ) + 8 f (ti , wi ) − f (ti−1 , wi−1 )]
12
45
Sedangkan untuk Metode Prediktor Korektor orde 4:
w0 = α, w1 = α1 , w2 = α2 , w3 = α3
h
w p = wi + [55 f (ti , wi ) − 59 f (ti−1 , wi−1 ) + 37 f (ti−2 , wi−2 ) − 9 f (ti−3 , wi−3 )]
24
h
wi +1 = wi + [9 f (ti+1 , w p ) + 19 f (ti , wi ) − 5 f (ti−1 , wi−1 ) + f (ti−2 , wi−2 )]
24
y2 + y
y0 = , 1 ≤ t ≤ 3, y (1) = −2
t
Dengan menggunakan metode Prediktor Korektor orde 2, orde 3 dan orde 4. Gu-
nakan metode Runge Kutta untuk memperoleh beberapa nilai awal. Diketahui so-
lusi eksak :
2t
y(t) =
1 − 2t
2. Bandingkan hasil akurasi dan juga waktu yang diperlukan antara metode prediktor
korektor, Adams-Bashforth dan Runge Kutta masing-masing untuk orde 2,3,dan 4
dengan lebar selang h = 2−5
46
Contoh implementasinya dapat dilihat pada program berikut:
[2]: def fun_PK2(y0,y1,t,f):
n=len(t)
y = np.zeros(n)
y[0]=y0
y[1]=y1
h = t[1]-t[0]
f0 = f(t[0],y[0])
for i in range(1,n-1):
f1 = f(t[i],y[i])
yp = y[i]+h/2*(3*f1-f0)
y[i+1] = y[i]+h/2*(f(t[i+1],yp)+f1)
f0 = f1
return y
def fun_Midpoint(y0,t,f):
n=len(t)
y = np.zeros(n)
y[0]=y0
for i in range(n-1):
h = t[i+1]-t[i]
k1 = y[i]+h/2*f(t[i],y[i])
y[i+1]=y[i]+h*f(t[i]+h/2,k1)
return y
Selanjutnya kita tentukan ruas kanan persamaan differensial yang ingin diaproksima-
si
[3]: def f(t,y):
"""ruas kanan dari persamaan differensial """
return (y**2+y)/t
def fun_Eksak(t_ex):
#Menghitung solusi eksak
47
return 2*t_ex/(1-2*t_ex)
Selanjutnya kita akan menentukan inisialisasi solusi masalah nilai awal. Kita perlu
menentukan nilai awal, nilai akhir dan lebar selang. Untuk itu kita akan menggunakan
fungsi numpy.arange dengan masukan tinit, tend, dan dt akan membuat vektor dari waktu
awal, sampai waktu akhir yang antar dua vektor berurutan terjarak sebesar dt. Karena
pada dasarnya waktu diakhir tidak dimasukan dalam perhitungan arange, maka waktu
akhir akan dilebihkan sedikit, yaitu sebesar dt.
Setelah membuat diskritisasi waktu, kita tinggal memanggil fungsi fun_AB2 yang te-
lah kita definisikan sebelumnya. Kita dapat melihat hasil aproksimasi solusi dengan per-
intah print().
[4]: #parameter masalah
tinit = 1
tend = 3
y0 = -2
#diskritisasi waktu
dt = 2**-2
t_1 = np.arange(tinit,tend+dt,dt)
y1 = fun_Midpoint(y0,t_1[:2], f)[1]
# aproksimasi solusi dengan metode titik tengah
y_pk2=fun_PK2(y0,y1,t_1,f)
y_pk2
[4]: array([-2. , -1.70833333, -1.50818393, -1.39938148, -1.33061882,
-1.28251071, -1.24678522, -1.21915097, -1.19711708])
Selanjutnya kita akan menghitung error solusi persamaan differensial. Kita akan
menggunakan metrik Euclid yang secara formal didefinisikan sebagai:
Z 4
1/2
2
E(∆ti ) = |w Num − y Eksak |2 = (y Num (t) − y Eksak (t)) dt
2
sedangkan secara numerik apabila lebar selang adalah h maka norm diatas dapat diap-
roksimasi dengan menggunakan metode trapesium dengan cara:
" #1/2
Nt−1
∆ti
E(∆ti ) = |w Num − y Eksak |2 = (e0 + e Nt ) + ∆ti ∑ ei
2 i =1
48
dengan ei = (w Num (ti ) − y Eksak (ti ))2 . Yang dapat disederhanakan dengan mengabaikan
kontribusi a0 dan a N t :
" #1/2
Nt−1
E(∆ti ) = ∆ti ∑ ei
i =1
Apabila tidak diketahui solusi eksak, maka bisa diganti dengan solusi dengan nilai ukur-
an waktu terkecil.
[5]: def fun_err(t,y):
y_ex = fun_Eksak(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err_pk2 =fun_err(t_1,y_pk2)
print(err_pk2)
0.021452676652160815
return y
49
[7]: y_mid =fun_Midpoint(y0,t_1,f)
err_mid =fun_err(t_1,y_mid)
y_ab2 =fun_AB2(y0,y1, t_1,f)
err_ab2 =fun_err(t_1,y_ab2)
print('Error metode titik tengah adalah', err_mid ,'\nError metode Adams
,→Bashfort adalah', err_ab2, '\nError metode Prediktor Korektor adalah',
,→err_pk2)
50
Selanjutnya kita juga akan membandingkan waktu komputasi dari ketiga metode:
[10]: import timeit
t_mp = timeit.timeit(lambda: fun_Midpoint(y0,t_1,f), number=10000)
t_pk2 = timeit.timeit(lambda: fun_PK2(y0,y1,t_1,f), number=10000)
t_ab2 = timeit.timeit(lambda: fun_AB2(y0,y1,t_1,f), number=10000)
Kita dapat mengamati bahwa secara umum waktu yang diperlukan metode Prediktor
Korektor hampir sama dengan metode Midpoint, namun error metode Prediktor Korek-
tor lebih kecil dibandingkan dengan metode Midpoint.
51
Periksalah: 1. Apakah hal diatas juga berlaku apabila lebar selang diperkecil menjadi
2−5 2. Selanjutnya periksalah juga untuk kasus metode Runge Kutta, Adams Bashfort
dan Prediktor Korektor orde 3 dan 4 apakah hal diatas juga berlaku?
52
Bab 7
Modul Pertemuan 9
Untuk menyelesaikan masalah nilai batas ini, kita akan menggunakan metode linear sho-
oting. Yang mana kita harus menyelesaikan dua masalah nilai awal berikut berikut:
dan
y200 = p( x )y20 + q( x )y2 dengan y2 ( a) = 0 dan y20 ( a) = 1
yang dapat dinyatakan dalam bentuk sistem persamaan linear dengan memisalkan
z1 = y1 , z2 = y10 , z3 = y2 , z4 = y20 menjadi:
z10 = z2
z20 = p( x )z2 + q( x )z1 + r ( x )
z30 = z4
z40 = p( x )z4 + q( x )z3
53
differensialkan diatas. Setelah memperoleh solusi dari sistem persamaan linear, maka
solusi awal persamaan differensial adalah :
β − y1 ( b )
y ( x ) = y1 ( x ) + y2 ( x )
y2 ( b )
π π
y00 + 4y = cos x, 0≤x≤ , y(0) = 0, y( ) = 0
4 4
Selesaikan masalah nilai batas diatas menggunakan metode linear shooting dengan
menggunakan metode Euler, Runge Kutta orde 3 dan Prediktor Korektor orde 3
untuk menyelesaikan masalah nilai awal yang bersesuaian. Hitunglah error yang
diperoleh menggunakan metode-metode tersebut. Apakah ada perbedaan error pa-
da masing-masing metode numerik ?
π π
2. Variasikan ukuran langkah (dx) menjadi 16 dan 64 , apa yang terjadi dengan nilai
errornya ?
4y0 2y 2 ln x 1
y00 = − − 2+ 2 , 1 ≤ x ≤ 2, y(1) = , y(2) = ln 2
x x x 2
4 2
Solusi eksak: y( x ) = x − x2
+ ln x − 32 Gunakan h = 0.05
54
Selanjutnya kita akan mendefinisikan implementasi dari penyelesaian masalah nilai
awal yaitu metode Runge Kutta orde 4 dengan input berupa vektor. Bisa juga menggu-
nakan metode penyelesaian yang lain.
[2]: def fun_RK4(y0,t,f):
# The Euler Method for approximating solution of differential
,→equation.
n=len(t)
y = np.zeros((n,len(y0)))
y[0]=y0
for i in range(n-1):
h = t[i+1]-t[i]
k1 = h*f(t[i],y[i])
k2 = h*f(t[i]+h/2,y[i]+k1/2)
k3 = h*f(t[i]+h/2,y[i]+k2/2)
k4 = h*f(t[i]+h,y[i]+k3)
y[i+1]=y[i]+1/6*(k1+2*k2+2*k3+k4)
return y
Pada kode dibawah ini kita akan mendefinisikan fungsi yang berada pada ruas kanan
persamaan differensial
z10 = z2
z20 = −4z1 + cos x
z30 = z4
z40 = −4z3
55
[3]: def f1(t,y):
"""ruas kanan dari persamaan differensial """
f_out = np.zeros(4)
f_out[0] = y[1]
f_out[1] = -4*y[0]+np.cos(t)
f_out[2] = y[3]
f_out[3] = -4*y[2]
return f_out
def f1_ex(t):
return -1/3*np.cos(2*t) - np.sqrt(2)/6*np.sin(2*t)+np.cos(t)/3
Selanjutnya pada kode dibawah ini kita akan menyelesaikan sistem persamaan diffe-
rensial linear menggunakan metode Runge Kutta orde 4:
[5]: tinit = 0
tend = np.pi/4
dt = np.pi/32
y0 = np.array([0,0,0,1])
t_1 = np.arange(tinit,tend+dt,dt)
y1 = fun_RK4(y0, t_1, f1)
Berikut adalah perbandingan grafik solusi numerik dengan solusi eksak, perhatikan
bahwa hasil yang diperoleh cukup akurat.
[7]: plt.plot(t_1,y,"-.", label = 'numeric')
plt.plot(t_1,f1_ex(t_1),':', label = 'exact')
plt.legend()
plt.show()
56
untuk mengkuantifikasi error, maka kita dapat menggunakan metrik Euklidean seba-
gaimana modul-modul sebelumnya.
[8]: def fun_err(t,y):
y_ex = f1_ex(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err =fun_err(t_1,y)
err
[8]: 2.169000417470426e-06
57
Bab 8
Modul Pertemuan 10
Untuk menyelesaikan masalah nilai batas ini, kita akan menggunakan metode non-linear
shooting dengan bantuan metode Newton. Masalah dirubah menjadi harus menentukan
t yang memenuhi masalah nilai awal berikut berikut:
dan kondisi y(b) = β. Kita akan menyatakan y( x, t) sebagai solusi dari masalah nilai
awal (2) dengan nilai parameter t. Iterasi Newton pada kasus ini akan berbentuk:
y(b, tk−1 ) − β
t k = t k −1 − ∂y
∂t ( b, tk−1 )
∂y
Untuk menentukan ∂t maka kita menurunkan persamaan (2) terhadap t: sehingga
diperoleh:
∂y00 ∂ f ∂x ∂ f ∂y ∂ f ∂y0
= + + 0
∂t ∂x ∂t ∂y ∂t ∂y ∂t
Karena x dan t saling bebas maka ∂x
∂t = 0 sehingga persamaan menajdi :
∂y00 ∂ f ∂y ∂ f ∂y0
= + 0
∂t ∂y ∂t ∂y ∂t
58
∂y
yang apabila disubstitusikan z = ∂t akan menjadi:
∂f ∂f
z00 = z + 0 z0
∂y ∂y
dengan nilai awal: z( a, t) = 0 dan z0 ( a, t) = 1. Sehingga pada setiap iterasi harus disele-
saikan masalah nilai awal (2) dan (4) dan mengganti nilai t berdasarkan iterasi (3). Seba-
gaimana pada metode Linear Shooting, penyelesaian masalah nilai awal dapat menggu-
nakan metode-metode numerik.
Masalah nilai awal (2) dan (4) dapat dituliskan menjadi satu sistem persamaan diffe-
∂y0
rensial orde 1 dengan pemisalan z1 = y, z2 = y0 , z3 =
∂y
∂t , z4 = ∂t menjadi:
z10 = z2
z20 = f ( x, z1 , z2 )
z30 = z4
∂f ∂f
z40 = ( x, z1 , z2 )z3 + ( x, z1 , z2 )z4
∂z1 ∂z2
1. Selesaikan masalah nilai batas diatas menggunakan metode linear shooting dengan
menggunakan metode Euler, Runge Kutta orde 3 dan Prediktor Korektor orde 3
untuk menyelesaikan masalah nilai awal yang bersesuaian. Hitunglah error yang
diperoleh menggunakan metode-metode tersebut. Apakah ada perbedaan error pa-
da masing-masing metode numerik ?
2. Variasikan ukuran langkah (dx) menjadi 0.1 dan 0.05, apa yang terjadi dengan nilai
errornya ?
59
3. Selesaikan masalah nilai batas berikut dan hitunglah errornya
2(y0 )2 9y2
y00 = − 5 + 4x, 1 ≤ x ≤ 2, y(1) = 0, y(2) = ln 256
x3 x
n=len(x)
y = np.zeros((n,len(y0)))
y[0]=y0
for i in range(n-1):
h = x[i+1]-x[i]
k1 = h*f(x[i],y[i])
k2 = h*f(x[i]+h/2,y[i]+k1/2)
k3 = h*f(x[i]+h/2,y[i]+k2/2)
k4 = h*f(x[i]+h,y[i]+k3)
y[i+1]=y[i]+1/6*(k1+2*k2+2*k3+k4)
60
return y
Untuk modul ini, masalah nilai batas yang akan diselesaikan adalah:
∂f ∂f
= −1 = −2y0
∂y ∂y0
z10 = z2
z20 = −z22 − z1 + ln x
z30 = z4
z40 = −z3 − 2z2 z4
def f1_ex(x):
return np.log(x)
61
[15]: tinit = 1
tend = 2
dt = 0.2
y0 = np.array([0,0.2,0,1])
t_1 = np.arange(tinit,tend+dt/2,dt)
yend = np.log(2)
# y1 = fun_RK4(y0, t_1, f1)
Selanjutnya kita akan melakukan iterasi Newton y berdasarkan persamaan (3): kita
menggunakan dua kondisi berhenti: selisih antara nilai batas akhir kurang dari toleransi
atau melewati jumlah iterasi maksimum:
[16]: err_end = 1
i=0
while err_end>10**(-4) and i <30:
y=fun_RK4(y0,t_1,f1)
err_end = abs(y[-1,0]-yend)
#tebakan turunan baru
y0[1] = y0[1]-(y[-1,0]-yend)/y[-1,2]
i+=1 #counter
Berikut adalah perbandingan grafik solusi numerik dengan solusi eksak, perhatikan
bahwa hasil yang diperoleh cukup akurat.
[17]: plt.plot(t_1,y[:,0],"-.", label = 'numeric')
plt.plot(t_1,f1_ex(t_1),':', label = 'exact')
plt.legend()
plt.show()
62
[18]: i
[18]: 4
untuk mengkuantifikasi error, maka kita dapat menggunakan metrik Euklidean seba-
gaimana modul-modul sebelumnya.
[8]: def fun_err(t,y):
y_ex = f1_ex(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err =fun_err(t_1,y[:,0])
err
[8]: 1.1282754571113482e-05
63
Bab 9
Modul Pertemuan 10
Untuk menyelesaikan masalah nilai batas ini, kita akan menggunakan metode beda
hingga (finite difference methods). Hal ini kita lakukan dengan membagi interval [ a, b]
menjadi N + 1 > 0 interval dengan titik ujungnya menjadi titik mesh xi = a + ib untuk
b− a
i = 0, 1, · · · N + 1 dengan h = N +1 . Pada masing-masing titik interior xi suku-suku
persamaan differensial dapat diaproksimasi dengan :
1
y00 ( xi ) ≈ [y( xi+1 ) − 2y( xi ) + y( xi−1 )] (9.2)
h2
1
y 0 ( xi ) ≈ [y( xi+1 − y( xi−1 )] (9.3)
2h
Dengan menerapkan aproksimasi ini, maka pada titik interior xi persamaan differensial
didiskritisasi menjadi :
1 1
2
[y( xi+1 ) − 2y( xi ) + y( xi−1 )] = p( xi ) [y( xi+1 − y( xi−1 )] + q( xi )y( xi ) + r ( xi )
h 2h
Dengan mengalikan kedua ruas dengan h2 dan meletakan bagian yang tidak diketahui
di ruas kiri dan bagian yang diketahui pada ruas kanan, maka diperoleh:
h 2 h
− 1 + p ( x i ) y ( x i −1 ) + 2 + h q ( x i ) y ( x i ) − 1 − p ( x i ) y ( x i +1 ) = r ( x i )
2 2
64
Sedangkan untuk i = 1 dan i = N perhatikan bahwa nilai dibatas diketahui, sehingga
persamaan beda hingganya menjadi :
2 h h
2 + h q ( x1 ) y ( x1 ) − 1 − p ( x1 ) y ( x2 ) = r ( x1 ) + 1 + p ( x1 ) y ( x0 )
2 2
h 2 h
− 1 + p ( x N ) y ( x N −1 ) + 2 + h q ( x N ) y ( x N ) = r ( x N ) + 1 − p ( x N ) y ( x N +1 )
2 2
Persamaan diatas apabila dituliskan dalam bentuk matriks menjadi :
Ay = b
dengan
y = [ y ( x1 ) y ( x2 ) y ( x3 ) · · · y ( x N −1 ) y( x N )] T
4y0 2y 2 ln x 1
y00 = − − 2+ 2 , 1 ≤ x ≤ 2, y(1) = , y(2) = ln 2
x x x 2
4 2
Solusi eksak: y( x ) = x − x2
+ ln x − 32 Gunakan h = 0.05
2. Selesaikan masalah nilai batas berikut menggunakan metode beda hingga dan hi-
tunglah errornya
π π
y00 = y0 + 2y + cos x, 0≤x≤ , y(0) = −0.3, y = −0.1
2 2
1
Solusi eksak: y( x ) = − 10 (sin x + 3 cos x ). Gunakan h = π
8 dan h = π
16
65
[1]: import numpy as np
import matplotlib.pyplot as plt
Untuk modul ini, masalah nilai batas yang akan diselesaikan adalah:
2 2 sin(ln x )
y00 = − y0 + 2 y + , 1 ≤ x ≤ 2, y(1) = 1, y(2) = 2 (9.4)
x x x2
yang memiliki solusi eksak:
c2 3 1
y ( x ) = c1 x + − sin ( ln x ) − cos(ln x )
x2 10 10
dengan:
1 11
c2 = [8 − 12 sin(ln 2) − 4 cos(ln 2)] ≈ −0.03920701320 c1 = − c2 ≈ 1.1392070132
70 10
Kita akan menggunakan lebar selang 0.1 . Mula-mula kita akan mendefinisikan do-
main internal:
[2]: xinit = 1
yinit = 1
xend = 2
yend = 2
h = 0.1
xin = np.arange(xinit+h, xend,h)
xin
[2]: array([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9])
Selanjutnya kita akan menyusun matriks A: Untuk itu, kita akan menggunakan fungsi
np.diag yang bisa digunakan membentuk matriks dari diagonal dan sub maupun supe-
rdiagonal.
[4]: A = np.diag(a)+np.diag(b,k=1)+np.diag(c,k=-1)
A
66
[4]: array([[ 2.01652893, -1.09090909, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[-0.91666667, 2.01388889, -1.08333333, 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , -0.92307692, 2.01183432, -1.07692308, 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , -0.92857143, 2.01020408, -1.07142857,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , -0.93333333, 2.00888889,
-1.06666667, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , -0.9375 ,
2.0078125 , -1.0625 , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
-0.94117647, 2.00692042, -1.05882353, 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , -0.94444444, 2.00617284, -1.05555556],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , -0.94736842, 2.00554017]])
Selanjutnya kita akan menyelesaikan sistem persamaan matriks, kita akan langsung
menggunakan fungsi scipy.linalg.solve
[6]: y = np.linalg.solve(A,d)
y
[6]: array([1.09260052, 1.18704313, 1.28333687, 1.38140205, 1.48112026,
1.5823599 , 1.68498902, 1.78888175, 1.8939211 ])
untuk mengkuantifikasi error, maka kita dapat menggunakan metrik Euklidean seba-
67
gaimana modul-modul sebelumnya.
[7]: def f_ex(t):
c2 = 1/70*(8-12*np.sin(np.log(2)) - 4*np.cos(np.log(2)))
c1 = 11/10-c2
return c1*t + c2/(t**2)-3/10*np.sin(np.log(t)) - 1/10*np.cos(np.
,→log(t))
def fun_err(t,y):
y_ex = f_ex(t)
h = t[1] - t[0]
e1 = y[1:-1] - y_ex[1:-1]
return np.sqrt(h*e1.dot(e1))
err =fun_err(xin,y)
err
[7]: 3.0388909282590775e-05
68
69
Tugas 1
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
lakukan perhitungan manual dengan masalah nilai awal sebagaimana pada Modul
Pertemuan 2 untuk kasus ∆t = 0.25 Diketahui solusi eksak :
70
Tugas 2
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
y2 + y
y0 = , 1 ≤ t ≤ 3, y(1) = −2
t
Dengan menggunakan metode Euler dan Taylor orde 2,3,4 dengan diskretisasi 2−1 , 2−2 , 2−3 ,
2−4 , 2−5 , 2−6 . Diketahui solusi eksak :
2t
y(t) =
1 − 2t
1. Tentukan nilai error aproksimasi solusi metode Taylor dengan solusi eksak untuk
masing-masing lebar selang.
2. Gambarkan perbandingan antara solusi eksak dengan solusi numerik (Euler, Taylor
orde 2, Taylor orde 3, Taylor orde 4) untuk lebar selang h = 0.25 pada satu grafik.
Berilah interpretasi hasil yang diperoleh
3. Hitunglah orde konvergensi dari metode Euler, Taylor orde 2, Taylor orde 3, Taylor
orde 4, menggunakan ∆ti = 2−6 dan ∆ti−1 = 2−5
4. Lakukan perhitungan manual masalah nilai awal diatas dengan menggunakan h = 2−1
untuk metode Taylor orde 3.
71
Tugas 3
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
y2 + y
y0 = , 1 ≤ t ≤ 3, y(1) = −2
t
2. Lakukan perhitungan manual dengan masalah nilai awal diatas dengan menggunakan
metode Runge Kutta orde 4 untuk kasus ∆t = 0.5
72
Tugas 4
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
1. Pada bagian ini anda diminta secara mandiri menyelesaikan masalah nilai awal pada
sistem persamaan differensial. Persamaan differensial yang harus diselesaikan adalah:
dx
= 3x − xy − 2x2
dt
dy
= −y + xy − y 2
dt
dengan nilai awal: x(0) = 2 dan y(0) = 0.1 dengan selang waktu 0 ≤ t ≤ 10 . Persa-
maan diatas dikenal sebagai persamaan predator-prey yang memodelkan interaksi dua
populasi (mangsa-pemangsa). Selesaikan persamaan differensial diatas menggunakan
metode Euler menggunakan h = 0.2.
Petunjuk: Anda dapat melihat contoh implementasi masalah serupa pada buku
Programming for Computations - Python subbab 8.3. Bisa juga anda melakukan
modifikasi minor pada program sebelumnya dengan memperhatikan struktur data
array pada numpy.
73
Tugas 5
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
y2 + y
y0 = , 1 ≤ t ≤ 3, y(1) = −2
t
Dengan menggunakan metode Prediktor Korektor orde 2, orde 3 dan orde 4. Gunakan
metode Runge Kutta untuk memperoleh beberapa nilai awal. Diketahui solusi eksak
:
2t
y(t) =
1 − 2t
2. Bandingkan hasil akurasi dan juga waktu yang diperlukan antara metode prediktor
korektor, Adams-Bashforth dan Runge Kutta masing-masing untuk orde 2,3,dan 4
dengan lebar selang h = 2−5
74
Tugas 6
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
π π
y 00 + 4y = cos x, 0≤x≤ , y(0) = 0, y( ) = 0
4 4
1. Selesaikan masalah nilai batas diatas menggunakan metode linear shooting dengan
menggunakan metode Euler, Runge Kutta orde 3 dan Prediktor Korektor orde 3 untuk
menyelesaikan masalah nilai awal yang bersesuaian. Hitunglah error yang diperoleh
menggunakan metode-metode tersebut. Apakah ada perbedaan error pada masing-
masing metode numerik ?
π π
2. Variasikan ukuran langkah (dx) menjadi 16
dan 64
, apa yang terjadi dengan nilai
errornya ?
4y 0 2y 2 ln x 1
y 00 = − − 2+ , 1 ≤ x ≤ 2, y(1) = , y(2) = ln 2
x x x2 2
4 2 3
Solusi eksak: y(x) = x
− x2
+ ln x − 2
Gunakan h = 0.05
75
Tugas 7
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
1. Selesaikan masalah nilai batas diatas menggunakan metode linear shooting dengan
menggunakan metode Euler, Runge Kutta orde 3 dan Prediktor Korektor orde 3 untuk
menyelesaikan masalah nilai awal yang bersesuaian. Hitunglah error yang diperoleh
menggunakan metode-metode tersebut. Apakah ada perbedaan error pada masing-
masing metode numerik ?
2. Variasikan ukuran langkah (dx) menjadi 0.1 dan 0.05, apa yang terjadi dengan nilai
errornya ?
2(y 0 )2 9y 2
y 00 = − 5 + 4x, 1 ≤ x ≤ 2, y(1) = 0, y(2) = ln 256
x3 x
76
Tugas 8
MA201547 Persamaan Differensial Numerik
Dosen: Abrari Noor Hasmi
1. Selesaikan masalah nilai batas berikut menggunakan metode beda hingga dan hitu-
nglah errornya
4y 0 2y 2 ln x 1
y 00 = − − 2+ , 1 ≤ x ≤ 2, y(1) = , y(2) = ln 2
x x x2 2
4 2 3
Solusi eksak: y(x) = x
− x2
+ ln x − 2
Gunakan h = 0.05
2. Selesaikan masalah nilai batas berikut menggunakan metode beda hingga dan hitu-
nglah errornya
π π
y 00 = y 0 + 2y + cos x, 0≤x≤ , y(0) = −0.3, y = −0.1
2 2
1 π π
Solusi eksak: y(x) = − 10 (sin x + 3 cos x). Gunakan h = 8
dan h = 16
77
Tugas Besar Persamaan Differensial Numerik (MA201547)
Tahun Ajaran 2020/2021
Dosen: Abrari Noor Hasmi, S.Si., M.Si.
Minggu 12 – Minggu 16
Sub CPMK: Mahasiswa mampu memaparkan analisis menggunakan metode numerik untuk
menyelesaikan persamaan differensial.
Deskripsi Tugas :
Diakhir tugas mahasiswa diminta untuk mendemonstrasikan kemampuan penyelesaian
masalah persamaan differensial secara numerik baik masalah nilai awal dan masalah nilai
batas sederhana. Mahasiswa diminta untuk mencari makalah ilmiah yang melibatkan aplikasi
masalah nilai awal dan batas. Untuk masalah nilai batas bisa berupa masalah kontrol optimal,
ataupun membahas soal applied exercise di buku referensi.
Untuk masalah nilai awal, mahasiswa diminta untuk menyelesaikan masalah sistem
persamaan differensial (lebih dari satu variabel) dengan menggunakan beberapa metode
numerik penyelesaian masalah nilai awal (Runge Kutta dan Multi Langkah).
Sedangkan untuk masalah nilai batas, mahasiswa diminta untuk menggunakan metode (linear
atau non-linear) shooting method, apabila memungkinkan gunakan metode beda hingga.
Output tugas besar adalah berupa laporan yang memuat deskripsi/latar belakang masalah,
penjelasan singkat metode yang digunakan dan hasil perhitungan/simulasi numerik.
78
MA201547 Persamaan Differensial Numerik Kuis 1
Dosen: Abrari Noor Hasmi, S.Si., M.Si. 15 April 2021
Nama : NIM :
Petunjuk. Jawablah soal berikut. Diperkenankan membuka buku dan menggunakan kalku-
lator
y2 1
y 0 (t) = , y(1) = − , 1≤t≤2
1+t ln 2
Tentukan aproksimasi nilai y(2) menggunakan metode Euler dengan h = 0.5.
Metode Euler:
w0 = y0
wi+1 = wi + hf (ti , wi )
Tentukan aproksimasi nilai y(1.5) menggunakan metode Taylor orde 2 dengan h = 0.5.
Metode Taylor orde 2:
w0 = y0
h2 df
wi+1 = wi + hf (ti , wi ) + (ti , wi )
2 dt
Tentukan aproksimasi nilai y(0.5) menggunakan metode titik tengah dengan h = 0.5.
Tentukan pula error dibandingkan solusi eksaknya.
Metode Titik Tengah:
w0 = y0
h h
wi+1 = wi + hf ti + , wi + f (ti , wi )
2 2
79
PROGRAM STUDI MATEMATIKA
INSTITUT TEKNOLOGI KALIMANTAN
Kampus ITK Karang Joang, Balikpapan 76127
Telepon: 0542-8530800, Faksimile: 0542-8530801
SOAL.
4. Tentukan orde konvergensi metode numerik berdasarkan data error menggunakan dua diskri-
tisasi yang berbeda:
h error
0.5 4.56 · 10−5
0.1 4.15 · 10−7
80
PROGRAM STUDI MATEMATIKA
INSTITUT TEKNOLOGI KALIMANTAN
Kampus ITK Karang Joang, Balikpapan 76127
Telepon: 0542-8530800, Faksimile: 0542-8530801
DESKRIPSI TUGAS :
Diakhir tugas mahasiswa diminta untuk mendemonstrasikan kemampuan penyelesaian
masalah persamaan differensial secara numerik baik masalah nilai awal dan masalah nilai
batas sederhana. Mahasiswa diminta untuk mencari makalah ilmiah yang melibatkan apli-
kasi masalah nilai awal dan batas. Untuk masalah nilai batas bisa berupa masalah kontrol
optimal, ataupun membahas soal applied exercise di buku referensi.
Untuk masalah nilai awal, mahasiswa diminta untuk menyelesaikan masalah sistem per-
samaan differensial (lebih dari satu variabel) dengan menggunakan beberapa metode nume-
rik penyelesaian masalah nilai awal (Runge Kutta dan Multi Langkah).
Sedangkan untuk masalah nilai batas, mahasiswa diminta untuk menggunakan metode
(linear atau non-linear) shooting method, apabila memungkinkan gunakan metode beda
hingga.
Output tugas besar adalah berupa laporan yang memuat deskripsi/latar belakang ma-
salah, penjelasan singkat metode yang digunakan dan hasil perhitungan/simulasi numerik.
Dalam sesi pelaksanaan Ujian Akhir Semester mahasiswa diminta untuk mempresenta-
sikan hasil pekerjaan yang telah dilakukan. Setelah presentasi akan ada pertanyaan lisan
yang akan menguji pemahaman mahasiswa terhadap aplikasi materi kuliah pada hasil ana-
lisa yang telah dihasilkan.
KOMPONEN PENILAIAN :
81
Daftar Pustaka
Burden, A., Burden, R., & Faires, J. (2016). Numerical Analysis, 10th ed. doi: 10.13140/
2.1.4830.2406
Linge, S., & Langtangen, H. P. (2020). Programming for Computations - Python : A Gentle
Introduction to Numerical Simulations with Python 3.6. Springer Nature PP - Cham.
Retrieved from https://library.oapen.org/bitstream/id/35449b29-cca0-4d71
-8553-2d49609b75fd/1007055.pdf doi: 10.1007/978-3-030-16877-3
82