Anda di halaman 1dari 63

Universitas Sam Ratulangi

Fakultas Matematika dan Ilmu Pengetahuan Alam


Program Studi Fisika

AFRIONI ROMA RIO, S.Si., M.Sc. GUNTUR PASAU, S.Si., M.Si.

PYTHON & KOMPUTASI FISIKA


Modul Mata Kuliah Komputasi Fisika

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

UNIVERSITAS SAM RATULANGI


Sekapur Sirih

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 Isi iii

Daftar Gambar iv

Daftar Tabel v

Daftar Kode Program vi

Bagian 1 Pendahuluan dan Instalasi 1


1.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Integrated Development Environment (IDE) . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Bagian 2 Sistem Persamaan Linear 7


2.1 Metode Eliminasi Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Metode Eliminasi Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Metode Gauss-Seidel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Bagian 2 Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Bagian 3 Interpolasi dan Ekstrapolasi 18


3.1 Interpolasi Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2 Ektrapolasi Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 Interpolasi Polinomial Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4 Interpolasi Polinomial Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.5 Curve Fitting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Bagian 3 Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Bagian 4 Integrasi Numerik 34


4.1 Aturan Persegi Panjang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2 Aturan Trapesium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3 Aturan Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Bagian 4 Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Bagian 5 Diferensiasi Numerik 43


5.1 Metode Beda Hingga - Selisih Maju . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Metode Beda Hingga - Selisih Mundur . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3 Metode Beda Hingga - Selisih Tengah . . . . . . . . . . . . . . . . . . . . . . . . . 51

ii
DAFTAR ISI

Bagian 5 Tugas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Daftar Pustaka 54

Lampiran A Link Google Collab 55

iii
Daftar Gambar

1.1 Contoh instalasi Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


1.2 Contoh visualisasi menggunakan Python . . . . . . . . . . . . . . . . . . . . . . . 6

3.1 Interpolasi dan Ektrapolasi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18


3.2 Output interpolasi linear x = 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Output ekstrapolasi linear x = 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4 Sebaran data dari contoh kasus 3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.5 Penyelesaian contoh kasus 3.3 polinomial Lagrange . . . . . . . . . . . . . . . . . . 25
3.6 Penyelesaian contoh kasus 3.4 polinomial Newton . . . . . . . . . . . . . . . . . . . 29
3.7 Grafik massa (kg) versus gaya berat (N) . . . . . . . . . . . . . . . . . . . . . . . . 30
3.8 Grafik massa (kg) versus gaya berat (N) dengan metode regresi linear . . . . . . . . . 32

4.1 Luas di bawah kurva dengan batas a dan b . . . . . . . . . . . . . . . . . . . . . . . 34


4.2 Luas di bawah kurva f (x) = x2 dengan a = 2 dan b = 6 . . . . . . . . . . . . . . . 35
4.3 Aturan persegi panjang untuk n = 4 pada kurva f (x) = x2 dengan a = 2 dan b = 6 . 36
4.4 Aturan trapesium untuk n = 4 pada kurva f (x) = x2 dengan a = 2 dan b = 6 . . . . 38

5.1 Derivatif dari f (x) = x2 pada x = 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 43


5.2 Metode beda hingga (diadaptasi dari Kakitc-Own work, CC BY-SA 4.0) . . . . . . . 44
5.3 Metode beda hingga selisih maju untuk f (x) = x2 , dengan h = 0.5 . . . . . . . . . . 45
5.4 Perbandingan metode selisih maju dengan nilai sebenarnya untuk f (x) = x2 . . . . . 47
5.5 Metode beda hingga selisih mundur untuk f (x) = x2 , dengan h = 0.5 . . . . . . . . 48
5.6 Perbandingan metode selisih mundur dengan nilai sebenarnya untuk f (x) = x2 . . . 50
5.7 Metode beda hingga selisih tengah untuk f (x) = x2 , dengan h = 0.5 . . . . . . . . . 51
5.8 Perbandingan metode selisih tengah dengan nilai sebenarnya untuk f (x) = x2 . . . . 52

iv
Daftar Tabel

1.1 Operasi Matematika pada Python . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

3.1 Interpolasi polinomial Newton ai . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27


