Taylor expension 을 이용한 함수근사 시뮬레이션

대학원 수업중 Taylor expension 이 왜 강력하고 자주 사용되는지 언급되었습니다.
교수님의 말씀을 들어보니 확실히 잘 쓰일수 밖에 없겠구나 라는 공감이 들었습니다.
이를 동기부여로.
Taylor expension 을 이용해 어떤 함수를 근사하는 것을 시각적으로 보고싶은 마음이 생겼습니다.

테일러 급수는 미분가능한 모든 함수가 다항식의 무한개 합으로 표현가능하다는 이론입니다.
무한개 합으로 표현은 할 수 있지만 보통 그러지 않고 어느선까지 표현하여 근사시키는것 또한 가능합니다.

\[f(x) = e^x\]

시뮬레이션에 사용될 함수는 위와같이 exponential 함수입니다.
\(x=0\) 근방을 기준(가운데)으로 하여 R에서 ploting 하면 다음과 같습니다.

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=2, col="black")  

0 이 근방에서 e^x 함수와 가까워 지기위한 테일러전개 함수는 다음과 같습니다.

\(T_{ f }(x)~ =~ \sum _{ r=0 }^{ \infty }{ \frac { f^{ (r) }(a) }{ r! } (x-a)^{ r } } \\ \\\\ f(x)~ =~ e^{ x }\\ a~ =~ 0\\ \\\\ e^{ x }~ =~ \frac { exp(0) }{ 0! } (x-0)^{ 0 }+\frac { exp^{ \prime }(0) }{ 1! } (x-0)^{ 1 }+\frac { exp^{ \prime \prime }(0) }{ 2! } (x-0)^{ 2 }+\frac { exp^{ \prime \prime \prime }(0) }{ 3! } (x-0)^{ 3 }+\cdots\)

여기서 맨 첫번째 우항을 이용해

\(e^{ x }~ \approx ~ \frac { exp(0) }{ 0! } (x-0)^{ 0 }\)

를 첫번째로 ploting 해보겠습니다.

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=2, col="black")  
function1 <- function(x) {exp(0)/factorial(0)*(x-0)^0}  
curve(function1, -3, 3, add=T, col="red")  

0값 근방에서는 잘 추정이 되었으나 나머지 부분은 명백히 잘못 추정합니다.
그럼 우항하나가 아닌 두항을 써보면 어떨까요?

\(e^{ x }~ \approx ~ \frac { exp(0) }{ 0! } (x-0)^{ 0 }+\frac { exp^{ \prime }(0) }{ 1! } (x-0)^{ 1 }\)

다음의 경우입니다.

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=2, col="black")  
function2 <- function(x) {  
    exp(0)/factorial(0)*(x-0)^0 +  
    exp(0)/factorial(1)*(x-0)^1  
}  
curve(function2, -3, 3, add=T, col="red")  

역시 0값 근방에서는 추정하는데는 문제가 없습니다.
그런데 전보다 0근방에서 벗어나더라도 차이가 크지 않군요.
물론 0 에서 멀어질수록 차이는 나지만 우항한개를 쓴 경우보다 훨씬 개선되었음을 시각적으로 볼 수 있습니다.
더 늘려봅시다.

\(e^{ x }~ \approx ~ \frac { exp(0) }{ 0! } (x-0)^{ 0 }+\frac { exp^{ \prime }(0) }{ 1! } (x-0)^{ 1 }+\frac { exp^{ \prime \prime }(0) }{ 2! } (x-0)^{ 2 }\)

의 경우입니다.

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=2, col="black")  
function3 <- function(x) {  
    exp(0)/factorial(0)*(x-0)^0 +  
    exp(0)/factorial(1)*(x-0)^1 +   
    exp(0)/factorial(2)*(x-0)^2  
}  
curve(function3, -3, 3, add=T, col="red")  

이제부터 뭔가 확 느껴지는군요..
다음은 이겁니다.

\(e^{ x }~ \approx ~ \frac { exp(0) }{ 0! } (x-0)^{ 0 }+\frac { exp^{ \prime }(0) }{ 1! } (x-0)^{ 1 }+\frac { exp^{ \prime \prime }(0) }{ 2! } (x-0)^{ 2 }+\frac { exp^{ \prime \prime \prime }(0) }{ 3! } (x-0)^{ 3 }\)

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=2, col="black")  
function4 <- function(x) {  
    exp(0)/factorial(0)*(x-0)^0 +  
    exp(0)/factorial(1)*(x-0)^1 +   
    exp(0)/factorial(2)*(x-0)^2 +   
    exp(0)/factorial(3)*(x-0)^3  
}  
curve(function4, -3, 3, add=T, col="red")  

신기합니다.
exponential 함수가 어떠한 점을 근방으로 하여 이런한 다항식으로 근사가 가능하니 쓸모가 참으로 많을것 같습니다.
다음은 저의 시뮬레이션을 정리한 결과입니다.

plot(c(-3,3),c(0,20), type="n", xlab="x", ylab="exp(x)")  
curve(exp, -3, 3, add=T, lwd=3, col="black")  
  
color <- colorRampPalette(c("white", "red"))(5)  
curve(function1, -3, 3, add=T, col=color[2])  
curve(function2, -3, 3, add=T, col=color[3])  
curve(function3, -3, 3, add=T, col=color[4])  
curve(function4, -3, 3, add=T, col=color[5])  
  
legend(-3, 20, legend=c(1,2,3,4), fill=color[2:5])  

위의 예시는 테일러 근사에 exponential function 을 0근방에서 시뮬레이션 한 것입니다.
하지만 저 함수말고도 미분가능한 다양한 함수를 쓰든, 그리고 어떠한 근방에서 시뮬레이션을 하든지 이런식으로 테일러근사를 시킨다면 본 함수와 가까워지게 됩니다.