Manado
2022
PYTHON & KOMPUTASI FISIKA
Modul Mata Kuliah Komputasi Fisika
Oleh:
Afrioni Roma Rio, S.Si., M.Sc.
Guntur Pasau, S.Si., M.Si.
E d i t o r : D r . G e r a l d H e n d r i k T a m u n tu a n , S .S i., M .S i.
Tahun: 2022
ISBN: WIP
FAKULTAS MIPA
P
UJI syukur kehadirat Tuhan Yang Maha Kuasa, atas izin-Nya lah, maka buku ini dapat diselesaikan
dengan baik. Penulis berharap buku ini dapat berguna untuk meningkatkan kompetensi pemba-
canya, khususnya mahasiswa Program Studi Fisika, Fakultas Matematika dan Ilmu Pengetahuan Alam,
Universitas Sam Ratulangi.
Penulis membuat buku ini dalam rangka untuk memenuhi salah satu persyaratan pelatihan dasar
(LATSAR) CPNS pada tahun 2022. Penulis juga ingin mengucapkan banyak terima kasih, kepada
pihak-pihak yang ikut berkontribusi dalam pembuatan buku ini, baik itu secara langsung, maupun
tidak langsung.
Buku ini kemungkinan besar masih banyak kesalahan, baik itu dari sisi kesalahan pengetikan
(typo), dan kesalahan lainnya. Oleh karena itu penulis dengan senang hati menerima kritikan dan
saran untuk dapat memperbaiki buku ini menjadi lebih baik (afrioni@unsrat.ac.id)
i
Daftar Isi
Sekapur Sirih i
Daftar Gambar iv
Daftar Tabel v
ii
DAFTAR ISI
Bagian 5 Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Daftar Pustaka 54
iii
Daftar Gambar
iv
Daftar Tabel
v
Daftar Kode Program (Source Code)
1.1 Print Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Contoh penetapan variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Contoh for loops dan while loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Contoh function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Contoh penggunaan packages NumPy dan Matplotlib . . . . . . . . . . . . . . . . . 5
2.1 Kode metode eliminasi Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Kode metode eliminasi Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Kode metode Gauss-Seidel matriks . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 Kode interpolasi linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Kode ekstrapolasi linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Kode Python pada gambar 3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4 Kode Python interpolasi polinomial Lagrange untuk x = 3 . . . . . . . . . . . . . . . 23
3.5 Kode Python interpolasi polinomial Newton untuk x = 3 . . . . . . . . . . . . . . . 27
3.6 Kode Python untuk grafik gambar 3.7 . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.7 Kode Python regresi linear massa vs gaya berat . . . . . . . . . . . . . . . . . . . . 31
4.1 Kode grafik fungsi f (x) = x2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Kode integrasi numerik aturan persegi panjang . . . . . . . . . . . . . . . . . . . . 37
4.3 Kode integrasi numerik aturan trapesium . . . . . . . . . . . . . . . . . . . . . . . . 39
4.4 Kode integrasi numerik aturan Simpson . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1 Kode grafik derivatif f ′ (5) pada fungsi f (x) = x2 . . . . . . . . . . . . . . . . . . . 43
5.2 Kode grafik selisih maju fungsi f (x) = x2 untuk h = 0.5 . . . . . . . . . . . . . . . 45
5.3 Kode perbandingan selisih maju dengan nilai sebenarnya pada f (x) = x2 . . . . . . 46
5.4 Kode grafik selisih mundur fungsi f (x) = x2 untuk h = 0.5 . . . . . . . . . . . . . 48
5.5 Kode perbandingan selisih mundur dengan nilai sebenarnya pada f (x) = x2 . . . . . 49
5.6 Kode perbandingan selisih tengah dengan nilai sebenarnya pada f (x) = x2 . . . . . . 52
vi
Bagian 1 Pendahuluan dan Instalasi
Python adalah salah satu bahasa pemrograman terbaik saat ini. Python juga bukan merupakan
program yang open source alias gratis. Bahasa pemrograman ini juga, menurut penulis adalah ba-
hasa yang paling mudah untuk dipelajari, dan sangat straight forward. Disamping itu bahasa ini juga
mudah diintegrasikan dan kegunaannya yang luas, dari web development, data infrastructure, ma-
chine learning, pembuatan game, analisis data, dll. Walaupun banyak bagian positifnya, beberapa
kelemahan Python adalah lebih lambat dari bahasa native seperti C dan Fortran. Oleh karena itu un-
tuk perhitungan sistem yang besar dan kompleks, Python membutuhkan computational cost (terutama
waktu) lebih besar dibandingkan dengan bahasa native tersebut. Namun untuk penyelesaian masalah
yang cukup sederhana dan tidak membutuhkan ongkos waktu yang tinggi, dan karena fleksibilitasnya,
penulis menyarankan untuk menggunakan Python.
Dalam buku ini akan mengulas bagaimana membuat program yang dapat menyelesaikan masalah-
masalah fisika, dengan menggunakan metode komputasi, yaitu:
Topik
1.1 Python
1.1.1 Instalasi
1
1.1. PYTHON
2
1.1. PYTHON
>>> v = 10 # m/s
>>> s = 100 # dalam meter
>>> t = 10 # dalam sekon
>>> v = s/t
>>> print(f"kecepatan (v):{v} m/s")
kecepatan (v):10.0 m/s
>>> v = (s/t) * (18/5) #konversi ke km/jam
>>> print(f"kecepatan (v):{v} km/jam")
kecepatan (v):36.0 km/jam
3
1.2. INTEGRATED DEVELOPMENT ENVIRONMENT (IDE)
[1]
# contoh fungsi menggunakan def
def velocity(s,t):
"""
s = distance (number)
t = time (number)
"""
v = s/t
return v
velocity(100,10)
...
10.0
[2]
# contoh fungsi menggunakan lambda
velocity_lambda = lambda s,t: s/t
...
10.0
Pada bahasa pemrograman, suatu fungsi mirip dengan fungsi yang ada di matematika ataupun
fisika, seperti fungsi kecepatan terhadap waktu v(t), dimana fungsi ini dapat berisi suatu variabel,
ataupun perintah yang dapat dieksekusi ketika fungsi tersebut dipanggil. Contoh fungsi pada Python
dapat dilihat pada kode 1.4.
4
1.3. PACKAGES
1.3 Packages
Python package berisi modul-modul yang merupakan file Python (.py), dan di dalamnya juga
berisi class, function, kemudian function tersebut dapat dipanggil pada program yang lain dengan
menggunakan metode import. Untuk menginstall suatu packages dapat menginput pip install pack-
age_name dalam terminal (cmd).
plt.figure(figsize=(7,5), dpi=100)
plt.plot(time,distance,'bo-')
plt.title('Distance vs Time')
plt.xlabel("Time (s)")
plt.ylabel("Distance (m)")
plt.legend(["Distance"])
plt.grid(True)
plt.savefig('free_fall.png')
plt.show()
5
1.3. PACKAGES
6
Bagian 2 Sistem Persamaan Linear
Dalam matematika, sistem persamaan linear adalah suatu kumpulan dari persamaan linear (satu
atau lebih) yang masing-masing persamaan mengandung variabel yang sama. Contohnya dapat dilihat
pada persamaan 2.1:
x + 3y − 2z = 5
3x + 5y + 6z = 7 (2.1)
2x + 4y + 3z = 8
Metode yang paling sederhana dalam menyelesaikan sistem persamaan linear adalah dengan
metode eliminasi. Contoh penyelesaian dari persamaan 2.1 adalah sebagai berikut:
Dengan menyelesaikan persamaan pertama menjadi persamaan x diperoleh x = 5 + 2z − 3y, dan
mensubtitusi persamaan ini ke dalam persamaan kedua dan ketiga diperoleh:
{
y = 3z + 2
(2.2)
y = 72 z + 1
7
3z + 2 = z + 1 (2.3)
2
Diperoleh z = 2, dengan mensubtitusi nilai z ke persamaan 2.2, maka nilai y dapat diperoleh, yaitu
y = 8. Selanjutnya untuk memperoleh nilai x, yaitu dengan cara nilai y dan z disubtitusi ke persamaan
x, diperoleh x = −15. Sehingga solusi dari sistem persamaan linear diatas adalah (−15, 8, 2).
Pada bagian ini, akan diperkenalkan beberapa metode komputasi yang dapat memperoleh solusi
dari sistem persamaan linear, diantaranya adalah metode eliminasi Gauss, Gauss-Jordan, dan Gauss-
Seidel.
Untuk dapat mereduksi matrik sehingga elemen di bawah diagonal utama menjadi nol, dapat
menggunakan algoritma berikut ini:
Memilih elemen di bawah diagonal utama yang akan dipilih menjadi nol, dimulai dari kolom
yang paling kiri setiap barisnya, kemudian bergerak ke kanan, misalnya dimulai dari baris ke-2
kolom ke-1 a(2,1) .
7
2.1. METODE ELIMINASI GAUSS
Jika elemen tersebut sudah nol, maka dilewati dan lanjutkan pada elemen yang lain.
a a
Mencari faktor dari kedua baris tersebut c = a(j,i) (i,i)
, misalnya c = a(2,1)
(1,1)
. Jika faktor pembagi dari
elemen adalah nol, maka tukarlah baris tersebut (swap), sehingga tidak menimbulkan error.
Mengganti semua elemen pada baris, dengan mengoperasikan faktor yang diperoleh ( dari) tahap
a(2,1)
sebelumnya aj,k = aj,k − c.ai,k , misalnya pada elemen a(2,1) = a(2,1) − a(1,1) .a(1,1) , atau
( )
a
elemen berikutnya a(2,2) = a(2,2) − a(2,1)
(1,1)
.a (1,2) .
Ulangi iterasi sehingga semua elemen di bawah diagonal utama menjadi nol.
Contoh dari penyelesaian sistem persamaan linear pada persamaan 2.1, dengan menggunakan
metode eliminasi Gauss adalah sebagai berikut:
1 3 −2 5 1 3 −2 5
3 5 6 7 → R2 = R2 − 3R1 → 0 −4 12 −8 (2.4)
2 4 3 8 2 4 3 8
1 3 −2 5 1 3 −2 5
0 −4 12 −8 → R3 = R3 − 2R1 → 0 −4 12 −8 (2.5)
2 4 3 8 0 −2 7 −2
1 3 −2 5 1 3 −2 5
2
0 −4 12 −8 → R3 = R3 − R2 → 0 −4 12 −8 (2.6)
4
0 −2 7 −2 0 0 1 2
Ketika semua elemen di bawah diagonal utama sudah menjadi nol, maka dengan mensubtitusi ke
belakang, nilai x, y, z, dapat diperoleh
−8 − 12(2)
z=2→y= = 8 → x = 5 + 2(2) − 3(8) = −15 (2.7)
−4
Solusi dari sistem persamaan linear dengan menggunakan Python dapat menggunakan kode berikut:
import numpy as np
a = np.array([[1,3,-2,5],[3,5,6,7],[2,4,3,8]], float) # augmented matrix
n = len(a)
x = np.zeros(n) # untuk menyimpan solusi
print(a)
print('*'*20)
print('Mulai iterasi eliminasi Gauss')
# Tahap Eliminasi
for i in range(n):
if a[i][i] == 0.0:
raise Exception('Pembagi 0 terdeteksi')
break
for j in range(i+1, n):
c = a[j][i]/a[i][i]
for k in range(n+1):
a[j][k] = a[j][k] - c * a[i][k]
8
2.2. METODE ELIMINASI GAUSS-JORDAN
print(a)
print('*'*20)
# Tahap Subtitusi
x[n-1] = a[n-1][n]/a[n-1][n-1]
for i in range(n-2,-1,-1):
x[i] = a[i][n]
for j in range(i+1,n):
x[i] = x[i] - a[i][j]*x[j]
x[i] = x[i]/a[i][i]
print('*'*20)
print('Solusi dari sistem persamaan linear:')
print(x)
...
[[ 1. 3. -2. 5.]
[ 3. 5. 6. 7.]
[ 2. 4. 3. 8.]]
********************
Mulai iterasi eliminasi Gauss
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 2. 4. 3. 8.]]
********************
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 0. -2. 7. -2.]]
********************
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 0. 0. 1. 2.]]
********************
********************
Solusi dari sistem persamaan linear:
[-15. 8. 2.]
Kode 2.1 juga dapat diakses di Google Colab - System Of Linear Equation, dengan menggunakan
akun UNSRAT.
9
2.2. METODE ELIMINASI GAUSS-JORDAN
Contoh dari penyelesaian sistem persamaan linear pada persamaan 2.1, dengan menggunakan
metode eliminasi Gauss-Jordan adalah sebagai berikut:
1 3 −2 5 1 3 −2 5
3 5 6 7 → R2 = R2 − 3R1 → 0 −4 12 −8 (2.8)
2 4 3 8 2 4 3 8
1 3 −2 5 1 3 −2 5
0 −4 12 −8 → R3 = R3 − 2R1 → 0 −4 12 −8 (2.9)
2 4 3 8 0 −2 7 −2
1 3 −2 5 1 3 −2 5
2
0 −4 12 −8 → R3 = R3 − R2 → 0 −4 12 −8 (2.10)
4
0 −2 7 −2 0 0 1 2
1 3 −2 5 1 3 0 9
0 −4 12 −8 → R1 = R1 + 2R3 → 0 −4 12 −8 (2.11)
0 0 1 2 0 0 1 2
1 3 0 9 1 3 0 9
0 −4 12 −8 → R2 = R2 − 12R3 → 0 −4 0 −32 (2.12)
0 0 1 2 0 0 1 2
1 3 0 9 1 0 0 −15
3
0 −4 0 −32 → R1 = R1 + R2 → 0 −4 0 −32 (2.13)
4
0 0 1 2 0 0 1 2
1 3 0 9 1 0 0 −15
−1
0 −4 0 −32 → R2 = R2 → 0 1 0 8 (2.14)
4
0 0 1 2 0 0 1 2
Solusi dari sistem persamaan linear langsung dapat diperoleh yaitu (-15,8,2). Sedangkan dalam
program Python dapat dilihat pada kode 2.2.
import numpy as np
a = np.array([[1,3,-2,5],[3,5,6,7],[2,4,3,8]], float) # augmented matrix
n = len(a)
x = np.zeros(n) # untuk menyimpan solusi
10
2.2. METODE ELIMINASI GAUSS-JORDAN
print(a)
print('*'*20)
print('Mulai iterasi eliminasi Gauss-Jordan')
for i in range(n):
x[i] = a[i][n]/a[i][i]
11
2.3. METODE GAUSS-SEIDEL
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 0. -2. 7. -2.]]
********************
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 0. 0. 1. 2.]]
********************
[[ 1. 3. -2. 5.]
[ 0. -4. 0. -32.]
[ 0. 0. 1. 2.]]
********************
[[ 1. 3. 0. 9.]
[ 0. -4. 0. -32.]
[ 0. 0. 1. 2.]]
********************
[[ 1. 0. 0. -15.]
[ 0. -4. 0. -32.]
[ 0. 0. 1. 2.]]
********************
Solusi dari sistem persamaan linear:
[-15. 8. 2.]
Untuk menyelesaikan suatu persamaan linear dengan variabel yang tidak diketahui x:
Ax = b. (2.15)
Matriks A harus memenuhi syarat strictly diagonally dominant, yang berarti masing-masing elemen
diagonal utama lebih besar atau sama dengan dari jumlah elemen lainnya pada baris tersebut (lihat
persamaan 2.16).
∑
|aii | ≥ |aij | untuk semua i (2.16)
j̸=i
12
2.3. METODE GAUSS-SEIDEL
Persamaan 2.1,
1 3 −2
A= 3 5 6 (2.17)
2 4 3
tidak dapat diselesaikan dengan menggunakan metode Gauss-Seidel karena tidak memenuhi kondisi
diagonally dominant, contohnya |1| < |3| + | − 2|. Memungkinkan untuk diselesaikan jika barisnya
masih bisa ditukar untuk mencapai kondisi tersebut.
Ada dua cara untuk menyelesaikan sistem persamaan linear dengan menggunakan metode Gauss-
Seidel. Yaitu dengan menggunakan matriks, dan dengan menggunakan metode substitusi persamaan.
Untuk metode matriks dapat menggunakan persamaan berikut:
L∗ x(k+1) = b − U x(k) (2.18)
dimana x(k) adalah solusi dari variabel x untuk iterasi ke-k , x(k+1) adalah solusi dari variabel x pada
iterasi ke-(k+1), dan matriks A dipecah menjadi dua matriks, yaitu matriks triangular bawah L∗ dan
matriks triangular atas (tanpa diagonal) U .
a11 a12 · · · a1n x1 b1
a21 a22 · · · a2n x2 b2
A=
..
, x=
.. , b=
.. . (2.19)
.
..
.
..
. ...
. .
an1 an2 · · · ann xn bn
a11 0 ··· 0 0 a12 · · · a1n
a21 a22 ··· 0 0 0 · · · a2n
A = L∗ + U dimana .
L∗ = , U = (2.20)
.. ... .. .. .. . . . .. .
.. . . . . .
an1 an2 · · · ann 0 0 ··· 0
Sehingga sistem dari persamaan linear dapat ditulis sebagai:
L∗ x = b − U x (2.21)
dan solusinya adalah:
( )
x(k+1) = L−1
∗ b − U x(k) . (2.22)
solusi dapat diperoleh jika konvergensi sudah terpenuhi dengan nilai error dibawah dari nilai toleransi
yang ditetapkan.
Contoh penyelesaian Gauss-Seidel dengan metode matriks, untuk persamaan:
4x + y + 2z = 4
3x + 5y + 1z = 7 (2.23)
x + y + 3z = 3
Ax = b dijabarkan:
13
2.3. METODE GAUSS-SEIDEL
4 1 2 x 4
A = 3 5 1 , x = y , b = 7. (2.24)
1 1 3 z 3
Matriks A sudah terpenuhi kondisi diagonally dominant, sehingga solusi dari persamaan 2.23 dapat
dicari dengan menggunakan persamaan 2.22.
4 0 0 0.25 0 0 0 1 2
L∗ = 3 5 0 , L−1
∗ = −0.15 0.2 0 , U = 0 0 1 . (2.25)
1 1 3 −0.0333 −0.0667 0.3333 0 0 0
Persamaan 2.22 dapat diganti menjadi bentuk,
x(k+1) = T x(k) + C (2.26)
dimana:
T = −L−1 −1
∗ U dan C = L∗ b. (2.27)
sehingga:
0.25 0 0 0 1 2 0 −0.25 −0.5
T = − −0.15 0.2 0 × 0 0 1 = 0 0.15 0.1 (2.28)
−0.0333 −0.0667 0.333 0 0 0 0 0.0333 0.1333
dan
0.25 0 0 4 1
C = −0.15 0.2 0 × 7 = 0.8 (2.29)
−0.0333 −0.0667 0.333 3 0.4
diperoleh x(1) ,
0 −0.25 −0.5 0 1 1
x(1) = 0 0.15 0.1 × 0 + 0.8 = 0.8 (2.31)
0 0.0333 0.1333 0 0.4 0.4
iterasi ke dua x(2) ,
0 −0.25 −0.5 1 1 0.6
x(2) = 0 0.15 0.1 × 0.8 + 0.8 = 0.96 (2.32)
0 0.0333 0.1333 0.4 0.4 0.48
iterasi ke tiga x(3) ,
0 −0.25 −0.5 0.6 1 0.52
x(3) = 0 0.15 0.1 × 0.96 + 0.8 = 0.992 (2.33)
0 0.0333 0.1333 0.48 0.4 0.496
14
2.3. METODE GAUSS-SEIDEL
limit = 1000
A = np.array([[4,1,2],
[3,5,1],
[1,1,3]], float)
b = np.array([4, 7, 3], float)
n = len(A)
T = np.dot(-L_inverse, U)
C = np.dot(L_inverse, b)
x_i = np.add( np.dot(T,x), C)
15
2.3. METODE GAUSS-SEIDEL
break
x = x_i
else:
print('Matrix is not diagonally dominant')
print('*'*40)
print(f"Solution: {x}")
error = np.dot(A, x) - b
print("Error: {0}".format(error))
...
Matrix is diagonally dominant
Iteration 0: [0. 0. 0.]
Iteration 1: [1. 0.8 0.4]
Iteration 2: [0.6 0.96 0.48]
Iteration 3: [0.52 0.992 0.496]
Iteration 4: [0.504 0.9984 0.4992]
Iteration 5: [0.5008 0.99968 0.49984]
Iteration 6: [0.50016 0.999936 0.499968]
Iteration 7: [0.500032 0.9999872 0.4999936]
Iteration 8: [0.5000064 0.99999744 0.49999872]
Iteration 9: [0.50000128 0.99999949 0.49999974]
Iteration 10: [0.50000026 0.9999999 0.49999995]
Iteration 11: [0.50000005 0.99999998 0.49999999]
Iteration 12: [0.50000001 1. 0.5 ]
****************************************
Solution: [0.50000001 1. 0.5 ]
Error: [3.27679999e-08 8.19200086e-09 0.00000000e+00]
Metode kedua dalam penyelesaian Gauss-Seidel adalah dengan metode subtitusi. Misalnya pada
persamaan 2.23, dapat diperoleh persamaan untuk masing-masing variabel:
1
x = (4 − y − 2z)
4
1
y = (7 − 3x − 5y − 1z) (2.36)
5
1
z = (3 − x − y)
3
dengan memberikan nilai awal misalnya (0,0,0), dan dilakukan iterasi yang sama seperti dengan metode
matriks, maka solusinya akan dapat diperoleh.
16
Bagian 2 Tugas
K Bagian 2 Tugas k
1. Carilah solusi dari sistem persamaan garis lurus berikut dengan menggunakan metode eliminasi
Gauss secara manual:
x1 + 2x2 + 3x3 + 4x4 + 5x5 = 7
2x1 + x2 + 2x3 + 3x4 + 4x5 = −1
3x1 + 2x2 + x3 + 2x4 + 3x5 = −3
4x + 3x2 + 2x3 + x4 + 2x5 = 5
1
5x1 + 4x2 + 3x3 + 2x4 + x5 = 17
Bandingkan hasilnya dengan menggunakan pemrograman Python!
2. Carilah solusi dari sistem persamaan garis lurus berikut dengan menggunakan metode eliminasi
Gauss-Jordan secara manual:
−8x1 + 9x2 − 3x3 − 6x4 = 30
4x1 − 5x2 − 8x3 − 10x4 = 48
2x1 − 3x2 − x3 + 9x4 = −50
−6x1 + 8x2 + 8x3 + 3x4 = −12
Kemudian bandingkan hasilnya dengan menggunakan pemrograman Python!
3. Buatlah kode Python untuk menyelesaikan sistem persamaan linear pada persamaan 2.23, meng-
gunakan metode Gauss-Seidel secara subtitusi pada 2.36 untuk 12 kali iterasi!
17
Bagian 3 Interpolasi dan Ekstrapolasi
Contoh dari interpolasi dan ekstrapolasi dapat dilihat pada gambar 3.1. Beberapa metode yang
digunakan pada buku ini adalah adalah interpolasi/ekstrapolasi linear, interpolasi/ekstrapolasi polino-
mial. Dengan tambahan metode fitting kurva menggunakan Python.
Jika dua titik pada koordinat diberikan sebagai (x0 , y0 ) dan (x1 , y1 ), untuk nilai x dalam interval
(x0 , x1 ), maka nilai y sepanjang garis lurus diberikan dalam persamaan gradien (slope):
y − y0 y1 − y0
= , (3.1)
x − x0 x1 − x0
18
3.1. INTERPOLASI LINEAR
Untuk menyelesaikan contoh kasus 3.1, dapat menggunakan persamaan 3.2, dengan nilai y(x =
2) adalah: ( ) ( )
3−2 2−0
y=1 +4 =3 (3.3)
3−0 3−0
Dalam Python dapat ditulis:
import numpy as np
import matplotlib.pyplot as plt
x = [0,3]
y = [1,4]
x_n = 2
y_n = (y[0]*((x[1]-x_n)/(x[1]-x[0])))+(y[1]*((x_n-x[0])/(x[1]-x[0])))
print(f"({x_n}, {y_n})")
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y, 'bo--')
19
3.2. EKTRAPOLASI LINEAR
plt.plot(x_n,y_n, 'ro')
plt.xlim([-1, 4])
plt.ylim([0, 5])
plt.grid()
plt.show()
...
(2, 3.0)
Jika dua titik pada koordinat diberikan sebagai (x0 , y0 ) dan (x1 , y1 ), untuk nilai x∗ diluar interval
(x0 , x1 ), maka nilai y sepanjang garis lurus diberikan dalam persamaan gradien (slope):
x∗ − x0
y(x∗ ) = y0 + (y1 − y0 ) (3.4)
x1 − x0
Contoh Kasus 3.2 (Ekstrapolasi Linear)
Carilah nilai y untuk x = 3 dari dua titik (0,1) dan (2,3) dengan menggunakan ekstrapolasi
linear! ♡
Dengan metode ekstrapolasi linear kita dapat mengetahui nilai x = 3 pada contoh kasus 3.2.
Menggunakan persamaan 3.4 nilai y(x = 3) adalah:
3−0
y(x∗ = 3) = 1 + (3 − 1) = 4 (3.5)
2−0
dalam Python dapat menggunakan kode berikut:
import numpy as np
import matplotlib.pyplot as plt
x = [0,2]
y = [1,3]
x_n = 3
y_n = y[0] + ((x_n - x[0])/(x[1]-x[0])) * (y[1] - y[0])
print(f"({x_n}, {y_n})")
plt.figure(figsize=(6,4), dpi=100)
plt.plot([x[1], x_n], [y[1], y_n], linestyle = 'dashed', color = 'red')
plt.plot(x,y, 'bo--')
plt.plot(x_n,y_n, 'ro')
plt.xlim([-1, 4])
plt.ylim([0, 5])
20
3.3. INTERPOLASI POLINOMIAL LAGRANGE
plt.grid()
plt.savefig('linear_extrapolation.png')
plt.show()
...
(3, 4.0)
21
3.3. INTERPOLASI POLINOMIAL LAGRANGE
Salah satu metode interpolasi polinomial adalah interpolasi polinomial Lagrange, dengan defin-
isi:
∑
n
L(x) = ℓi (x)yi . (3.6)
i=0
dimana L(x) adalah nilai yang akan diprediksi dengan menggunakan interpolasi polinomial Lagrange
dari titik data x, yi adalah semua data y yang diketahui, n adalah derajat dari polinomial, jumlah titik
data adalah derajat dari polinomal ditambah satu n+1, dan ℓi (x) adalah Lagrange basis dengan definisi
sebagai berikut:
(x − x0 ) (x − xi−1 ) (x − xi+1 ) (x − xn )
ℓi (x) = ··· ···
(xi − x0 ) (xi − xi−1 ) (xi − xi+1 ) (xi − xn )
∏ x − xj
n
(3.7)
= .
x − xj
j=0 i
j̸=i
dimana x adalah data yang akan diprediksi, {x0 , x1 , . . . , xn } adalah titik-titik data yang diketahui.
Contoh Kasus 3.3 (Interpolasi Polinomial Lagrange)
Carilah nilai y(x = 3) untuk data x = [0, 1, 2, 4], dan y = [1, 3, 2, 5]!
♡
Jika titik-titik data pada contoh kasus 3.3 diplot dengan menggunakan grafik sebaran (scatter
plot), diperoleh grafik sebagai berikut:
22
3.3. INTERPOLASI POLINOMIAL LAGRANGE
x = [0, 1, 2, 4]
y = [1, 3, 2, 5]
Untuk contoh kasus 3.3 terlebih dahulu dicari nilai Lagrange basisnya. Dikarenakan jumlah titik data
adalah 4 titik data, maka derajat polinomial adalah 3 (n = 3). Untuk masing-masing Lagrange basis,
dengan menggunakan persamaan 3.7 diperoleh:
(3 − 1) (3 − 2) (3 − 4)
ℓ0 (3) = = 0.25
(0 − 1) (0 − 2) (0 − 4)
(3 − 0) (3 − 2) (3 − 4)
ℓ1 (3) = = −1
(1 − 0) (1 − 2) (1 − 4)
(3.8)
(3 − 0) (3 − 1) (3 − 4)
ℓ2 (3) = = 1.5
(2 − 0) (2 − 1) (2 − 4)
(3 − 0) (3 − 1) (3 − 2)
ℓ3 (3) = = 0.25
(4 − 0) (4 − 1) (4 − 2)
Persamaan Lagrange untuk data pada contoh kasus 3.3 dapat ditulis:
L(3) = ℓ0 (3)y0 + ℓ1 (3)y1 + ℓ2 (3)y2 + ℓ3 (3)y3
L(3) = (0.25)(1) + (−1)(3) + (1.5)(2) + (0.25)(5) (3.9)
L(3) = 1.5
# raw data
x = np.array([0, 1, 2, 4], float)
y = np.array([1, 3, 2, 5], float)
x_l = 3.0
23
3.3. INTERPOLASI POLINOMIAL LAGRANGE
# lagrange polynomial
lagrange_poly = 0
for i in range(n+1):
lagrange_poly = lagrange_poly + ((lagrange_basis[i])*(y[i]))
return lagrange_poly
y_lagrange = lagrange_polynomial(x,y,x_l)
for xp in xplt:
yp = lagrange_polynomial(x, y, xp)
yplt = np.append(yplt,yp)
24
3.4. INTERPOLASI POLINOMIAL NEWTON
plt.xlabel('x')
plt.ylabel('y')
plt.xlim([-1, 5])
plt.ylim([0, 6])
plt.legend()
plt.grid()
plt.savefig('lagrange_polynomial_predict.png')
plt.show()
...
For x = 3.0, then y = 1.5
Dan output dari kode program 3.4 dapat dilihat pada gambar 3.5.
25
3.4. INTERPOLASI POLINOMIAL NEWTON
dimana N (x) adalah nilai yang akan diprediksi dengan menggunakan interpolasi polinomial Newton
dari titik data x, ai adalah koefisien dari polinomial yang dicari menggunakan metode divided differ-
ence, k adalah derajat dari polinomial, dan ni (x) adalah Newton basis dengan definisi sebagai berikut:
∏
k−1
ni (x) = (x − xi−1 ). (3.11)
i=0
dimana x adalah data yang akan diprediksi nilai y-nya. Untuk n0 (x) nilainya akan selalu 1.
Untuk mencari nilai ai menggunakan metode divided differences dapat diekspresikan dalam ben-
tuk tabel. Misalnya untuk fungsi f (x) dengan titik-titik data x0 , . . . , xn x0 , . . . , xn , dapat ditulis seba-
gai:
x0 f (x0 )
f (x1 )−f (x0 )
x1 −x0
f (x2 )−f (x1 ) f (x )−f (x )
x2 −x1
− x1 −x 0
x1 f (x1 ) x2 −x0
1 0
Contoh kasus 3.4 sama persis dengan contoh kasus menggunakan metode lagrange, dan seharus-
nya memperoleh nilai yang sama. Terlebih dahulu kita mencari nilai ai dengan menggunakan metode
divided difference, dalam bentuk tabel:
26
3.4. INTERPOLASI POLINOMIAL NEWTON
(2−3) (( 32 )−(−1))
1 1 3 (2−1) = −1 (4−1) = 5
6
(5−2) 3
2 2 2 (4−2) = 2
3 4 5
# raw data
x = np.array([0, 1, 2, 4], float)
y = np.array([1, 3, 2, 5], float)
x_newt = 3.0
27
3.4. INTERPOLASI POLINOMIAL NEWTON
n = len(x) - 1
# set the Newton basis
newton_basis = []
n_basis = 1
for i in range(1,n+1):
n_basis = n_basis * ((x_newt - x[i-1]))
newton_basis.append(n_basis)
# divided difference
m = len(y)
coeff = np.zeros([m, m]) #generate an array
# set the first column as y
coeff[:,0] = y
for j in range(1, m): #skip index 0
for i in range(m-j):
coeff[i][j] = (coeff[i+1][j-1] - coeff[i][j-1]) / (x[i+j]-x[i])
newton_poly = np.sum(a)
return newton_poly, a_i, newton_basis
newton_function = newton_polynomial(x,y,x_newt)
y_newton= newton_function[0]
print(f'a_i: {newton_function[1]}')
print(f'Newton basis (n): {newton_function[2]}')
print(f'For x = {x_newt}, using Newton polynomial then y = {y_newton}')
for xp in xplt:
yp = newton_polynomial(x, y, xp)[0]
yplt = np.append(yplt,yp)
28
3.4. INTERPOLASI POLINOMIAL NEWTON
29
3.5. CURVE FITTING
Metode yang biasa digunakan adalah metode kuadrat terkecil (least-squares method), yaitu den-
gan meminimalisir perbedaan atau selisih antara titik-titik data dan kurva. Pada buku ini lebih men-
jelaskan bagaimana dapat memperoleh nilai-nilai dari parameter optimum suatu fungsi/kurva, den-
gan menggunakan pemrograman Python, khususnya menggunakan package SciPy. Untuk menginstal
package ini dapat memasukkan pip install scipy pada terminal (cmd).
Contoh Kasus 3.5 (Curve Fitting)
Suatu eksperimen fisika dasar mengukur gaya berat dengan memvariasi massa dari benda,
untuk mengukur gaya berat menggunakan alat dynamometer, dengan variasi massa benda
m = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1] dalam kg, dan hasil pengukuran gaya berat
w = [1.01, 1.94, 2.95, 3.90, 4.85, 5.94, 6.65, 7.84, 8.83, 9.85] dalam Newton (N). Carilah nilai
gravitasinya dengan menggunakan metode fitting kurva! ♡
30
3.5. CURVE FITTING
m = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0], float)
w = np.array([1.01, 1.94, 2.95, 3.90, 4.85, 5.94, 6.65, 7.84, 8.83, 9.85], float)
Dari grafik pada gambar 3.7, dapat dilihat bahwa perubahan massa berbanding lurus dengan gaya
beratnya, hal ini juga sejalan dengan formula gaya berat w = mg, yang merupakan persamaan garis
lurus. Dengan menggunakan metode regresi linear y = sx + c, dimana s adalah slope/gradien suatu
kurva, c adalah titik potong kurva terhadap sumbu y pada x = 0, maka nilai dari gravitasi dapat
diperoleh dari gradiennya.
Dengan menggunakan Python, diperoleh nilai dari gravitasi (g ± ∆g) = (9, 79 ± 0, 09) m/s2 ,
menggunakan kode sebagai berikut:
from scipy.optimize import curve_fit
def func(x, s, c):
"""
s: slope or gradient, in this case gravity
"""
y = s*x + c # linear regression
return y
print('gravity:',round(popt[0],2), 'm/s^2')
print('error:',round(perr[0],2), 'm/s^2')
31
Bagian 3 Tugas
plt.ylabel('weight (N)')
plt.savefig('gravity_from_linear_regression.png')
plt.grid()
...
gravity: 9.79 m/s^2
error: 0.09 m/s^2
Source Code 3.7: Kode Python regresi linear massa vs gaya berat
Gambar 3.8: Grafik massa (kg) versus gaya berat (N) dengan metode regresi linear
K Bagian 3 Tugas k
1. Dari suatu eksperimen hukum Hooke diperoleh data berikut ini:
perpindahan ∆x = [0.045, 0.09, 0.135, 0.18] m,
dan gaya dari variasi massa F = [0.98, 1.96, 2.94, 3.92] N,
(a) carilah nilai F menggunakan interpolasi/ekstrapolasi linear untuk data ∆x = [0.15, 0.225]!
(b) plot data tersebut menggunakan Python, dengan hasil interpolasi/ekstrapolasinya!
(c) gunakan metode regresi linear untuk memperoleh nilai konstanta pegas (k ± ∆k) meng-
gunakan Python!
32
Bagian 3 Tugas
2. Diberikan suatu optimasi parameter kisi (a) dari material dua dimensi FeTe2 , adalah sebagai
berikut:
(a) carilah nilai Energi untuk parameter kisi 2.97 Å dengan menggunakan interpolasi polino-
mial Lagrange secara manual, dan bandingkan hasilnya dengan menggunakan pemrogra-
man Python!
(b) carilah nilai Energi untuk parameter kisi 2.97 Å dengan menggunakan interpolasi polino-
mial Newton secara manual, dan bandingkan hasilnya dengan menggunakan pemrograman
Python!
(c) plot data tabel 3.2 menggunakan Python, dengan fungsi dari polinomial Lagrange dan
polynomial Newton (2 grafik)!
3. Menggunakan persamaan keadaan Birch-Murnaghan (Birch-Murnaghan equation of state) yaitu:
√ ([ ]3 [( ) 4 ]2 [ )
3 · a20 · cz · 9 · B0 ( a ) 34 a0 3 ( a ) 34 ]
0 ′ 0
E(a) = E0 + − 1 B0 + −1 · 6−4
32 a a a
dan data dari tabel 3.2
(a) carilah nilai energi minimum E0 , dan parameter kisi optimal a0 bersama nilai erornya
menggunakan curve_fit dari package SciPy Python (cz = 30Å)!
(b) plot data menggunakan Python dengan fungsi fitting di atas!
33
Bagian 4 Integrasi Numerik
Jika diberikan suatu fungsi kurva f (x), maka luas di bawah kurva tersebut merupakan suatu
integral tentu (definite integral) dari fungsi, yaitu:
(4.1)
∫ b
f (x) dx
a
Salah satu metodenya adalah dengan membagi luas area tersebut dengan luas bidang (persegi
panjang, trapesium, dll), kemudian dengan menjumlahkan kumpulan luas bidang tersebut, maka pen-
dekatan dari luas di bawah kurva dapat diperoleh. Beberapa metode integrasi numerik adalah aturan
persegi panjang, aturan trapesium, dan aturan Simpson.
Contoh Kasus 4.1 (Integral Tentu)
Diberikan suatu fungsi f (x) = x2 , carilah luas di bawah kurva pada rentang a = 2 dan b = 6!
♡
34
Gambar 4.2: Luas di bawah kurva f (x) = x2 dengan a = 2 dan b = 6
Dengan program Python untuk membuat grafik pada gambar 4.2 adalah:
a = 2 # lower limit
b = 6 # upper limit
f = lambda x: x**2 # function
x = np.linspace(a-1,b+1,100)
y = f(x)
x_area = np.linspace(a,b,100)
y_area = f(x_area)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y, label='$f(x) = x^{2}$')
plt.fill_between(x_area,y_area, color='#b2edda' )
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.text(4.5,8,'S', fontsize=16)
35
4.1. ATURAN PERSEGI PANJANG
plt.grid()
plt.savefig('definite_integration.png')
plt.show()
Jika dituliskan secara matematik, maka contoh kasus 4.1 dapat ditulis sebagai:
∫ 6
x2 dx (4.2)
2
dengan menggunakan metode analitik, dapat diperoleh:
∫ 6
1
x2 dx = x3 |62
3
2
[ ] [ ]
1 3 1 3
= (6) − (2)
3 3
[ ] [ ]
216 8 (4.3)
= −
3 3
208
=
3
≈ 69.33
Gambar 4.3: Aturan persegi panjang untuk n = 4 pada kurva f (x) = x2 dengan a = 2 dan b = 6
36
4.1. ATURAN PERSEGI PANJANG
Dari gambar 4.3, untuk luas di bawah kurva f (x) = x2 dengan a = 2 dan b = 6, menggunakan
aturan persegi panjang, maka total luas dari ke-4 persegi panjang tersebut adalah pendekatan dari luas
di bawah kurva. Dengan lebar masing-masing persegi panjang h adalah rentang jarak a ke b dibagi
dengan jumlah dari persegi yang diinginkan n, yaitu:
b−a
h= (4.4)
n
dan tinggi dari persegi panjang adalah f (xmid ), dengan xmid adalah nilai x tepat ditengah-tengah dari
masing-masing persegi panjang. f (xmid ) dapat ditulis:
( )
i∗h
f (xmid ) = f a + (4.5)
2
dimana i adalah bilangan ganjil dengan rentang dari 1 ke 2n − 1. Sehingga persamaan umumnya dapat
ditulis: [2n−1 ( )]
∑ i∗h
Arect = h f a+ untuk i ganjil (4.6)
i=1
2
Untuk kasus pada gambar 4.3, dengan n = 4, ketika dicari luas persegi panjang masing-masingnya,
diperoleh:
L1 = h · f (xmid 1 ) = 1 · (2.5)2 = 6.25
L2 = h · f (xmid 2 ) = 1 · (3.5)2 = 12.25
(4.7)
L2 = h · f (xmid 3 ) = 1 · (4.5)2 = 20.25
L2 = h · f (xmid 4 ) = 1 · (5.5)2 = 30.25
dan luas total persegi panjangnya adalah:
Arec = L1 + L2 + L3 + L4
Arec = 6.25 + 12.25 + 20.25 + 30.25 (4.8)
Arec = 69
Dengan n = 4 sudah dapat mendekati nilai sebenarnya dari luas di bawah kurva, dengan perbedaan
yang cukup kecil dari nilai analitik (lihat persamaan 4.3) sekitar 0.33 (Nilai Analitik - Nilai Pen-
dekatan), atau eror sebesar 0.5%. Eror ini dapat diperkecil dengan meningkatkan jumlah dari persegi
panjang (pembagi n), sesuai dengan tingkat akurasi yang diinginkan.
Dalam pemrograman Python, contoh kasus 4.1 dengan menggunakan aturan persegi panjang
dapat ditulis sebagai berikut:
a = 2 # lower limit
b = 6 # upper limit
f = lambda x: x**2 # function
n = 4
h = (b - a) / n #distance for each of rectangular
37
4.2. ATURAN TRAPESIUM
sum_n = 0
for i in range(1,(2*n)):
# range from 1 to 2n-1
if i % 2 == 1: # odd number only
sum_n = sum_n + f(a + ((i*h)/2))
integral_solution = h * sum_n
Dengan menggunakan aturan persegi panjang pada contoh kasus di atas, diperlukan sekitar 26 persegi
panjang, untuk memperoleh nilai yang sama pada tingkat akurasi 2 angka di belakang koma.
Gambar 4.4: Aturan trapesium untuk n = 4 pada kurva f (x) = x2 dengan a = 2 dan b = 6
38
4.2. ATURAN TRAPESIUM
Aturan trapesium, menggunakan metode yang sama dengan aturan persegi panjang. Yaitu dengan
membagi sama besar luas di bawah kurva dengan luas suatu bidang, dalam kasus ini adalah bidang
trapesium. Misalnya pada gambar 4.4, luas di bawah kurva dibagi dengan 4 trapesium. Dari pen-
jumlahan masing-masing luas bidang trapesium, maka nilai pendekatan luas di bawah kurva dapat
diperoleh.
Dengan rumus luas dari trepesium adalah:
1
A = h(b1 + b2 ) (4.9)
2
untuk b1 dan b2 dengan tegak paralel, maka total luas dari masing-masing trapesium adalah:
Atrap = 12 h [f (a) + 2f (a + h) + 2f (a + 2h) + · · · + 2f (a + (n − 1)h) + f (b)]
(4.10)
Atrap = 12 h [f (a) + f (b) + 2f (a + h) + 2f (a + 2h) + · · · + 2f (a + (n − 1)h)]
Untuk kasus pada gambar 4.4, dengan n = 4, ketika dicari luas trapesium masing-masingnya,
diperoleh:
L1 = 12 h(f (2) + f (3)) = 12 · 1 · [(2)2 + (3)2 ] = 6.5
L2 = 12 h(f (3) + f (4)) = 1
2
· 1 · [(3)2 + (4)2 ] = 12.5
(4.11)
L2 = 12 h(f (4) + f (5)) = 1
2
· 1 · [(4)2 + (5)2 ] = 20.5
L2 = 12 h(f (5) + f (6)) = 1
2
· 1 · [(2)2 + (3)2 ] = 30.5
dan luas total trapesiumnya adalah:
Atrap = L1 + L2 + L3 + L4
Atrap = 6.5 + 12.5 + 20.5 + 30.5 (4.12)
Atrap = 70
Dengan n = 4, perbedaan yang cukup kecil dari nilai analitik (lihat persamaan 4.3) sekitar 1 (Nilai
Analitik - Nilai Pendekatan), atau eror sebesar 1%. Eror ini dapat diperkecil dengan meningkatkan
jumlah dari persegi panjang (pembagi n), sesuai dengan tingkat akurasi yang diinginkan. Namun
jika dibandingkan dengan metode persegi panjang, untuk kasus luas di bawah kurva f (x) = x2 ,
untuk memperoleh nilai akurasi yang sama dengan perhitungan analitik (6.33), memerlukan jumlah
trapesium yang jauh lebih banyak, yaitu sekitar 81 trapesium, untuk akurasi 2 angka dibelakang koma.
Dalam pemrograman Python, contoh kasus 4.1 dengan menggunakan aturan trapesium dapat
ditulis sebagai berikut:
sum_n = 0
39
4.3. ATURAN SIMPSON
for i in range(1,n):
sum_n = sum_n + 2*f(a + i*h) # remaining summation using for loop
dimana h adalah lebar dari interval yang akan dibagi sebanyak n, yaitu h = (b − a)/n.
Untuk contoh kasus 4.1, dengan menggunakan aturan Simpson untuk n = 4, maka:
∫ 6 [ ∑3 ∑ 2 ]
1
x dx ≈ f (2) + 4
2
f (xj ) + 2 f (xj ) + f (6) , (4.14)
2 3 j=1, j odd j=2, j even
40
4.3. ATURAN SIMPSON
f = lambda x: x**2
a = 2
b = 6
n = 4
h = (b - a) / n
x = np.linspace(a, b, n+1)
f_x = f(x)
print('x:',list(x))
print('f(x):',list(f_x))
# for odd iteration
#[1:-1] means excluding first and last element
#[::2] means skip 2 steps
odd = 4*(sum(f_x[1:-1:2]))
print('odd iteration:', odd)
# for even iteration
#[2:-2] means excluding first two and last two elements
#[::2] means skip 2 steps
even = 2*(sum(f_x[2:-2:2]))
print('event iteration:', even)
# Simpson Rule
Sn = (h/3)*(f(a)+ odd + even + f(b))
print('integral solution:', Sn)
...
x: [2.0, 3.0, 4.0, 5.0, 6.0]
f(x): [4.0, 9.0, 16.0, 25.0, 36.0]
odd iteration: 136.0
event iteration: 32.0
integral solution: 69.33333333333333
41
Bagian 4 Tugas
K Bagian 4 Tugas k
1. Diberikan suatu fungsi f (x) = x3
(a) plot data fungsi tersebut!
(b) carilah luas di bawah kurva untuk rentang a = 4, dan b = 12, secara analitik!
(c) gunakan aturan persegi panjang untuk mencari luas di bawah kurva pada rentang a = 4,
dan b = 12, cari jumlah n yang optimal (perbedaan dengan nilai analitik sangat kecil)!
(d) gunakan aturan trapesium untuk mencari luas di bawah kurva pada rentang a = 4, dan b =
12, bandingkan perbedaannya dengan metode analitik, dan cari jumlah n yang optimal!
(e) gunakan aturan Simpson untuk n = 6, mencari luas di bawah kurva pada rentang a = 4,
dan b = 12, bandingkan perbedaannya dengan metode analitik!
2. Diberikan suatu data kecepatan sesaat suatu mobil setiap 5 menit (lihat tabel 4.1)
(a) plot data tabel 4.1 dengan sumbu x adalah waktu, dan sumbu y adalah kecepatan!
(b) gunakan metode persegi panjang, trapesium, dan aturan Simpson untuk mencari perpin-
dahan mobil tersebut dalam waktu 30 menit pertama!
(c) berapakah kecepatan rata-rata dari mobil tersebut selama 30 menit?
42
Bagian 5 Diferensiasi Numerik
Derivatif (diferensial) dari suatu fungsi matematika f (x), ketika diplot ke dalam grafik adalah
suatu kemiringan (slope, gradient) dari kurva fungsi pada titik tertentu. Kemiringan tersebut meru-
pakan garis tangent dari kurva pada titik yang ditentukan. Ilustrasinya dapat dilihat pada gambar 5.1,
dimana nilai dari kemiringan f ′ (5) untuk f (x) = x2 secara analitik adalah 10.
Source Code 5.1: Kode grafik derivatif f ′ (5) pada fungsi f (x) = x2
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1,7,100)
y = f(x)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y, label='$f(x) = x^{2}$')
43
5.1. METODE BEDA HINGGA - SELISIH MAJU
plt.plot(5,f(5), 'ro')
plt.axline((5, f(5)), slope=(2*(5)), linewidth=1, color='r', label='$f\'(5)$')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('differentiation.png')
plt.show()
Metode beda hingga (finite difference), terbagi menjadi tiga metode (lihat gambar 5.2) , yaitu:
selisih maju (forward-difference)
selisih mundur (backward-difference)
selisih tengah (central-difference)
Gambar 5.2: Metode beda hingga (diadaptasi dari Kakitc-Own work, CC BY-SA 4.0)
44
5.1. METODE BEDA HINGGA - SELISIH MAJU
kecil nilai h, maka nilai eror dengan nilai sebenarnya akan semakin kecil pula. Contoh ilustrasi metode
selisih maju dapat dilihat pada gambar 5.3
Gambar 5.3: Metode beda hingga selisih maju untuk f (x) = x2 , dengan h = 0.5
Source Code 5.2: Kode grafik selisih maju fungsi f (x) = x2 untuk h = 0.5
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1,7,100)
y = f(x)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y, label='$f(x) = x^{2}$')
plt.plot(5,f(5), 'ro')
plt.plot(5.5,f(5.5), 'go')
45
5.1. METODE BEDA HINGGA - SELISIH MAJU
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('forward_difference.png')
plt.show()
Untuk menghitung derivatif dari suatu fungsi dengan menggunakan metode beda hingga selisih
maju, dari deret Taylor berikut:
f ′ (x0 ) f (2) (x0 ) 2
f (x0 + h) = f (x0 ) + h+ h + ··· (5.1)
1! 2!
maka nilai turunan pertama dapat diperoleh:
f (x + h) − f (x)
f ′ (x) ≈ . (5.2)
h
Untuk derivatif dari fungsi f (x) = x2 , dengan menggunakan perhitungan analitik:
f ′ (x) = 2x
(5.3)
f ′ (5) = 2(5) = 10
Sedangkan dengan menggunakan metode selisih maju untuk h = 0.5 maka:
f (5.5) − f (5)
f ′ (5) =
0.5
(5.5) − (5)2
2
(5.4)
=
0.5
= 10.5
Perbedaan dengan nilai sebenarnya atau eror sebesar 0.5, eror ini proporsional terhadap besar atau
kecilnya nilai h. Semakin kecil nilai h maka hasil yang diperoleh menjadi lebih akurat, dengan kon-
sekuensi waktu yang diperlukan menjadi lebih lama, oleh karena itu diperlukan nilai h yang pas, se-
hingga dapat memperoleh data sesuai dengan akurasi yang diinginkan, dan ongkos waktu yang tidak
terlalu besar.
Dengan menggunakan pemrograman Python, untuk mensimulasikan hasil dari metode selisih
maju, dengan nilai sebenarnya dapat dilihat pada gambar 5.4 dan kode berikut:
Source Code 5.3: Kode perbandingan selisih maju dengan nilai sebenarnya pada f (x) = x2
import numpy as np
import matplotlib.pyplot as plt
46
5.2. METODE BEDA HINGGA - SELISIH MUNDUR
y = f(x)
# step size
h = 0.5
# forward difference
y_forward = (f(x+h) - f(x))/h
y_exact = 2*x
# compute max error between forward difference and exact solution
max_error = max(abs(y_exact - y_forward))
print('Max error:', max_error)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y_forward, label='forward-difference approximation', linestyle='--')
plt.plot(x,y_exact, label='exact solution', linestyle='-')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('forward_difference_comparison.png')
plt.show()
...
Max error: 0.5000000000000089
Gambar 5.4: Perbandingan metode selisih maju dengan nilai sebenarnya untuk f (x) = x2
47
5.2. METODE BEDA HINGGA - SELISIH MUNDUR
Gambar 5.5: Metode beda hingga selisih mundur untuk f (x) = x2 , dengan h = 0.5
Source Code 5.4: Kode grafik selisih mundur fungsi f (x) = x2 untuk h = 0.5
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1,7,100)
y = f(x)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y, label='$f(x) = x^{2}$')
plt.plot(5,f(5), 'ro')
plt.plot(4.5,f(4.5), 'go')
48
5.2. METODE BEDA HINGGA - SELISIH MUNDUR
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('backward_difference.png')
plt.show()
Untuk menghitung derivatif dari suatu fungsi dengan menggunakan metode beda hingga selisih
mundur, adalah sebagai berikut:
f (x) − f (x − h)
f ′ (x) ≈ . (5.5)
h
Untuk derivatif dari fungsi f (x) = x2 , dengan menggunakan metode selisih mundur untuk h = 0.5
adalah:
f (5) − f (4.5)
f ′ (5) =
0.5
(5)2 − (4.5)2 (5.6)
=
0.5
= 9.5
dengan perbedaan sebesar 0.5 dari nilai sebenarnya.
Menggunakan pemrograman Python untuk mensimulasikan hasil dari metode selisih mundur,
terhadap nilai sebenarnya dapat dilihat pada gambar 5.4 dan kode berikut:
Source Code 5.5: Kode perbandingan selisih mundur dengan nilai sebenarnya pada f (x) = x2
import numpy as np
import matplotlib.pyplot as plt
# step size
h = 0.5
# backward difference
49
5.3. METODE BEDA HINGGA - SELISIH TENGAH
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y_backward, label='backward-difference approximation', linestyle='--')
plt.plot(x,y_exact, label='exact solution', linestyle='-')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('backward_difference_comparison.png')
plt.show()
...
Max error: 0.5000000000000071
Gambar 5.6: Perbandingan metode selisih mundur dengan nilai sebenarnya untuk f (x) = x2
50
5.3. METODE BEDA HINGGA - SELISIH TENGAH
Gambar 5.7: Metode beda hingga selisih tengah untuk f (x) = x2 , dengan h = 0.5
derivatif dari suatu fungsi dengan menggunakan metode beda hingga selisih tengah, adalah sebagai
berikut:
f (x + h) − f (x − h)
f ′ (x) ≈ . (5.7)
2h
Untuk derivatif dari fungsi f (x) = x2 , dengan menggunakan metode selisih tengah untuk h = 0.5
adalah:
f (5.5) − f (4.5)
f ′ (5) =
0.5
(5.5)2 − (4.5)2 (5.8)
=
1
= 10
hasilnya tidak ada perbedaan dari nilai sebenarnya.
Menggunakan pemrograman Python untuk mensimulasikan hasil dari metode selisih tengah, ter-
hadap nilai sebenarnya dapat dilihat pada gambar 5.8:
51
5.3. METODE BEDA HINGGA - SELISIH TENGAH
Gambar 5.8: Perbandingan metode selisih tengah dengan nilai sebenarnya untuk f (x) = x2
Source Code 5.6: Kode perbandingan selisih tengah dengan nilai sebenarnya pada f (x) = x2
import numpy as np
import matplotlib.pyplot as plt
# step size
h = 0.5
# central difference
y_central= (f(x+h) - f(x-h))/(2*h)
y_exact = 2*x
# compute max error between central difference and exact solution
max_error = max(abs(y_exact - y_central))
print('Max error:', max_error)
plt.figure(figsize=(6,4), dpi=100)
plt.plot(x,y_central, label='central-difference approximation', linestyle='--')
52
Bagian 5 Tugas
K Bagian 5 Tugas k
1. Posisi suatu partikel pada sumbu x, dengan fungsi terhadap waktu diberikan sebagai berikut:
x = 4 − 27t + t3
dimana x dalam meter, dan t dalam sekon.
(a) plotlah fungsi tersebut untuk dalam rentang 0 hingga 10 detik!
(b) carilah kecepatan sesaat dari partikel tersebut dalam rentang 0 hingga 10 detik menggu-
nakan metode analitik!
(c) dari poin (b), plotlah grafik kecepatan terhadap waktu dalam rentang 0 hingga 10 detik,
dimana variabel bebas adalah waktu, dan variabel terikat adalah kecepatan!
(d) gunakan metode beda hingga selisih maju, selisih mundur, dan selisih tengah untuk men-
cari kecepatan dari partikel, pada rentang 0 hingga 10 detik (nilai h dapat ditentukan
sendiri)!
(e) dari poin (d), plotlah grafik kecepatan terhadap waktu, untuk masing-masing metode beda
hingga, dan bandingkan dengan hasil dari analitik untuk rentang 0 sampai 10 detik!
2. dari poin 1. nilai percepatan partikel tersebut dapat dicari, yaitu dari turunan orde kedua fungsi
posisi terhadap waktu x′′ (t). Turunan orde kedua dengan menggunakan metode selisih tengah
adalah sebagai berikut:
f (x + h) − 2f (x) + f (x − h)
f ′′ (x) ≈ .
h2
(a) gunakan metode analitik untuk mencari turunan kedua dari fungsi posisi pada persamaan
posisi 1.!
(b) plotlah fungsi percepatan terhadap waktu tersebut, dalam rentang 0 hingga 10 detik!
(c) gunakan metode beda hingga selisih tengah order kedua untuk mencari percepatan dari
partikel, pada rentang 0 hingga 10 detik (nilai h dapat ditentukan sendiri)!
(d) dari poin (c), plotlah grafik percepatan terhadap waktu, untuk metode beda hingga selisih
tengah, dan bandingkan dengan hasil dari analitik untuk rentang 0 sampai 10 detik!
53
Daftar Pustaka
[1] Kaw Autar. Introduction to Matrix Algebra. University of South Florida, 2022.
[2] Qingkai Kong, Timmy Siauw, and Alexandre Bayen. PYTHON PROGRAMMING AND NU-
MERICAL METHODS. Elsevier, 2020. ISBN: 9780128195505.
[3] Mohammad Rosidi. Metode Numerik Menggunakan R Untuk Teknik Lingkungan. PIKTOCHART,
2019.
54
Lampiran A Link Google Collab
Gunakan akun UNSRAT untuk dapat mengakses notebook berikut:
Sistem Persamaan Linear
Interpolasi dan Ekstrapolasi
Integrasi Numerik
Diferensiasi Numerik
55