3.2 Data parameter kisi vs energi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.1 Data kecepatan sesaat sebuah mobil . . . . . . . . . . . . . . . . . . . . . . . . . . 42

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

h Sistem Persamaan Linear h Integrasi Numerik


h Interpolasi dan Ekstrapolasi h Diferensiasi Numerik

1.1 Python

1.1.1 Instalasi

Gambar 1.1: Contoh instalasi Python

1
1.1. PYTHON

Untuk proses instalasi dapat mengunjungi https://www.Python.org/downloads/. Pilihlah versi


Python yang stabil (penulis menyarankan versi 3.8), kemudian unduh dan instal seperti gambar 1.1,
pastikan pilihan ”Add Python 3.- to PATH” dicentang. Jika sudah selesai proses instalasi, cobalah
masuk ke terminal (cmd) dan panggillah program Python seperti kode di bawah ini
C:\Users\user>python
>>> print("Hello World!")
Hello World!

Source Code 1.1: Print Hello World

1.1.2 Kalkulasi Menggunakan Python


Dalam Python, pengguna dapat menetapkan suatu variabel dengan menggunakan sintaks ”=”,
yang nantinya variabel ini dapat digunakan untuk keperluan berikutnya. Variabel ini dapat berubah
jika pada iterasi selanjutnya, variabel tersebut ditetapkan dengan nilai yang lain. Contohnya dapat
dilihat di kode 1.2, dimana variabel kecepatan v dari m/s, kemudian variabel tersebut diganti dengan
definisi yang baru yaitu km/jam. Sedangkan untuk contoh operasi matematika dengan sintaks-nya
dapat dilihat pada tabel 1.1

Tabel 1.1: Operasi Matematika pada Python


Operasi Sintaksis Contoh Hasil
Penjumlahan + 3+3 6
Pengurangan - 3-1 2
Perkalian * 3*3 9
Pembagian / 3/3 1
Pangkat ** 3**3 27
Lebih besar dari > 3>1 True
Lebih kecil dari < 3<1 False
Lebih besar sama dengan < 3 >= 3 True
Lebih kecil sama dengan < 3 <= 1 False
Sama dengan == 3 == 3 True
Tidak sama dengan != 3!=3 False
Logika dan and True and False False
Logika atau or True or False True
logika negasi not not True or not False False

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

Source Code 1.2: Contoh penetapan variabel

1.1.3 Pemrograman dan Fungsi


Buku ini akan sedikit mengulas tentang dasar-dasar pemrograman, seperti bagaimana caranya
melakukan pekerjaan yang berulang-ulang secara otomatis dengan suatu kondisi. Dalam bahasa pem-
rograman ini disebut sebagai loop dan condition. Untuk loop ada dua kategori yaitu for loops dan
while loops. Contoh aplikasinya dapat dilihat pada kode 1.3
[1]
# contoh for loops
time = [1,2,3]
for i in time:
print('time:',i, 'second')
...
time: 1 second
time: 2 second
time: 3 second
[2]
# contoh while loops
num = 0
while num < 5: #kondisi awal agar loop berhenti
num = num + 1
if num == 4: # kondisi untuk memutus loop
break # loop diputus secara paksa
print("num =", num)
...
num = 1
num = 2
num = 3

Source Code 1.3: Contoh for loops dan while loops

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

Source Code 1.4: Contoh function

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.

1.2 Integrated Development Environment (IDE)


IDE atau Integrated Development Environment adalah media yang memungkinkan program dapat
berjalan pada suatu komputer. Ada beberapa IDE yang biasa digunakan untuk Python seperti Pycharm,
Atom, Jupyter. Namun pada buku ini penulis menyarankan untuk menggunakan IDE visual studio
code, hal ini karena visual studio code memiliki banyak plugin yang dapat membantu memudahkan
dalam pemrograman, dan juga dapat terkoneksi ke https://github.com/ sebagai version controlling.
Adapun IDE yang sangat berguna dalam proses testing suatu program, adalah jupyter notebook
dengan format file .ipynb, IDE ini dapat menjalankan suatu program secara per-blok, dan jika ada
error, user dapat mengetahuinya dengan lebih mudah. Adapun aplikasi sejenis yang dikembangkan
oleh google dan dapat digunakan secara web base adalah Google Collab.

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

