Fungsi linier yang dibuat untuk menghubungkan dua buah titik data terdekat akan menyediakan informasi sehingga titik-titik lain di antara kedua titik data tersebut dapat diperoleh menggunakan fungsi tersebut. Hal ini dengan asumsi bahwa hubungan antara variabel bebas dan terikatnya antara kedua titik data bersifat linier.

range 00 and 11 Link to heading

Ilustrasi paling sederhana untuk interpolasi adalah mencari fungsi

f(x)=c0+c1x,    0x1.(1)\tag{1} f(x) = c_0 + c_1 x, \ \ \ \ 0 \le x \le 1.

Terdapat dua titik data (0,y0)(0, y_0) dan (1,y1)(1, y_1) yang memenuhi

f(0)=y0,    f(1)=y1.(2)\tag{2} f(0) = y_0, \ \ \ \ f(1) = y_1.

Substitusi Persamaan (2) ke Persamaan (1) akan memberikan

y0=c0(3)\tag{3} y_0 = c_0

dan

y1=c0+c1.(4)\tag{4} y_1 = c_0 + c_1.

Substitusi Persamaan (3) ke Persamaan (4) akan memberikan

c1=y1y0.(5)\tag{5} c_1 = y_1 - y_0.

Dengan demikian Persamaan (1) dapat dituliskan kembali menjadi

f(x)=y0+(y1y0)x,    0x1.(6)\tag{6} f(x) = y_0 + (y_1 - y_0) x, \ \ \ \ 0 \le x \le 1.

range x0x_0 and x1x_1 Link to heading

Rentang xx dalam Persamaan (6) dapat diperluas menjadi x0x_0 dan x1x_1 dengan

0=x0x0x1x0(7)\tag{7} 0 = \frac{x_0 - x_0}{x_1 - x_0}

dan

1=x1x0x1x0,(8)\tag{8} 1 = \frac{x_1 - x_0}{x_1 - x_0},

sehingga dapat memberikan

0xx0x1x01(9)\tag{9} 0 \le \frac{x - x_0}{x_1 - x_0} \le 1

atau

x0xx1.(10)\tag{10} x_0 \le x \le x_1.

Titik data dalam Persamaan (2) perlu dimodifikasi menjadi

f(x0)=y0,    f(x1)=y1,(11)\tag{11} f(x_0) = y_0, \ \ \ \ f(x_1) = y_1,

yang apabila disubstitusikan ke Persamaan (1) akan memberikan

y0=c0+c1x0(12)\tag{12} y_0 = c_0 + c_1 x_0

dan

y1=c0+c1x1.(13)\tag{13} y_1 = c_0 + c_1 x_1.

Dari Persamaan (12) dan (13) akan diperoleh

c1=y1y0x1x0(14)\tag{14} c_1 = \frac{y_1 - y_0}{x_1 - x_0}

dan

c0=12(y0+y1)12(x0+x1)c1.(15)\tag{15} c_0 = \tfrac12(y_0 + y_1) - \tfrac12 (x_0 + x_1) c_1.

range xix_{i} and xi+1x_{i+1} Link to heading

Dengan menggunakan persamaan-persamaan sebelumnya dapat dituliskan bentuk yang umum, bila terdapat data (xi,yi)(x_i, y_i) dan (xi+1,yi+1)(x_{i+1}, y_{i+1}), dapat diperoleh

c1,i=yi+1yixi+1xi(16)\tag{16} c_{1,i} = \frac{y_{i+1} - y_i}{x_{i+1} - x_i}

dan

c0,i=12(yi+1+yi)12(xi+1+xi)c1,i,(17)\tag{17} c_{0,i} = \tfrac12(y_{i+1} + y_i) - \tfrac12 (x_{i+1} + x_i) c_{1,i},

dengan fungsinya adalah

fi(x)=c0,i+c1,ix,    xixxi+1.(18)\tag{18} f_i(x) = c_{0,i} + c_{1,i} x, \ \ \ \ x_i \le x \le x_{i+1}.

Perhatikan bahwa bila terdapat NN titik data, maka hanya akan terdapat N1N-1 fungsi interpolasi linier sepert yang diberikan dalam Persamaan (17).

an example Link to heading

Sebagai contoh dapat dimisalkan terdapat titik-titik data sebagai berikut.

