Definition

The Taylor series of a generic function $$f(x)$$ in the point $$x = x_0$$ is the following power series: $f(x_0) + \frac{f^{'}(x_0)}{1!} (x - x_0) + \frac{f^{''}(x_0)}{2!} (x - x_0)^2 + \frac{f^{'''}(x_0)}{3!} (x - x_0)^3 + \ldots$

Taylor series for the square function

Let consider the function: $f(x) = x^2$

Suppose now to be interested in the Mac-Laurin approximation of order 0, 1, 2 and 3.

For our function $$f(x) = x^2$$, only the first derivative is different from zero: - $$f^'(x) = 2$$ The subsequent derivates are indeed all null: - $$f^{n}(x) = 0, n \ge 2$$

Let us define an R-function for each approximation:

#approximation of order 0
x2order0 <- function(x, x0=0) x0^2
#approximation of order 1
x2order1 <- function(x, x0=0) x0^2 + (x - x0)*2*x0
#approximation of order 2
x2order2 <- function(x, x0=0)
x0^2 + (x - x0)*2*x0 + (x - x0)^2 * 2 / factorial(2)
#since the derivates, starting from the order 3, are null
#we can avoid to define the higher order approximations

Note 1: in defining the components of the Taylorâ€™s series, the default value 0 has been used for the point in which the function is approximated. This is the MacLaurin approximation, i.e.Â the Taylor series evaluated in the point $$x_0 = 0$$.

Note 2: the following alternative solution exploits the lower order approximations in computing the higher order approximations:

x2order0 <- function(x, x0=0) x0^2
x2order1 <- function(x, x0=0) x2order0(x, x0) + (x - x0)*2*x0
x2order2 <- function(x, x0=0)
x2order0(x, x0) + x2order1(x, x0) + (x - x0)^2 * 2 / factorial(2)
#prova di chiamata dell'approssimazione di ordine 2 in due punti usando x0=1
x2order0(0)
[1] 0
x2order0(10)
[1] 0
#prova di chiamata della funzione per l'approssimazione di ordine 2 in due punti
x2order0(c(0, 10))
[1] 0
#per fare valutare la funzione in ciascun valore del vettore in input Ã¨ necessario
#utilizzare la funzione Vectorize
x2order0vec <- Vectorize(x2order0, vectorize.args="x")
x2order0vec(c(0, 10))
[1] 0 0
#nell'approssimazione di ordine 0 Ã¨ necessario usare la funzione Vectorize
#poichÃ¨ la funzione Ã¨ costante e non dipende da x
#non Ã¨ necessario per le approssimazioni di ordine superiore
x2order1(c(0, 10))
[1] 0 0
x2order2(c(0, 10))
[1]   0 100
#preparo un vettore di interi sequenziali da usare come ascisse
ascisse <- -100:100
#rappresento la funzione da approssimare usando una linea nera
#il parametro main permette di impostare il titolo
#impostando il parametro type="l" ottengo una linea
#la funzione expression permette di utilizzare espressioni matematiche
plot(ascisse, ascisse^2, type="l", col="black", xlab="x", ylab="f(x)",
main=expression(paste("f(x)=",x^2)))
#l'approssimazione di ordine 0 usando una linea rossa
lines(ascisse, x2order0vec(ascisse), col="red")
#l'approssimazione di ordine 1 usando una linea blue
lines(ascisse, x2order1(ascisse), col="blue")
#l'approssimazione di ordine 2 usando una linea verde tratteggiata (argomento 2)
#con uno spessore maggiore (argomento lwd)
lines(ascisse, x2order2(ascisse), col="green", lwd=5, lty=2)

#cambiando il punto di valutazione dell'approssimazione (argomento x0) si ottiene:
plot(ascisse, ascisse^2, type="l", col="black", xlab="x", ylab="f(x)",
main=expression(paste("f(x)=",x^2)))
lines(ascisse, x2order0vec(ascisse, x0=10), col="red")
lines(ascisse, x2order1(ascisse, x0=10), col="blue")
lines(ascisse, x2order2(ascisse, x0=10), col="green", lwd=5, lty=2)