1.3.1 NumPy dan Matplotlib


NumPy (Numeric Python) adalah salah satu package yang sangat berguna di Python. Adapun
kegunaannya adalah dapat mengkalkulasi objek berbentuk array multi dimensi dengan cepat. Selain
itu juga NumPy berguna untuk mengkalkulasi aljabra linear dasar, maupun operasi statistika dasar.
Sedangkan Matplotlib berguna untuk visualisasi data, seperti grafik, simulasi, animasi, dll. Untuk
contoh penggunaaan dari kedua packages ini dapat dilihat pada kode 1.5. Dimana kode tersebut men-
simulasikan gerak jatuh bebas distance = 21 gt2 . Hasil dari visualisasi menggunakan Matplotlib dapat
dilihat pada gambar 1.2.
[1]
import numpy as np
import matplotlib.pyplot as plt

# contoh gerak jatuh bebas


time = np.arange(0., 10., 0.2) #s
g = 9.8 # m/s^2
velocity = g * time # m/s
distance = 0.5 * g * np.power(time, 2) #m

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

Source Code 1.5: Contoh penggunaan packages NumPy dan Matplotlib

5
1.3. PACKAGES

Gambar 1.2: Contoh visualisasi menggunakan Python

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.

2.1 Metode Eliminasi Gauss


Definisi 2.1 (Metode Eliminasi Gauss)
Metode yang dapat menyelesaikan sistem persamaan linear dengan merubah sistem tersebut
ke dalam bentuk matriks yang diperbesar (augmented matrix), kemudian dengan mereduksi
baris-baris dari matriks, hingga nilai semua elemen matriks yang ada di bawah diagonal utama
menjadi nol, maka solusi dari sistem persamaan linear dapat diperoleh. ♣

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

Source Code 2.1: Kode metode eliminasi Gauss

Kode 2.1 juga dapat diakses di Google Colab - System Of Linear Equation, dengan menggunakan
akun UNSRAT.

9
2.2. METODE ELIMINASI GAUSS-JORDAN

2.2 Metode Eliminasi Gauss-Jordan


Definisi 2.2 (Metode Eliminasi Gauss-Jordan)
Metode yang sama dengan metode eliminasi Gauss biasa, yang membedakan adalah, semua ele-
men di bawah dan di atas diagonal utama menjadi nol, sedangkan semua elemen pada diagonal
utama menjadi satu, sehingga solusi dari sistem persamaan linear langsung dapat diperoleh. ♣

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

#Elemen di bawah diagonal utama


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]
print(a)
print('*'*20)

#Elemen di atas diagonal utama


for i in reversed(range(n)):
if a[j][j] == 0.0:
raise Exception('Pembagi 0 terdeteksi')
break
for j in reversed(range(i+1, n)):
c = a[i][j]/a[j][j]
for k in range(n+1):
a[i][k] = a[i][k] - c * a[j][k]
print(a)
print('*'*20)

for i in range(n):
x[i] = a[i][n]/a[i][i]

print('Solusi dari sistem persamaan linear:')


print(x)
...
[[ 1. 3. -2. 5.]
[ 3. 5. 6. 7.]
[ 2. 4. 3. 8.]]
********************
Mulai iterasi eliminasi Gauss-Jordan
[[ 1. 3. -2. 5.]
[ 0. -4. 12. -8.]
[ 2. 4. 3. 8.]]
********************

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

Source Code 2.2: Kode metode eliminasi Gauss-Jordan

2.3 Metode Gauss-Seidel


Definisi 2.3 (Metode Gauss-Seidel)
Metode iterasi yang dapat menyelesaikan sistem persamaan linear, dapat mencapai konvergensi
jika kondisi strictly diagonally dominant terpenuhi. ♣

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

dengan memberikan x(0) awal,  


0
 
x(0) = 0 (2.30)
0

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

iterasi ke empat x(4) ,


       
0 −0.25 −0.5 0.52 1 0.504
       
x(4) = 0 0.15 0.1  × 0.992 + 0.8 = 0.9984 (2.34)
0 0.0333 0.1333 0.496 0.4 0.4992
hingga mencapai konvergensi pada iterasi ke 12 dengan nilai x(12) dan toleransi error sebesar 10−8 ,
       
