Programming Application

R 언어를 이용한 수치해석(보간법) : Numerical Methods with R (Interpolation)


보간법 Interpolation

보간법은 어떤 불연속 적인 데이터에서 범위안에 미지의 값을 추정하기 위한 방법이다. 다차원 보간법도 존재하긴 하지만, 대게 아래와 같이 두 종류의 변수가 대응할 때 많이 사용한다.

{xi, yi} for : i=1, 2, ..., n

주로 사용되는 보간법은 아래와 같다.

  1. Direct Method
  2. Newtons Divided Difference Method
  3. Lagrangian Method
  4. Spline Method

Spline 방법을 제외한 1,2,3 방법은 다항식에 의한 방법에 속한다. 보간법에서 Spline 방법은 굉장히 많이 쓰이며, 그 중 cubic
spline 방법은 불연속적인 데이터들을 가장 부드럽게 연결하는 특징을 가져 보편적으로 많이 사용된다.

Spline Method

Spline 방법은 다른 여러 보간법이 다항식을 활용하여 그래프를 진동시켜 다항식 곡선식을 데이터에 적합시키는데, 차수 선택을 알맞게 해줘야한다. 차수 선택은 따로 이론적인 근거로 인해 선택하는 것이 아니라 공학자에게 굉장히 까다로울 수 있다. 이를 보완하기 위해 부분집합에 저차의 다항식을 소구간별로 연결하는 방법인 spline 방법을 사용할 수 있다.

예제 : 단순한 데이터 보간 Example : Simple Data Interpolation

다음과 같은 데이터가 있다.

x = {0, 1, 2, 3}
y = {0, 2, 1, 0}


Spline 보간법으로 xout 이 1.2 일때 yout을 추정하여본다.
rm(list = ls())

R Example Code : Built-in Funtion

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)


R Example Code : User Funtion

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)


Reference

  1. Autar K Kaw(2011). Numerical Methods with Applications, 2nd Edition [Down] [Link]