options(digits = 21)

1)

#e^1 n = 4
1 + 1 + 1/factorial(2) + 1/factorial(3) + 1/factorial(4)
## [1] 2.708333333333333
#e^3 n = 4
1 + 3 + 3^2/factorial(2) + 3^3/factorial(3) + 3^4/factorial(4)
## [1] 16.375

2)

pol_exp = function(x,n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(!is.numeric(x)) stop("x tem que ser real")
  soma = 1
  for(i in 1:n){
    soma = soma + x^(i)/factorial(i)
  }
  return(soma)
}

{plot(exp,-4,4)
grid()
segments(x0=0,y0=0,x1=0,y1=150,lty=2)
curve(pol_exp(x,n=2),add=T,col="violet")
curve(pol_exp(x,n=3),add=T,col="red")
curve(pol_exp(x,n=4),add=T,col="blue")
curve(pol_exp(x,n=5),add=T,col="green")}

3)

pol_exp_delta = function(x,delta = 0.001){
  if(!is.numeric(x)) stop("x tem que ser real")
  soma = 1
  for(i in 1:10){
    soma = soma + x^(i)/factorial(i)
  }
  i = 11
  while(TRUE){
    incre = x^(i)/factorial(i)
    
    if(abs(incre) < delta){
      return(soma)
    }else{
    soma = soma + incre
    }
    
    i = i + 1
  }
}

pol_exp_delta(1/2)
## [1] 1.6487212706873655
exp(1/2)
## [1] 1.6487212707001282
pol_exp_delta(7.3)
## [1] 1480.2987408255419
exp(7.3)
## [1] 1480.299927584545

4)

pol_exp_delta_n = function(x,delta = 0.001){
  if(!is.numeric(x)) stop("x tem que ser real")
  soma = 1
  for(i in 1:10){
    soma = soma + x^(i)/factorial(i)
  }
  i = 11
  while(TRUE){
    incre = x^(i)/factorial(i)
    
    if(abs(incre) < delta){
      return(list("Soma" = soma,
                  "Interações" = i))
    }else{
    soma = soma + incre
    }
    
    i = i + 1
  }
}

data.frame("x" = c(1/2,7.3),
           "exp" = c(exp(1/2),exp(7.3)),
           "aprox_ex" = c(pol_exp_delta_n(1/2)[[1]],pol_exp_delta_n(7.3)[[1]]),
           "interações" = c(pol_exp_delta_n(1/2)[[2]],pol_exp_delta_n(7.3)[[2]]))
##                    x                   exp              aprox_ex interações
## 1 0.5000000000000000    1.6487212707001282    1.6487212706873655         11
## 2 7.2999999999999998 1480.2999275845450029 1480.2987408255419268         24

5)

(1/10 - 1) - (1/10 -1)^2 / 2 + (1/10 -1)^3 / 3 - (1/10 - 1)^4 / 4
## [1] -1.7120250000000004
(3/5 - 1) - (3/5 -1)^2 / 2 + (3/5 -1)^3 / 3 - (3/5 -1)^4 /4
## [1] -0.50773333333333337
(4 - 1) - (4 -1)^2 / 2 + (4 -1)^3 / 3 - (4-1)^4 / 4
## [1] -12.75
# A aproximação mais precisa é aquela que está mais próxima de x0 = 1. Então, temos mais precisão no ponto 3/5 = 0.6, comparado a 1/10 = 0.1 .

6)

pol_ln = function(x,n){
  if((n<0)||(n%%1 != 0)) stop("n tem que ser um natural")
  if(!is.numeric(x)) stop("x tem que ser real")
  soma = 0
  for(i in 0:n){
    soma = soma + (-1)^i * (((x-1)^(i+1))/(i+1))
  }
  return(soma)
}