0 −0.25 −0.5 0.50000005 1 0.50000001
       
x(12) = 0 0.15 0.1  × 0.99999998 + 0.8 ==  1  (2.35)
0 0.0333 0.1333 0.49999999 0.4 0.5
sehingga solusinya diperoleh ( 21 , 1, 12 ).
Penyelesaian sistem persamaan linear dengan menggunakan metode Gauss-Seidel matriks, dalam
pemrograman Python dapat dilihat pada:
import numpy as np

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)

# Check diagonally dominant


D = np.diag(np.abs(A)) # Find diagonal coefficients
S = np.sum(np.abs(A), axis=1) - D # Find row sum without diagonal

if np.all(D >= S):


print('Matrix is diagonally dominant')
x = np.zeros_like(b) #initial guess start from 0

for i in range(0, limit):


x_i = np.zeros_like(x)
print(f"Iteration {i}: {x}")
L = np.tril(A, k=0) #sum of lower triangular component
U = np.triu(A, k =1) #strict upper triangular component
L_inverse = np.linalg.inv(L)

T = np.dot(-L_inverse, U)
C = np.dot(L_inverse, b)
x_i = np.add( np.dot(T,x), C)

if np.allclose(x, x_i, rtol=1e-8): #break condition

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]

Source Code 2.3: Kode metode Gauss-Seidel matriks

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

Definisi 3.1 (Interpolasi/Ekstrapolasi)


Interpolasi adalah salah satu metode untuk mengestimasi data, digunakan pada rentang data
yang diketahui. Sedangkan ekstrapolasi mengestimasi data di luar dari rentang data yang dike-
tahui. ♣

Contoh dari interpolasi dan ekstrapolasi dapat dilihat pada gambar 3.1. Beberapa metode yang

Gambar 3.1: Interpolasi dan Ektrapolasi

digunakan pada buku ini adalah adalah interpolasi/ekstrapolasi linear, interpolasi/ekstrapolasi polino-
mial. Dengan tambahan metode fitting kurva menggunakan Python.

3.1 Interpolasi Linear


Definisi 3.2 (Interpolasi Linear)
Interpolasi linear adalah metode yang menghubungkan titik-titik data dengan garis lurus dalam
rentang data yang diketahui. ♣

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

dari persamaan diatas dapat diturunkan nilai y:


( ) ( )
x1 − x x − x0
y = y0 + y1 (3.2)
x1 − x0 x1 − x0
Contoh Kasus 3.1 (Interpolasi Linear)
Carilah nilai y untuk x = 2 dari dua titik (0,1) dan (3,4) dengan menggunakan 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:

Gambar 3.2: Output interpolasi linear x = 2

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)

Source Code 3.1: Kode interpolasi linear

3.2 Ektrapolasi Linear


Definisi 3.3 (Ekstrapolasi Linear)
Ekstrapolasi linear adalah metode yang menghubungkan titik-titik data dengan garis lurus di
luar dari rentang data yang diberikan. ♣

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)

Source Code 3.2: Kode ekstrapolasi linear

dengan hasil output-nya digambarkan sebagai berikut:

Gambar 3.3: Output ekstrapolasi linear x = 3

3.3 Interpolasi Polinomial Lagrange


Adakalanya suatu data tidak bisa dianggap sebagai fungsi linear, dan tidak bisa hanya dengan
menghubungkan garis lurus pada setiap titik data. Untuk memprediksi nilai-nilai diluar data penga-
matan (interpolasi/ekstrapolasi) pada data-data yang bukan linear, salah satu metodenya yaitu den-
gan menggunakan metode interpolasi polinomial. Polinomial adalah suatu ekspresi matematika yang
terdiri dari variabel dan koefisien. Polinomial hanya terdiri dari operasi matematika penjumlahan,
pengurangan, perkalian, dan variabel eksponen integer positif. Contoh dari polinomial adalah:
y = x2 − 2x + 5

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:

Gambar 3.4: Sebaran data dari contoh kasus 3.3

Kode program Python untuk memproduksi gambar 3.4 adalah:

22
3.3. INTERPOLASI POLINOMIAL LAGRANGE

import matplotlib.pyplot as plt

x = [0, 1, 2, 4]
y = [1, 3, 2, 5]

