Exercícios do Capítulo 10
RaizBissecao = function(a,b,f,e){
if(f(a)*f(b) >= 0) stop("Não existe raiz no intervalo a,b")
while(TRUE){
m = (a+b)/2
if(f(m) == 0 | abs(b-m) < e) return(m)
if(f(a)*f(m) < 0){
b = m
}else{
a = m
}
}
}
RaizBissecao(0,3,f=function(x){x-1},0.000001)
## [1] 0.9999998
RaizBissecaoRec = function(a,b,f,e){
if(f(a)*f(b) >= 0) stop("Não existe raiz no intervalo a,b")
m = (a+b)/2
if(f(m) == 0 | abs(b-m) < e) return(m)
if(f(a)*f(m) < 0) return(RaizBissecaoRec(a,m,f,e))
return(RaizBissecaoRec(m, b, f, e))
}
RaizBissecaoRec(0,3,f=function(x){x-1},0.000001)
## [1] 0.9999998
RaizBissecaoArray = function(a,b,f,e){
if(f(a)*f(b) >= 0) stop("Não existe raiz no intervalo a,b")
aproximacoes = c()
while(TRUE){
m = (a+b)/2
if(f(m) == 0 | abs(b-m) < e) {
aproximacoes = c(aproximacoes,m)
return(aproximacoes)
}
if(f(a)*f(m) < 0){
b = m
aproximacoes = c(aproximacoes,m)
}else{
a = m
aproximacoes = c(aproximacoes,m)
}
}
}
{
saida = RaizBissecaoArray(0,3,f=function(x){x-1},0.000001)
plot(0,xlab="x",ylab="f(x)",xlim=c(0,3),ylim=c(-1,2),type="n")
grid()
abline(h=0)
abline(v=0)
curve(x-1,col="blue",add=T)
for(i in 1:length(saida)){
points(saida[i],0,col="red",pch=18,cex.lab=1)
text(saida[i],-0.2,i,col="red")
}
}

RaizBissecaoArray_rec = function(a,b,f,e){
if(f(a)*f(b) >= 0) stop("Não existe raiz no intervalo a,b")
m = (a+b)/2
if(f(m) == 0 | abs(b-m) < e) return(m)
if(f(a)*f(m) < 0) return(c(m,RaizBissecaoArray_rec(a,m,f,e)))
return(c(m,RaizBissecaoArray_rec(m, b, f, e)))
}
{
saida = RaizBissecaoArray_rec(0,3,f=function(x){x-1},0.000001)
plot(0,xlab="x",ylab="f(x)",xlim=c(0,3),ylim=c(-1,2),type="n")
grid()
abline(h=0)
abline(v=0)
curve(x-1,col="blue",add=T)
for(i in 1:length(saida)){
points(saida[i],0,col="red",pch=18,cex.lab=1)
text(saida[i],-0.2,i,col="red")
}
}

f = function(x){2-x^5 -x^3 - x}
a = -1
f(a) # > 0
## [1] 5
b = 1
f(b) # < 0
## [1] -1
#Garatimos que f(a)*f(b) < 0
f(a)*f(b)
## [1] -5
RaizBissecao(a,b,f,0.00001)
## [1] 0.8655777
RaizBissecaoRec(a,b,f,0.00001)
## [1] 0.8655777
raiz = RaizBissecao(a,b,f,0.00001)
{
plot(0,xlab="x",ylab="f(x)",xlim=c(-1,3),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-3,3))
points(RaizBissecao(a,b,f,0.00001),0,col = "red")
text(raiz,-0.2,raiz,col="red")
}

#Observe que o ponto se aproxima bastante do 0 de f(x).
#Também podemos observar se o valor está correto aplicando a função no ponto encontrado.
f(raiz)
## [1] 2.864966e-05
#O resultado é muito proximo de 0
f = function(x){exp(x) -1/x}
{
plot(0, xlim = c(0, 1), ylim = c(0, 4), type = "n")
grid()
curve(1/x, add = T)
curve(exp, add= T)
}

#Possui 1 raiz entre 0.5 e 0.8
#Observe também o gráfico da função:
{
plot(0,xlab="x",ylab="f(x)",xlim=c(-10,10),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-10,10))
}

a = 0.5 ; f(a)
## [1] -0.3512787
b = 0.8 ; f(b)
## [1] 0.9755409
RaizBissecao(a,b,f,0.00001)
## [1] 0.5671356
RaizBissecaoRec(a,b,f,0.00001)
## [1] 0.5671356
raiz = RaizBissecao(a,b,f,0.00001)
{
plot(0,xlab="x",ylab="f(x)",xlim=c(-1,3),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-3,3))
points(RaizBissecao(a,b,f,0.00001),0,col = "red")
text(raiz,-0.2,raiz,col="red")
}

