In [1]:
# rm(list=ls())
options(OutDec = ",") 
#==============================================================================
# Exemplo - Metodo de Newton-Raphson
#==============================================================================
fx <- function(x){
	if(length(x)!=3 || !is.vector(x)){
		print("O vetor deve ter somente 3 elementos!")
		return(NA)
	}	
	y    <- rep(NA,3)
	y[1] <- exp(x[1])-2
	y[2] <- 5*x[3]-4
	y[3] <- 4*x[1]*x[2]-2*x[3]-6	
	return(y)
}
In [2]:
#==============================================================================
# Jacobiano
#==============================================================================
jacobiano.fx <- function(x){
	if(length(x)!=3 || !is.vector(x)){
		print("O vetor deve ter somente 3 elementos!")
		return(NA)
	}	
	J      <- matrix(0,3,3)
	J[1,1] <- exp(x[1])
	J[2,3] <- 5
	J[3,1] <- 4*x[2]	
	J[3,2] <- 4*x[1]	
	J[3,3] <- -2
	return(J)
}
In [3]:
#==============================================================================
# Newton-Raphson
#==============================================================================
newton.raphson.fx <- function(x0=c(1,1,1),nmax.iter=1000,
                                         tolerancia=1.0e-10){
	if(length(x0)!=3 || !is.vector(x0)){
		print("O vetor deve ter somente 3 elementos!")
		return(NA)
	}
	x     <- matrix(NA,(nmax.iter+1),3) 
	x[1,] <- x0
	for(i in 2:(nmax.iter+1)){
		print(paste("Iteracao:",i-1,sep=" "))
		J     <- jacobiano.fx(x[i-1,])
		x[i,] <- x[i-1,] - solve(J)%*%fx(x[i-1,])
		if(sqrt(sum( (x[i,] - x[i-1,])^2 ) ) <tolerancia) 
			return(x[i,])
	}
	print("Numero maximo de iteracoes atingido!")
	return(x[(nmax.iter+1),])
}
In [4]:
#==============================================================================
# Exemplo
#==============================================================================
# Metodo geral com padroes definidos pela funcao 
#==============================================================================
print("===============================")
z1 <- newton.raphson.fx()
print("===============================")
print(z1)
print("===============================")
print(fx(z1))
print("===============================")
print(jacobiano.fx(z1))
[1] "==============================="
[1] "Iteracao: 1"
[1] "Iteracao: 2"
[1] "Iteracao: 3"
[1] "Iteracao: 4"
[1] "Iteracao: 5"
[1] "==============================="
[1] 0,6931472 2,7411206 0,8000000
[1] "==============================="
[1] 0 0 0
[1] "==============================="
         [,1]     [,2] [,3]
[1,]  2,00000 0,000000    0
[2,]  0,00000 0,000000    5
[3,] 10,96448 2,772589   -2
In [5]:
#==============================================================================
# Exemplo
#==============================================================================
# Utilizando diferentes valores iniciais
#==============================================================================
print("===============================")
z2 <- newton.raphson.fx(c(10,10,10))
print("===============================")
z3 <- newton.raphson.fx(c(-1,-1,-1))
print("===============================")
print(z1)
print("===============================")
print(z2)
print("===============================")
print(z3)
[1] "==============================="
[1] "Iteracao: 1"
[1] "Iteracao: 2"
[1] "Iteracao: 3"
[1] "Iteracao: 4"
[1] "Iteracao: 5"
[1] "Iteracao: 6"
[1] "Iteracao: 7"
[1] "Iteracao: 8"
[1] "Iteracao: 9"
[1] "Iteracao: 10"
[1] "Iteracao: 11"
[1] "Iteracao: 12"
[1] "Iteracao: 13"
[1] "Iteracao: 14"
[1] "Iteracao: 15"
[1] "==============================="
[1] "Iteracao: 1"
[1] "Iteracao: 2"
[1] "Iteracao: 3"
[1] "Iteracao: 4"
[1] "Iteracao: 5"
[1] "Iteracao: 6"
[1] "Iteracao: 7"
[1] "Iteracao: 8"
[1] "Iteracao: 9"
[1] "Iteracao: 10"
[1] "==============================="
[1] 0,6931472 2,7411206 0,8000000
[1] "==============================="
[1] 0,6931472 2,7411206 0,8000000
[1] "==============================="
[1] 0,6931472 2,7411206 0,8000000
In [6]:
#==============================================================================
# Nao deixe de verificar as condicoes de convergencia do algoritmo de 
# Newton-Raphson
#==============================================================================
In [7]:
# rm(list=ls()) 
#==============================================================================
# Fim
#==============================================================================