fig = plt.figure(figsize = (6,4), dpi=100)


plt.plot(x, y, 'ko', label = 'data')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim([-1, 5])
plt.ylim([0, 6])
plt.grid()
plt.savefig('lagrange_polynomial_basis_data.png')
plt.show()

Source Code 3.3: Kode Python pada gambar 3.4

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

Dengan menggunakan kode pemrograman Python dapat ditulis sebagai berikut:


import numpy as np
import matplotlib.pyplot as plt

# 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

def lagrange_polynomial (x, y, x_l):


"""
x = data x (array or list)
y = data y (array or list)
x_l = data x you want to predict the y point
"""
# degree of polynomial
n = len(x) - 1
# set the Lagrange basis
lagrange_basis = []
for i in range(n+1): # note that range iterate until number-1
l_basis = 1
for j in range(n+1):
if j != i:
l_basis = l_basis * ((x_l - x[j])/(x[i] - x[j]))
lagrange_basis.append(l_basis)

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

print(f'For x = {x_l}, then y = {y_lagrange}')

# fitting the data and plot the graph


xplt = np.linspace(x[0], x[-1])
yplt = np.array([], float)

for xp in xplt:
yp = lagrange_polynomial(x, y, xp)
yplt = np.append(yplt,yp)

fig = plt.figure(figsize = (6,4), dpi=100)


plt.plot(x, y, 'ko', label = 'data')
plt.plot(xplt, yplt, 'g--', label = '$L(x) = \ell_{0}y_{0} + \ell_{1}y_{1} + \ell_
{2}y_{2} + \ell_{3}y_{3}$')
plt.plot(x_l, y_lagrange, 'ro', label = '$L(x=3)$')

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

Source Code 3.4: Kode Python interpolasi polinomial Lagrange untuk x = 3

Dan output dari kode program 3.4 dapat dilihat pada gambar 3.5.

Gambar 3.5: Penyelesaian contoh kasus 3.3 polinomial Lagrange

3.4 Interpolasi Polinomial Newton


Metode interpolasi polinomial alternatif dari metode Lagrange adalah metode interpolasi polino-
mial Newton atau disebut juga sebagai Newton’s divided differences interpolation polynomial. Definisi
polinomial Newton untuk total data k + 1 diberikan sebagai berikut:
∑ k
N (x) = ai ni (x). (3.10)
i=0

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

f (x2 )−f (x1 )


x2 −x1
..
x2 f (x2 ) . (3.12)
..
.
... ..
.
..
.
xn f (xn )
dengan nilai ai adalah baris pertama dari tabel diatas, yaitu:
a0 = f (x0 )
f (x1 ) − f (x0 )
a1 =
x1 − x0
(3.13)
f (x2 )−f (x1 )
x2 −x1
− f (xx11)−f
−x0
(x0 )
a2 =
x2 − x0
an = · · ·
Contoh Kasus 3.4 (Interpolasi Polinomial Newton)
Carilah nilai y(x = 3) untuk data x = [0, 1, 2, 4], dan y = [1, 3, 2, 5] dengan menggunakan
metode interpolasi polinomial Newton! ♡

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

Tabel 3.1: Interpolasi polinomial Newton ai


n x f (x) a1 a2 a3
(3−1) (−1−2) −3 ( 56 − −3
2 )
) 7
0 0 1 (1−0) =2 (2−0) = 2 (4−0) = 12