{plot(log,0,4)
grid()
segments(x0=1,y0=-4,x1=1,y1=10,lty=2)
curve(pol_ln(x,n=2),add=T,col="violet")
curve(pol_ln(x,n=3),add=T,col="red")
curve(pol_ln(x,n=4),add=T,col="blue")
curve(pol_ln(x,n=5),add=T,col="green")}

7)

pol_ln_delta = function(x,delta = 0.001){
  if(x<=0) stop("X precisa ser maior que 0")
  if(!is.numeric(x)) stop("x tem que ser real")
  if(x>=2) return(-pol_ln_delta(1/x,delta))
  
  soma = 0
  for(i in 0:10){
    soma = soma + ((-1)^i) * (((x-1)^(i+1))/(i+1))
  }
  i = 11
  
  while(TRUE){
    incre = ((-1)^i) * (((x-1)^(i+1))/(i+1))
    
    if(abs(incre) < delta){
      return(soma)
    }else{
    soma = soma + incre
    }
    
    i = i + 1
  }
}

data.frame("x" = c(0.1,2,10,3.8),
           "ln(x)" = c(log(0.1),log(2),log(10),log(3.8)),
           "aprox_ln(x)" = c(pol_ln_delta(0.1),pol_ln_delta(2),
                           pol_ln_delta(10),pol_ln_delta(3.8)))
##                      x                ln.x.          aprox_ln.x.
## 1  0.10000000000000001 -2.30258509299404546 -2.29493382048387318
## 2  2.00000000000000000  0.69314718055994529  0.69310924535533891
## 3 10.00000000000000000  2.30258509299404590  2.29493382048387318
## 4  3.79999999999999982  1.33500106673233998  1.33176135671266427

8)

aprox_ln_base = function(x,b,delta = 0.001){
  return(pol_ln_delta(x,delta)/pol_ln_delta(b,delta))
}

aprox_ln_base(100,10)
## [1] 1.9761165952155055

9)

aprox_sen = function(x,delta = 0.001){
  if(x > pi) return(aprox_sen(x - 2*pi, delta))
  if(x < -pi) return(aprox_sen(x + 2*pi, delta))
  
  soma = 0
  for(i in 0:10){
    soma = soma + ((-1)^(i))*(x^(2*i + 1))/factorial(2*i + 1)
  }
  
  i = 11
  
  while(TRUE){
    incre = ((-1)^(i))*(x^(2*i + 1))/factorial(2*i + 1)
    if(abs(incre) < delta){
      return(soma)
    }else{
      soma = soma + incre
    }
    i = i + 1
  }
}

data.frame("x" = c(2,25,50,pi/3),
           "sen(x)" = c(sin(2),sin(25),sin(50),sin(pi/3)),
           "aprox_sen(x)" = c(aprox_sen(2),aprox_sen(25),aprox_sen(50),aprox_sen(pi/3)))
##                     x               sen.x.         aprox_sen.x.
## 1  2.0000000000000000  0.90929742682568171  0.90929742682568204
## 2 25.0000000000000000 -0.13235175009777303 -0.13235175009777206
## 3 50.0000000000000000 -0.26237485370392877 -0.26237485370392682
## 4  1.0471975511965976  0.86602540378443860  0.86602540378443849

10)

aprox_cos = function(x, delta = 0.001){
  return(aprox_sen(x + pi/2, delta))
}

data.frame("x" = c(1,54,45,pi/3),
           "cos(x)" = c(cos(1),cos(54),cos(45),cos(pi/3)),
           "aprox_cos(x)" = c(aprox_cos(1),aprox_cos(54),aprox_cos(45),aprox_cos(pi/3)))
##                     x               cos.x.         aprox_cos.x.
## 1  1.0000000000000000  0.54030230586813977  0.54030230586824313
## 2 54.0000000000000000 -0.82930983286315019 -0.82930983286314786
## 3 45.0000000000000000  0.52532198881772973  0.52532198881784797
## 4  1.0471975511965976  0.50000000000000011  0.50000000000015721