Regresi dan Interpolasi
Modul #3 Praktikum
AS2205 Astronomi Komputasi
Oleh
Dr. Muhamad Irfan Hakim
Program Studi Astronomi
Fakultas Matematika dan Ilmu Pengetahuan Alam
Institut Teknologi Bandung
Daftar Isi
Daftar Isi i 1 Pendahuluan 1 2 Praktikum 4 2.1 Interpolasi Newton . . . 4 2.2 Regresi. . . 5 iBab 1
Pendahuluan
Untuk pekerjaan komputasi regresi dan interpolasi kali ini, ada beberapa hal yang perlu kita perhatikan:
1. Pekerjaan pertama praktikum ini adalah interpolasi, pekerjaan kedua adalah regresi linear dan kuadratik.
2. Pada interpolasi Newton, proses perhitungan interpolasi terdiri atas dua algo-ritma
(a) algoritma perhitungan koefisien interpolan Newton m ← len(xData) # jumlah titik data
a ← yData.copy() # salin koordinat-y dari data for k in range(1, m):
for i in range(k, m):
a[i] ← (a[i] - a[k-1])/(xData[i] - xData[k-1]) atau
m ← len(xData) # jumlah titik data
a ← yData.copy() # salin koordinat-y dari data for k in range(1, m):
a[k:m] ← (a[k:m]-a[k-1])/(xData[k:m]-xData[k-1]) (b) algoritma perhitungan interpolan Newton
n ← len(xData) - 1 # derajat maksimum polinom p ← a[n] # nilai awal polinom
for k in range(1, n + 1):
p ← a[n - k] + (x - xData[n - k])*p
3. Untuk dapat memanfaatkan modul python secara maksimal, modul array dan arangedapat dimanfaatkan. Contoh:
from numpy import array,arange
cx = array([2., 3., 4.]) # deklarasi cx sebagai array
Bab 1. Pendahuluan
# arange = array range, mirip dengan pemanfaatan range # namun dapat menggunakan bilangan riil
for x in arange(0.0, 1.0+0.1, 0.1):
print(x) # cek!!
Ini dapat dimanfaatkan misalnya untuk tabulasi fungsi, atau plot data. 4. Pada interpolasi, variabel xData dan yData perlu dipasok sebagai input. Akan
dipilih input dengan cara baca file. Misalkan file “data.csv” (6 baris): 0.15 4.79867 2.30 4.49013 3.15 4.22430 4.85 3.47313 6.25 2.66674 7.95 1.51909
File ini dapat dibaca sebagai berikut (silakan coba): import numpy as np
fdata = open("data.csv", "r") # buka data.csv u/ dibaca m = input(’Number of data, m = ’) # jumlah baris di data.csv xData = np.zeros(m) # nilai awal nol u/ xData yData = np.zeros(m) # nilai awal nol u/ yData for j in range(0, m):
# data kolom-1 dimulai dari byte 0, dibaca 4 karakter # data kolom-2 dimulai dari byte 5, dibaca 7 karakter
# tiap baris ada 12 karakter (termasuk karakter ganti baris # (invisible character)). Maka, pembacaan berikutnya dimulai # dari byte 13 (dan seterusnya).
fdata.seek(0+13*j); x = fdata.read(4); xData[j] = x fdata.seek(5+13*j); y = fdata.read(7); yData[j] = y fdata.close() # jangan lupa tutup file
# print(xData) # u/ debug # print(yData) # u/ debug
5. Untuk regresi, diperlukan solusi SPL. Dengan melihat rujukan modul prakti-kum sebelumnya, solusi via algoritma milik numpy dapat dilihat dalam contoh di bawah ini:
# Solusi numerik SPL: # BA = C
Bab 1. Pendahuluan
# menggunakan algoritma SPL dari numpy import numpy as np
from numpy.linalg import * # matriks B untuk contoh B = np.array([
[ 2., 3., -1.], [ 4., 4., -3.], [-2., 3., -1.] ])
# matriks C untuk contoh C = np.array([5., 3., 1.])
A = np.linalg.solve(B, C) # solusi # print(A) # u/ debug
Bab 2
Praktikum
2.1
Interpolasi Newton
Lakukan langkah-langkah berikut:
1. Siapkan file “viscos0.csv” (7 baris) di bawah ini (dengan editor sederhana atau misalnya dengan spreadsheet Excel). Ini adalah relasi temperatur terhadap viskositas kinematik pada suatu fluida.
0.0 1.790 21.1 1.130 37.8 0.696 54.4 0.519 71.1 0.338 87.8 0.321 100.0 0.296
2. Untuk dapat melihat hasil yang lebih baik dalam grafik, plot data dan inter-polasi akan dilakukan. Keseluruhan modul-modul yang diperlukan dipanggil sebagai berikut:
import matplotlib.pyplot as plt import numpy as np
from numpy import array,arange
3. Secara ringkas, ada beberapa urutan blok pada program yang harus Anda kerjakan
(a) blok pemanggilan modul (lihat sebelumnya)
(b) blok buka file, baca data, simpan data, dan tutup file (pelajari contoh sebelumnya)
(c) blok perhitungan koefisien interpolan (d) blok penyiapan plot, contoh:
Bab 2. Praktikum 2.2. Regresi
plt.grid(True) # ya, pakai grid plt.xlabel(’label sumbu x’) # temperatur plt.ylabel(’label sumbu y’) # viskositas plt.xlim(min(minx, 0.),1.1*maxx) # min & max plt.ylim(min(miny, 0.),1.1*maxy) # u/ plot
(e) blok perhitungan interpolan Newton yang dibuat bersarang dalam loop untuk tabulasi atau plot menggunakan arange. Contoh:
for x in arange(minx, maxx + h, h):
# algoritma ASLINYA mulai dari baris di bawah ini p = a[n] # nilai awal polinom for k in range(1, n + 1):
p = a[n - k] + (x - xData[n - k])*p # SAMPAI DI SINI
y = p
plt.plot(x,y,’b.’) # black ’b’ plot w/ dot ’.’
(f) Jangan lupa, plot titik data dari file (kali ini pakai range), dan tunjukkan grafik
for j in range(0,m):
# red ’r’ plot w/ circle ’o’
plt.plot(xData[j], yData[j],’ro’,linewidth=5) plt.title(’Tulis judul grafik bila perlu’)
plt.show()
2.2
Regresi
Untuk regresi (linear, polinomial), lakukan debugging blok demi blok pada program berikut, lalu berikan ulasan, manakah hasil regresi yang lebih baik?
import matplotlib.pyplot as plt import numpy as np
from numpy import array,arange from math import *
from numpy.linalg import *
####################################################### # kinematic viscosity of water varies with temperatur T # T <--> xData # viscosity <--> yData ####################################################### fdata = open("viscos0.csv", "r") m = input(’Number of data, m = ’) xData = np.zeros(m)
Bab 2. Praktikum 2.2. Regresi
yData = np.zeros(m)
sumx = 0.; sumx2 = 0.; sumx3 = 0.; sumx4 = 0. sumy = 0.; sumxy = 0.; sumx2y = 0.
st = 0.; sr1 = 0.; sr2 = 0. # 2.2 11.098 # sample data
for j in range(0,m):
fdata.seek(0+11*j); xdt = fdata.read(3); xData[j] = xdt fdata.seek(4+11*j); ydt = fdata.read(6); yData[j] = ydt sumx += float(xdt) sumx2 += float(xdt)*float(xdt) sumx3 += float(xdt)*float(xdt)*float(xdt) sumx4 += float(xdt)*float(xdt)*float(xdt)*float(xdt) sumy += float(ydt) sumxy += float(xdt)*float(ydt) sumx2y += float(xdt)*float(xdt)*float(ydt) fdata.close() xmean = sumx/m ymean = sumy/m # print(m) # print(sumx) # print(sumx2) # print(sumx3) # print(sumx4) # print(sumy) # print(sumxy) # print(sumx2y) # linear regression
a1 = (m*sumxy - sumx*sumy)/(m*sumx2 - sumx*sumx) a0 = ymean - a1*xmean
# quadratic regression B = np.array([
[m, sumx, sumx2], [sumx, sumx2, sumx3], [sumx, sumx3, sumx4] ])
C = np.array([sumy, sumxy, sumx2y]) A = np.linalg.solve(B, C)
print(’[A] = ’) print(A)
Bab 2. Praktikum 2.2. Regresi
for j in range(0,m):
st += (yData[j] - ymean)*(yData[j] - ymean)
sr1 += (yData[j] - a0 - a1*xData[j])*(yData[j] - a0 - a1*xData[j]) sr2 += (yData[j] - A[0] - A[1]*xData[j] - A[2]*xData[j])*\
(yData[j] - A[0] - A[1]*xData[j] - A[2]*xData[j]) syx1 = sqrt(sr1/(m - 2)) syx2 = sqrt(sr2/(m - 3)) r12 = (st - sr1)/st r22 = (st - sr2)/st n = m - 1 minx = min(xData[0],xData[n]) maxx = max(xData[0],xData[n]) miny = min(yData[0],yData[n]) maxy = max(yData[0],yData[n]) print(’---’) print(’ xi yi’) print(’---’) for j in range(0,m):
print(’%.1f %.3f’ % (xData[j], yData[j])) print(’---’) print(’a[0] = %+.5f’ % a0) print(’a[1] = %+.5f’ % a1) print(’syx1 = %+.5f’ % syx1) print(’syx2 = %+.5f’ % syx2) print(’r1^2 = %+.5f’ % r12) print(’r2^2 = %+.5f’ % r22) plt.grid(True) plt.xlabel(’label sumbu x’) plt.ylabel(’label sumbu x’) plt.xlim(min(minx, 0.),1.1*maxx) plt.ylim(min(miny, 0.),1.1*maxy) h = input(’plot interval, h = ’) der = input(’linear (1) / quadratic (2) ? der = ’) ################################# # ################################# if der==1: for x in arange(minx,maxx+h,h): y1 = a0 + a1*x plt.plot(x,y1,’b.’)
Bab 2. Praktikum 2.2. Regresi
plt.title(’judul’) elif der==2:
for x in arange(minx,maxx+h,h): y2 = A[0] + x*(A[1] + A[2]*x) plt.plot(x,y2,’b+’)
plt.title(’judul’) for j in range(0,m):
plt.plot(xData[j], yData[j],’ro’,linewidth=5) plt.show()