(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

Newton basis untuk x = 3 adalah:


n0 (3) = 1
n1 (3) = (x − x0 ) = (3 − 0) = 3
(3.14)
n2 (3) = (x − x0 )(x − x1 ) = (3 − 0)(3 − 1) = 6
n3 (3) = (x − x0 )(x − x1 )(x − x2 ) = (3 − 0)(3 − 1)(3 − 2) = 6
sehingga penyelesaian polinomial Newton-nya menjadi:
N (x) = a0 n0 (x) + a1 n1 (x) + a2 n2 (x) + a3 n3 (x)
( ) ( )
3 7
N (x = 3) = (1)(1) + (2)(3) − (6) − (6)
2 12 (3.15)
N (x = 3) = 1 + 6 − 9 + 3.5
N (x = 3) = 1.5
Nilai estimasi dengan menggunakan interpolasi polinomial Newton pada x = 3 untuk contoh kasus
3.4, mempunyai nilai yang sama persis dengan metode Lagrange yaitu y = 1.5. Adapun contoh
pemrograman menggunakan Python adalah:
import numpy as np
import matplotlib.pyplot as plt

# raw data
x = np.array([0, 1, 2, 4], float)
y = np.array([1, 3, 2, 5], float)
x_newt = 3.0

def newton_polynomial(x, y, x_newt):


"""
Function to obtain 'y' estimate using newton polynomial
interpolation.
x = data x (array or list)
y = data y (array or list)
x_newt = data x you want to predict the y point
"""
# degree of polynomial

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

a = coeff[0] # return only first row of the matrix


a_i = np.copy(a)
# solve the Newton polynomial
for i in range(1,m): #skip index 0
a[i] = (a[i]*newton_basis[i-1])

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}')

# fitting the data and plot the graph


xplt = np.linspace(x[0], x[-1])
yplt = np.array([], float)

for xp in xplt:
yp = newton_polynomial(x, y, xp)[0]
yplt = np.append(yplt,yp)

fig = plt.figure(figsize = (6,4), dpi=100)

28
3.4. INTERPOLASI POLINOMIAL NEWTON

plt.plot(x, y, 'ko', label = 'data')


plt.plot(xplt, yplt, 'b--', label = '$N(x) = a_{0}+a_{1}n_{1}+a_{2}n_{2}+a_{3}n_{3}$
')
plt.plot(x_newt, y_newton, 'ro', label = '$N(x=3)$')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim([-1, 5])
plt.ylim([0, 6])
plt.legend()
plt.grid()
plt.savefig('newton_polynomial_predict.png')
plt.show()
...
a_i: [ 1. 2. -1.5 0.58333333]
Newton basis (n): [3.0, 6.0, 6.0]
For x = 3.0, using Newton polynomial then y = 1.5

Source Code 3.5: Kode Python interpolasi polinomial Newton untuk x = 3

dalam bentuk grafik, dengan menggunakan kode 3.5 diperoleh:

Gambar 3.6: Penyelesaian contoh kasus 3.4 polinomial Newton

29
3.5. CURVE FITTING

3.5 Curve Fitting


Definisi 3.4 (Curve Fitting)
Metode curve fitting atau pencocokan kurva, adalah suatu proses pembentukan kurva atau
fungsi matematika yang memiliki kecocokan terbaik terhadap titik data yang dimiliki. ♣

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! ♡

Dari contoh kasus 3.5 ketika diplot ke dalam grafik diperoleh:

Gambar 3.7: Grafik massa (kg) versus gaya berat (N)

30
3.5. CURVE FITTING

Untuk memproduksi grafik dari gambar 3.7 menggunakan Python:


import matplotlib.pyplot as plt
import numpy as np

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)

fig = plt.figure(figsize = (6,4), dpi=100)


plt.plot(m, w, 'ko', label = 'data')
plt.xlabel('mass (m)')
plt.ylabel('weight (N)')
plt.savefig('mass_weight_graph.png')
plt.grid()

Source Code 3.6: Kode Python untuk grafik gambar 3.7

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

popt, pcov = curve_fit(func, m, w) #optimum parameter


perr = np.sqrt(np.diag(pcov)) #standard deviation of errors on the parameters

print('gravity:',round(popt[0],2), 'm/s^2')
print('error:',round(perr[0],2), 'm/s^2')

fig = plt.figure(figsize = (6,4), dpi=100)


plt.plot(m, w, 'ko', label = 'data')
plt.plot(m, func(m, *popt), 'g--',label=f'fit: s={round(popt[0],2)}, c={round(popt
[1],2)}')
plt.legend()
plt.xlabel('mass (m)')

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

dan hasil outputnya adalah sebagai berikut:

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:

Tabel 3.2: Data parameter kisi vs energi


a(Å) Energi (Hartree)
2.84 -287.2362067
2.89 -287.2454978
2.94 -287.2499925
2.99 -287.2503239
3.04 -287.2476089
3.10 -287.2422592
3.15 -287.2347922