Taylor series for the exponential function

Let consider now the exponential function: $f(x) = exp(x)$ This is a particular function, since all the derivates are equal to the function itself: $f^{(i)}(x) = exp(x), \forall i \ge 1$

For such a function it is interesting to consider the Taylor series using a different number of components of such a series.

Let define an R-function for the first five subsequent terms of the Taylor series:

#Taylor approximation of order 0
expXorder0 <- function(x, x0=0) exp(x0)
#Taylor approximation of order 1
expXorder1 <- function(x, x0=0) exp(x0) + (x - x0)*exp(x0)
#Taylor approximation of order 2
expXorder2 <- function(x, x0=0)
exp(x0) + (x - x0)*exp(x0) + (x - x0)^2 * exp(x0) / factorial(2)
#Taylor approximation of order 3
expXorder3 <- function(x, x0=0)
exp(x0) + (x - x0)*exp(x0) +
(x - x0)^2 * exp(x0) / factorial(2) +
(x - x0)^3 * exp(x0) / factorial(3)
#Taylor approximation of order 4
expXorder4 <- function(x, x0=0)
exp(x0) + (x - x0)*exp(x0) +
(x - x0)^2 * exp(x0) / factorial(2) +
(x - x0)^3 * exp(x0) / factorial(3) +
(x - x0)^4 * exp(x0) / factorial(4)
#Taylor approximation of order 5
expXorder5 <- function(x, x0=0)
exp(x0) + (x - x0)*exp(x0) +
(x - x0)^2 * exp(x0) / factorial(2) +
(x - x0)^3 * exp(x0) / factorial(3) +
(x - x0)^4 * exp(x0) / factorial(4) +
(x - x0)^5 * exp(x0) / factorial(5)

Since the first component is constant, we need to exploit the Vectorize function so to have a return value for each component of input vector:

expXorder0vec <- Vectorize(expXorder0, vectorize.args="x")

In order to plot the original function as well as its subsequent approximations, it is useful to define a sequence of integers:

abscissa <- 0:5

The following plot depicts the original function (solid black line) along with the first 5 approximation of the Taylor series (lines of different colors):

#rappresento la funzione da approssimare usando una linea nera
#NOTA: la funzione expressione permette di utilizzare formule sulle
#      rappresentazioni grafiche
#      Per una carrellata delle opzioni disponibili consultare
#      demo(plotmath) e example(plotmath)
plot(abscissa, exp(abscissa),
type="l", col="black", xlab="x", ylab="f(x)",
main=expression(paste("f(x)=",e^x)))
#l'approssimazione di ordine 0 usando una linea rossa
lines(abscissa, expXorder0vec(abscissa), col="red")
#l'approssimazione di ordine 1 usando una linea blue
lines(abscissa, expXorder1(abscissa), col="blue")
#l'approssimazione di ordine 2 usando una linea verde
lines(abscissa, expXorder2(abscissa), col="green")
#l'approssimazione di ordine 3 usando una linea magenta
lines(abscissa, expXorder3(abscissa), col="magenta")
#l'approssimazione di ordine 4 usando una linea marrone
lines(abscissa, expXorder4(abscissa), col="brown")
#l'approssimazione di ordine 5 usando una linea arancione
lines(abscissa, expXorder5(abscissa), col="orange")

What happens if we change the value $$x_0$$ in which the function is approximated? Here is the answer for the case $$x_0 = 10$$:

#cambiando il punto di valutazione dell'approssimazione (argomento x0) si ottiene:
plot(abscissa, exp(abscissa),
type="l", col="black", xlab="x", ylab="f(x)",
main=expression(paste("f(x)=",e^x)))
lines(abscissa, expXorder0vec(abscissa, x0=3), col="red")
lines(abscissa, expXorder1(abscissa, x0=3), col="blue")
lines(abscissa, expXorder2(abscissa, x0=3), col="green")
lines(abscissa, expXorder3(abscissa, x0=3), col="magenta")
lines(abscissa, expXorder4(abscissa, x0=3), col="brown")
lines(abscissa, expXorder5(abscissa, x0=3), col="orange")