#Observe que o ponto se aproxima bastante do 0 de f(x).
#Também podemos observar se o valor está correto aplicando a função no ponto encontrado.
f(raiz)
## [1] -3.73713e-05
#O resultado é muito proximo de 0
f = function(x){x^2 - 3}
#Possui raiz em sqrt(3) e -sqrt(3)
#Dependendo do intervalo escolhido, iremos achar uma raiz diferente, positiva ou negativa.
a = 0 ; f(a)
## [1] -3
b = 3 ; f(b)
## [1] 6
RaizBissecao(a,b,f,0.00001)
## [1] 1.732046
RaizBissecaoRec(a,b,f,0.00001)
## [1] 1.732046
raiz = RaizBissecao(a,b,f,0.00001)
{
plot(0,xlab="x",ylab="f(x)",xlim=c(0,3),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-3,3))
points(RaizBissecao(a,b,f,0.00001),0,col = "red")
text(raiz,-0.2,raiz,col="red")
}

#Observe que o ponto se aproxima bastante do 0 de f(x).
#Também podemos observar se o valor está correto aplicando a função no ponto encontrado.
f(raiz)
## [1] -1.621284e-05
#O resultado é muito proximo de 0
# caso escolhessemos b = -3, observe:
raiz = RaizBissecao(a,-3,f,0.00001)
{
plot(0,xlab="x",ylab="f(x)",xlim=c(-3,0),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-3,3))
points(RaizBissecao(a,-3,f,0.00001),0,col = "red")
text(raiz,-0.2,raiz,col="red")
}

#Achamos o valor de -sqrt(3)
h = function(x){
x^3/6
}
g = function(x){
1-x^2-x
}
curve(h(x),xlim=c(-5,2))
curve(g(x),add=T)

#3 pontos em que as cruvas se encontram, 3 solucoes.
#outra forma
f = function(x){
h(x)-g(x)
}
curve(f(x),xlim=c(-5,2));abline(h=0)

#h tem 3 raizes.
f = function(x){x^3/6 + x^2 +x -1}
a1 = -6 ; b1 = -4; f(a1)*f(b1)
## [1] -2.333333
a2 = -3 ; b2 = -1; f(a2)*f(b2)
## [1] -0.5833333
a3 = 0 ; b3 = 1; f(a3)*f(b3)
## [1] -1.166667
RaizBissecao(a1,b1,f,0.00001)
## [1] -4.261803
RaizBissecao(a2,b2,f,0.00001)
## [1] -2.339882
RaizBissecao(a3,b3,f,0.00001)
## [1] 0.6016769
raiz2 = round(RaizBissecao(a2,b2,f,0.00001),3)
raiz1 = round(RaizBissecao(a1,b1,f,0.00001),3)
raiz3 = round(RaizBissecao(a3,b3,f,0.00001),3)
{
plot(0,xlab="x",ylab="f(x)",xlim=c(-6,5),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(f,add = T,xlim = c(-6,5))
points(RaizBissecao(a1,b1,f,0.00001),0,col = "red")
text(raiz1,-0.2,raiz1,col="red")
points(RaizBissecao(a2,b2,f,0.00001),0,col = "red")
text(raiz2,-0.2,raiz2,col="red")
points(RaizBissecao(a3,b3,f,0.00001),0,col = "red")
text(raiz3,-0.2,raiz3,col="red")
}

{
plot(0,xlab="x",ylab="f(x)",xlim=c(0,4),ylim=c(-2,2),type="n")
grid()
abline(h=0)
abline(v=0)
plot(sin,add = T,xlim = c(-10,10))
}

a = 2
b = 3.5
raiz = RaizBissecao(a,b,f = sin, 0.0001);raiz
## [1] 3.141571
aproxRaiz = function(x0,e = 0.00000000001){
if(x0 < 0) stop("Não existe raiz de número negativo")
if(x0 == 1 | x0==0) return(x0)
if(x0 > 1) b = x0
else b = 1
return(RaizBissecao(0,b,function(x){x^2-x0},e))
}
aproxRaiz(2)
## [1] 1.414214
aproxRaiz(3)
## [1] 1.732051
aproxRaiz(5)
## [1] 2.236068
#Função da lista anterior
pol_exp_delta = function(x,delta = 0.001){
if(!is.numeric(x)) stop("x tem que ser real")
soma = 1
i = 1
while(TRUE){
incre = x^(i)/factorial(i)
if(abs(incre) < delta){
return(soma)
}else{
soma = soma + incre
}
i = i + 1
}
}
exp_raiz = function(x, e = 0.0000001){
pol_exp_delta(aproxRaiz(x,e),delta = e)
}
# Verificando com a função pronta do R
exp_raiz(3)
## [1] 5.652234
exp(sqrt(3))
## [1] 5.652234