(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

ketika digambarkan dalam bentuk grafik adalah sebagai berikut:

Gambar 4.1: Luas di bawah kurva dengan batas a dan b

Definisi 4.1 (Integrasi Numerik)


Integrasi numerik adalah metode komputasi yang digunakan untuk menyelesaikan permasala-
han integral tentu, yaitu untuk mendapatkan nilai luas di bawah kurva suatu fungsi f (x) dengan
batas-batas a dan b. ♣

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!

Dalam bentuk grafik digambarkan (lihat gambar 4.2):

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:

Source Code 4.1: Kode grafik fungsi f (x) = x2


import numpy as np
import matplotlib.pyplot as plt

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

4.1 Aturan Persegi Panjang


Aturan persegi panjang atau disebut juga sebagai mid point rule adalah salah satu metode untuk
mencari luas di bawah kurva dengan membagi luas tersebut dengan persegi panjang sebanyak n kali.

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:

Source Code 4.2: Kode integrasi numerik aturan persegi panjang


import numpy as np
import matplotlib.pyplot as plt

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

print(f'\nIntegral solution for n= {n} using rectangular rule:', round(


integral_solution,2))
...
Integral solution for n= 4 using rectangular rule: 69.0

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.

4.2 Aturan Trapesium

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:

Source Code 4.3: Kode integrasi numerik aturan trapesium


f = lambda x: x**2
a = 2
b = 6
n = 4
h = (b - a) / n

sum_init = f(a) + f(b) #initial summation

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

total_sum = sum_init + sum_n

integral_solution = (h/2) * total_sum


print(f'\nIntegral solution for n= {n} using trapezoidal rule:', round(
integral_solution,2))
...
Integral solution for n= 4 using trapezoidal rule: 70.0

4.3 Aturan Simpson


Aturan Simpson adalah salah satu metode untuk mengaproksimasi nilai integral tentu. Atu-
ran Simpson pertama atau disebut juga aturan simpson 1/3, diturunkan dari interpolasi polinomial
kuadratik, yang hasilnya diberikan sebagai berikut:
∫ b [ ∑
n−1 ∑
n−2 ]
h
f (x) dx ≈ f (a) + 4 f (xj ) + 2 f (xj ) + f (b) , (4.13)
a 3 j=1, j odd j=2, j even

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

untuk bagian ganjil (1, 3, · · · , n − 1), maka:


( 3 )

4 f (xj ) = 4 (f (3) + f (5)) = 4(32 + 52 ) = 136 , (4.15)
j=1, j odd

dan bagian genap (2, 4, · · · , n − 2):


( 2 )

2 f (xj ) = 2 (f (4)) = 2(42 ) = 32 , (4.16)
j=2, j even
sehingga penyelesaian aturan Simpson untuk n = 4 adalah:
∫ 6 [ ]
1 2
x dx ≈ 2 + 136 + 32 + 6
2 2
3
2
[ ]
1 (4.17)
= 208
3
= 69.33
Dengan nilai interval n = 4 sudah dapat menemukan nilai yang sesuai dengan hasil perhitungan
analitik, tanpa adanya perbedaan.
Catatan: Untuk aturan Simpson harus menggunakan interval genap (n = genap).

40
4.3. ATURAN SIMPSON

Dengan menggunakan pemrograman Python, aturan Simpson dapat ditulis:

Source Code 4.4: Kode integrasi numerik aturan Simpson


import numpy as np

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)

Tabel 4.1: Data kecepatan sesaat sebuah mobil


waktu (menit) kecepatan (m/s)
0 25
5 28
10 32
15 30
20 29
25 26
30 23

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

Gambar 5.1: Derivatif dari f (x) = x2 pada x = 5

Kode Python untuk membuat grafik pada gambar 5.1 adalah:

Source Code 5.1: Kode grafik derivatif f ′ (5) pada fungsi f (x) = x2
import numpy as np
import matplotlib.pyplot as plt

f = lambda x: x**2 # function

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

Definisi 5.1 (Diferensiasi Numerik)


Diferensiasi numerik adalah metode numerik untuk mengestimasi nilai dari derivatif suatu
fungsi matematika, misalnya adalah metode beda hingga (finite difference). ♣

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)

5.1 Metode Beda Hingga - Selisih Maju