Tabel 1. Titik data (xi,yi)(x_i, y_i), i=1,..,Ni = 1, .., N dengan N=5N = 5.

iixxyy
100
211
323
436
5410

Dengan menggunakan Persamaan (15) dan (16) dapat diperoleh nilai-nilai c1c_1 dan c0c_0 sebagai berikut.

Tabel 2. Nilai-nilai c0c_0 dan c1c_1 untuk data pada Tabel 1.

xixxi+1x_i \le x \le x_{i+1}c0c_0c1c_1
0x10 \le x \le 10011
1x21 \le x \le 21-122
2x32 \le x \le 33-333
3x43 \le x \le 46-644

Secara sederhana proses untuk memperoleh nilai-nilai c0c_0 dan c1c_1 pada Tabel 1 dapat mengikuti diagram alir berikut, yang merupakan ilustrasi umum dengan detil iterasi untuk setiap titik data tersiratkan dalam beberapa blok.

Begin
{(xi, yi) | i = 1 .. N}
{c0} = f(x, y, N)
1
1
{c1} = g(x, y, N)
{c0}, {c1}
End

Gambar 1. Diagram alir untuk menghitung nilai-nilai c0c_0 dan c1c_1 dari NN titik data.

codes Link to heading

Nilai-nilai c0c_0 dan c1c_1 pada Tabel 2 dapat pula dihitung dengan menggunakan program berikut

x = [0, 1, 2, 3, 4]
y = [0, 1, 3, 6, 10]
N = min(len(x), len(y))

c0 = []
c1 = []

for i in range(N - 1):
  c1i = (y[i+1] - y[i]) / (x[i+1] - x[i])
  c0i = 0.5 * (y[i+1] + y[i]) - 0.5 * (x[i+1] + x[i]) * c1i
  
  c0.append(c0i)
  c1.append(c1i)

print("c0 =", c0)
print("c1 =", c1)

yang akan memberikan hasil

c0 = [0.0, -1.0, -3.0, -6.0]
c1 = [1.0, 2.0, 3.0, 4.0]

dengan contoh programnya tersedia di https://onecompiler.com/python/3zjzynwmr.

Selanjutnya adalah bagaimana menggunakan nilai-nilai c0c_0 dan c0c_0 untuk semua rentang data, yang dalam contoh di atas terdapat empat rentang data. Salah satu implementasinya adalah seperti dalam kode berikut.

import math
import matplotlib.pyplot as plt

xdata = [0, 1, 2, 3, 4]
ydata = [0, 1, 3, 6, 10]
c0 = [0.0, -1.0, -3.0, -6.0]
c1 = [1.0, 2.0, 3.0, 4.0]

def interp(x, xdata, c0, c1):
  i = -1
  for j in range(len(xdata) - 1):
    if (xdata[j] <= x) and (x <= xdata[j+1]):
      i = j
      break
  
  y = c0[i] + c1[i] * x
  return y

N = 17
x = [i * 0.25 for i in range(N)]
y = [interp(i, xdata, c0, c1) for i in x]

plt.grid()

plt.xlabel("x")
plt.ylim([0, 4])

plt.ylabel("y")
plt.ylim([-1, 11])
plt.yticks([*range(11)], [*range(11)])
plt.plot(x, y, '.', xdata, ydata, "ro")
plt.show()

Hasil dari kode di atas, yang tersedia di http://tpcg.io/_OE0CH4, diberikan pada Gambar 2 di bawah ini.

Gambar 2. Hasil interpolasi linier untuk titik-titik data pada Tabel 1 yang terdiri dari titik-titik data dan titik-titik hasil interpolasi.

Perhatikan bahwa terdapat titik-titik lain yang bukan merupakan titik-titik data pad Gambar 2. Titik-titik data digambarkan dengan lingkaran berukuran lebih besar, sedangkan titik-titik hasil interpolasi linier di antara dua titik data berurutan digambarkan dengan lingkaran berukuran lebih kecil.

exercises Link to heading

  1. Perhatikan Gambar 1, tunjukkan bahwa interpolasi yang dihasilkan merupakan interpolasi linier pada setiap rentangnya. Setidaknya sampaikan argumen secara kualitatif dengan menggunakan gambar tersebut.
  2. Gunakan data lain untuk memeriksa apakah program yang diberikan tetap bekerja.