보간법은 어떤 불연속 적인 데이터에서 범위안에 미지의 값을 추정하기 위한 방법이다. 다차원 보간법도 존재하긴 하지만, 대게 아래와 같이 두 종류의 변수가 대응할 때 많이 사용한다.
{xi, yi} for : i=1, 2, ..., n
주로 사용되는 보간법은 아래와 같다.
Spline 방법을 제외한 1,2,3 방법은 다항식에 의한 방법에 속한다. 보간법에서 Spline 방법은 굉장히 많이 쓰이며, 그 중 cubic
spline 방법은 불연속적인 데이터들을 가장 부드럽게 연결하는 특징을 가져 보편적으로 많이 사용된다.
Spline 방법은 다른 여러 보간법이 다항식을 활용하여 그래프를 진동시켜 다항식 곡선식을 데이터에 적합시키는데, 차수 선택을 알맞게 해줘야한다. 차수 선택은 따로 이론적인 근거로 인해 선택하는 것이 아니라 공학자에게 굉장히 까다로울 수 있다. 이를 보완하기 위해 부분집합에 저차의 다항식을 소구간별로 연결하는 방법인 spline 방법을 사용할 수 있다.
다음과 같은 데이터가 있다.
x = {0, 1, 2, 3} y = {0, 2, 1, 0}
Spline 보간법으로 xout 이 1.2 일때 yout을 추정하여본다.
rm(list = ls())
Spline 보간법은 R에 내장 함수로 다음과 같이 사용할 수 있다.
x <- c(0, 1, 2, 3)
y <- c(0, 2, 1, 0)
xout <- 1.2
yout.r <- spline(x, y=y, xout = xout, method="fmm")
print(yout)
Spline 보간법은 다음과 같이 나타낼 수 있다.
rm(list = ls())
x <- c(0, 1, 2, 3)
y <- c(0, 2, 1, 0)
xout <- 1.2
# Spline methos user function
spline.user <- function (xout,x,y){
len <- length(x)
# A matrix
mat <- matrix(0,len,len)
mat[1,1] <- 1
mat[len, len] <- 1
for (i in 2:(len-1)){
mat[i,i] <-4
mat[i,i-1] <-1
mat[i,i+1] <-1
}
#
b <- vector(mode = "list", length = len)
b[1] <-0
b[len] <-0
for (i in 2:(len-1)){
b[i]<- (1/(x[i]-x[i-1])^2)*(y[i-1]-2*y[i]+y[i+1])
}
b <- unlist(b)*6 # list to vector
s <- solve(mat,b)
alpha <- vector(mode = "list", length = len-1)
beta <- vector(mode = "list", length = len-1)
for (i in 2:len){
alpha[i-1] <- y[i]/(x[i]-x[i-1]) - (x[i]-x[i-1])/6*s[i]
beta[i-1] <- y[i-1]/(x[i]-x[i-1]) - (x[i]-x[i-1])/6*s[i-1]
}
alpha <- unlist(alpha)
beta <- unlist(beta)
# interval
iv <- findInterval(xout, x)+1
# spline velue result
yout <- alpha[iv-1]*(xout-x[iv-1]) + beta[iv-1]*(x[iv]-xout) + s[iv-1]/(6*(x[iv]-x[iv-1]))* (x[iv]-xout)^3 + s[iv]/(6*(x[iv]-x[iv-1]))* (xout-x[iv-1])^3
return(yout)
}
yout <- spline.user(xout,x,y)
print(yout)