Metode beda hingga selisih maju, adalah salah satu metode untuk menyelesaikan diferensial dari
suatu fungsi pada titik x, dengan menghubungkan garis antara titik f (x) dan titik f (x + h). Semakin

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

Kode Python untuk membuat grafik pada gambar 5.1 adalah:

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

f = lambda x: x**2 # function

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

plt.axline((5, f(5)), slope=(2*(5)), linewidth=1, color='r', label='$f\'(5)$')


plt.axline((5,f(5)),(5.5, f(5.5)), linewidth=1, color='g', label='forward-difference
')

45
5.1. METODE BEDA HINGGA - SELISIH MAJU

plt.axvline(5,0,1, linewidth=1, color='black',linestyle="--" )


plt.axvline(5.5,0,1, linewidth=1, color='black',linestyle="--" )
plt.text(5.20, 10, '$h$')
plt.text(5.55, 2.5, '$x+h$')
plt.text(4.8, 2.5, '$x$')

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

f = lambda x: x**2 # function


x = np.linspace(1,7,100)

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

dengan keluaran gambar adalah sebagai berikut:

Gambar 5.4: Perbandingan metode selisih maju dengan nilai sebenarnya untuk f (x) = x2

47
5.2. METODE BEDA HINGGA - SELISIH MUNDUR

5.2 Metode Beda Hingga - Selisih Mundur


Serupa dengan metode selisih maju, untuk selisih mundur, dalam menyelesaikan diferensial dari
suatu fungsi pada titik x, maka kebalikan dari selisih maju, yaitu dengan menghubungkan garis antara
titik f (x) dan titik f (x − h). Contoh ilustrasi metode selisih mundur dapat dilihat pada gambar 5.5

Gambar 5.5: Metode beda hingga selisih mundur untuk f (x) = x2 , dengan h = 0.5

Kode Python untuk membuat grafik pada gambar 5.5 adalah:

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

f = lambda x: x**2 # function

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.axline((5, f(5)), slope=(2*(5)), linewidth=1, color='r', label='$f\'(5)$')


plt.axline((5,f(5)),(4.5, f(4.5)), linewidth=1, color='g', label='backward-
difference')

plt.axvline(5,0,1, linewidth=1, color='black',linestyle="--" )


plt.axvline(4.5,0,1, linewidth=1, color='black',linestyle="--" )
plt.text(4.65, 10, '$h$')
plt.text(3.95, 2.5, '$x-h$')
plt.text(5.05, 2.5, '$x$')

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

f = lambda x: x**2 # function


x = np.linspace(1,7,100)
y = f(x)

# step size
h = 0.5

# backward difference

49
5.3. METODE BEDA HINGGA - SELISIH TENGAH

y_backward = (f(x) - f(x-h))/h


y_exact = 2*x
# compute max error between backward difference and exact solution
max_error = max(abs(y_exact - y_backward))
print('Max error:', max_error)

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

dengan keluaran gambar adalah sebagai berikut:

Gambar 5.6: Perbandingan metode selisih mundur dengan nilai sebenarnya untuk f (x) = x2

50
5.3. METODE BEDA HINGGA - SELISIH TENGAH

5.3 Metode Beda Hingga - Selisih Tengah


Metode beda hingga selisih tengah, dalam menyelesaikan diferensial dari suatu fungsi pada titik
x, yaitu dengan menghubungkan garis antara titik f (x − h) dan titik f (x + h). Metode ini lebih
akurat dibandingkan dengan 2 metode sebelumnya, dapat dilihat pada pada gambar 5.7, nilai dari
garis pada metode selisih tengah, lebih mendekati kemiringan sebenarnya (true slope) dibandingkan
dengan metode selisih maju, ataupun selisih mundur untuk nilai h yang sama. Untuk menghitung

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

Dengan kode Python berikut:

Source Code 5.6: Kode perbandingan selisih tengah dengan nilai sebenarnya pada f (x) = x2
import numpy as np
import matplotlib.pyplot as plt

f = lambda x: x**2 # function


x = np.linspace(1,7,100)
y = f(x)

# 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

plt.plot(x,y_exact, label='exact solution', linestyle='-')


plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.savefig('central_difference_comparison.png')
plt.show()
...
Max error: 5.329070518200751e-15

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

Anda mungkin juga menyukai