Ajuda com método de Newton Raphson!! Urgente!!!

Caros amigos, por gentileza alguém poderia me auxiliar nesse programa!! Estou tentando obter a raiz de uma função utilizando o método de Newton, entretanto o R dá um erro e não consigo obter o valor da raiz... Alguém poderia me alertar sobre o que estou errando? Segue o códio completo: #fornecendo os parâmetros n<-100 u<-runif(n) q<-1.5 theta<-2 #Obtendo valores da variável Y y = (1/(theta*(q-2)))*((u^((1-q)/(2-q))-1)/((1-q)/(2-q))) ###função que quero obter a raiz f <- quote((n/x)-((n*sum(y/(1+x*y)))/sum(log(1+x*y)))-sum(y/(1+x*y))) fx0 <- function(x){ eval(f) } curve(fx0, 2, 10) ### primeira derivada da função f1 <-quote((n*(sum(y/(1+x*y)))^2/(sum(log(1+x*y)))^2)-sum(-(y^2/(1+x*y)^2))-(n*sum(-(y^2/(1+x*y)^2))/sum(log(1+x*y)))-(n/x^2)) fx1 <- function(x){ eval(f1) } curve(fx1, 0, 10, col=2) ###segunda derivada da função f2 <-quote((2*n/x^3)-sum(2*y^3/(1+x*y)^3)-(n*sum(2*y^3/(1+x*y)^3)/sum(log(1+x*y)^3))+(3*n*sum(-(y^2/(1+x*y)^2))*sum(y/(1+x*y))/(sum(log (1+x*y)))^2)-(2*n*(sum(y/1+x*y))^3/(sum(log(1+x*y)))^3)) fx2 <- function(x){ eval(f2) } #aplicando o newton-raphson # valor inicial para o passo i <- 1 # valor inical para a diferença entre duas avaliações dif <- 100 # diferência mínima entre duas avaliações (tolerância) tol <- 10^-9 # número máximo de passos dif <- 100 # valor inicial para a raiz x <- 0 while(i<100 & dif>tol){ x[i+1] <- x[i]-fx1(x[i])/fx2(x[i]) dif <- abs(x[i+1]-x[i]) i <- i+1 print(x[i]) } No final estou tendo o seguinte erro: [1] NaN Erro em while (i < 100 & dif > tol) { : valor ausente onde TRUE/FALSE necessário Alguém pode me ajudar?? Obrigado, Romero.

Confesso que fiquei com preguiça de olhar o seu código. Mas tente o seguinte para descobrir qual é o erro: 1. Adicione um print(i) no loop para saber em que passo do loop dá o erro. 2. Em seguida, rode i < 100 & dif > tol e veja se retorna um True ou False. 3. Não retornando, veja o conteúdo de dif e tol. Por fim, vendo o erro (NaN, ou seja, Not a Number), em algum momento você pode estar fazendo alguma operação proibida. Por exemplo, se você rodar no R 0 / 0, ele dá NaN. Isso pode acontecer no seu código, por exemplo, por um problema de aritimética de ponto flutuante. Como tol é inicializado como 10^-9, dependendo das operações que você faz, o R vai aproximar o valor pra zero e vai acontecer uma divisão pro zero, e vai retornar um NaN. E aí, na condição do while, algo como x > NaN dá um NA (ao invpés de T ou F), dando o seu erro. Enfim, estou especulando apenas com base no erro. Abcs M 2014-06-25 1:09 GMT-03:00 Romero Luiz M. Sales Filho < romero.sfilho@gmail.com>:
Caros amigos,
por gentileza alguém poderia me auxiliar nesse programa!!
Estou tentando obter a raiz de uma função utilizando o método de Newton, entretanto o R dá um erro e não consigo obter o valor da raiz... Alguém poderia me alertar sobre o que estou errando?
Segue o códio completo:
#fornecendo os parâmetros n<-100 u<-runif(n) q<-1.5 theta<-2 #Obtendo valores da variável Y y = (1/(theta*(q-2)))*((u^((1-q)/(2-q))-1)/((1-q)/(2-q))) ###função que quero obter a raiz f <- quote((n/x)-((n*sum(y/(1+x*y)))/sum(log(1+x*y)))-sum(y/(1+x*y))) fx0 <- function(x){ eval(f) } curve(fx0, 2, 10) ### primeira derivada da função f1 <-quote((n*(sum(y/(1+x*y)))^2/(sum(log(1+x*y)))^2)-sum(-(y^2/(1+x*y)^2))-(n*sum(-(y^2/(1+x*y)^2))/sum(log(1+x*y)))-(n/x^2)) fx1 <- function(x){ eval(f1) } curve(fx1, 0, 10, col=2) ###segunda derivada da função f2 <-quote((2*n/x^3)-sum(2*y^3/(1+x*y)^3)-(n*sum(2*y^3/(1+x*y)^3)/sum(log(1+x*y)^3))+(3*n*sum(-(y^2/(1+x*y)^2))*sum(y/(1+x*y))/(sum(log
(1+x*y)))^2)-(2*n*(sum(y/1+x*y))^3/(sum(log(1+x*y)))^3)) fx2 <- function(x){ eval(f2) }
#aplicando o newton-raphson # valor inicial para o passo i <- 1 # valor inical para a diferença entre duas avaliações dif <- 100 # diferência mínima entre duas avaliações (tolerância) tol <- 10^-9 # número máximo de passos dif <- 100 # valor inicial para a raiz x <- 0 while(i<100 & dif>tol){ x[i+1] <- x[i]-fx1(x[i])/fx2(x[i]) dif <- abs(x[i+1]-x[i]) i <- i+1 print(x[i]) }
No final estou tendo o seguinte erro:
[1] NaN Erro em while (i < 100 & dif > tol) { : valor ausente onde TRUE/FALSE necessário
Alguém pode me ajudar?? Obrigado,
Romero.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Manoel Galdino https://sites.google.com/site/galdinomcz/

O problema está no chute inicial, pq a tua função [aparentemente] não é definida no ponto x = 0. Colocando qualquer outro valor da certo (apesar deu achar que o algoritmo ta errado, pq sempre converge pra um valor perto do chute inicial, seja qual for ele) 2014-06-25 10:16 GMT-03:00 Manoel Galdino <mcz.fea@gmail.com>:
Confesso que fiquei com preguiça de olhar o seu código. Mas tente o seguinte para descobrir qual é o erro:
1. Adicione um print(i) no loop para saber em que passo do loop dá o erro. 2. Em seguida, rode i < 100 & dif > tol e veja se retorna um True ou False. 3. Não retornando, veja o conteúdo de dif e tol.
Por fim, vendo o erro (NaN, ou seja, Not a Number), em algum momento você pode estar fazendo alguma operação proibida. Por exemplo, se você rodar no R 0 / 0, ele dá NaN. Isso pode acontecer no seu código, por exemplo, por um problema de aritimética de ponto flutuante. Como tol é inicializado como 10^-9, dependendo das operações que você faz, o R vai aproximar o valor pra zero e vai acontecer uma divisão pro zero, e vai retornar um NaN. E aí, na condição do while, algo como x > NaN dá um NA (ao invpés de T ou F), dando o seu erro. Enfim, estou especulando apenas com base no erro.
Abcs
M
2014-06-25 1:09 GMT-03:00 Romero Luiz M. Sales Filho < romero.sfilho@gmail.com>:
Caros amigos,
por gentileza alguém poderia me auxiliar nesse programa!!
Estou tentando obter a raiz de uma função utilizando o método de Newton, entretanto o R dá um erro e não consigo obter o valor da raiz... Alguém poderia me alertar sobre o que estou errando?
Segue o códio completo:
#fornecendo os parâmetros n<-100 u<-runif(n) q<-1.5 theta<-2 #Obtendo valores da variável Y y = (1/(theta*(q-2)))*((u^((1-q)/(2-q))-1)/((1-q)/(2-q))) ###função que quero obter a raiz f <- quote((n/x)-((n*sum(y/(1+x*y)))/sum(log(1+x*y)))-sum(y/(1+x*y))) fx0 <- function(x){ eval(f) } curve(fx0, 2, 10) ### primeira derivada da função f1 <-quote((n*(sum(y/(1+x*y)))^2/(sum(log(1+x*y)))^2)-sum(-(y^2/(1+x*y)^2))-(n*sum(-(y^2/(1+x*y)^2))/sum(log(1+x*y)))-(n/x^2)) fx1 <- function(x){ eval(f1) } curve(fx1, 0, 10, col=2) ###segunda derivada da função f2 <-quote((2*n/x^3)-sum(2*y^3/(1+x*y)^3)-(n*sum(2*y^3/(1+x*y)^3)/sum(log(1+x*y)^3))+(3*n*sum(-(y^2/(1+x*y)^2))*sum(y/(1+x*y))/(sum(log
(1+x*y)))^2)-(2*n*(sum(y/1+x*y))^3/(sum(log(1+x*y)))^3)) fx2 <- function(x){ eval(f2) }
#aplicando o newton-raphson # valor inicial para o passo i <- 1 # valor inical para a diferença entre duas avaliações dif <- 100 # diferência mínima entre duas avaliações (tolerância) tol <- 10^-9 # número máximo de passos dif <- 100 # valor inicial para a raiz x <- 0 while(i<100 & dif>tol){ x[i+1] <- x[i]-fx1(x[i])/fx2(x[i]) dif <- abs(x[i+1]-x[i]) i <- i+1 print(x[i]) }
No final estou tendo o seguinte erro:
[1] NaN Erro em while (i < 100 & dif > tol) { : valor ausente onde TRUE/FALSE necessário
Alguém pode me ajudar?? Obrigado,
Romero.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Manoel Galdino https://sites.google.com/site/galdinomcz/
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

alem disso, o 'x' eh definido inicialmente como escalar e depois usado como vetor. b Em 25 de junho de 2014 10:54, Rodrigo Coster <rcoster@gmail.com> escreveu:
O problema está no chute inicial, pq a tua função [aparentemente] não é definida no ponto x = 0. Colocando qualquer outro valor da certo (apesar deu achar que o algoritmo ta errado, pq sempre converge pra um valor perto do chute inicial, seja qual for ele)
2014-06-25 10:16 GMT-03:00 Manoel Galdino <mcz.fea@gmail.com>:
Confesso que fiquei com preguiça de olhar o seu código. Mas tente o
seguinte para descobrir qual é o erro:
1. Adicione um print(i) no loop para saber em que passo do loop dá o erro. 2. Em seguida, rode i < 100 & dif > tol e veja se retorna um True ou False. 3. Não retornando, veja o conteúdo de dif e tol.
Por fim, vendo o erro (NaN, ou seja, Not a Number), em algum momento você pode estar fazendo alguma operação proibida. Por exemplo, se você rodar no R 0 / 0, ele dá NaN. Isso pode acontecer no seu código, por exemplo, por um problema de aritimética de ponto flutuante. Como tol é inicializado como 10^-9, dependendo das operações que você faz, o R vai aproximar o valor pra zero e vai acontecer uma divisão pro zero, e vai retornar um NaN. E aí, na condição do while, algo como x > NaN dá um NA (ao invpés de T ou F), dando o seu erro. Enfim, estou especulando apenas com base no erro.
Abcs
M
2014-06-25 1:09 GMT-03:00 Romero Luiz M. Sales Filho < romero.sfilho@gmail.com>:
Caros amigos,
por gentileza alguém poderia me auxiliar nesse programa!!
Estou tentando obter a raiz de uma função utilizando o método de Newton, entretanto o R dá um erro e não consigo obter o valor da raiz... Alguém poderia me alertar sobre o que estou errando?
Segue o códio completo:
#fornecendo os parâmetros n<-100 u<-runif(n) q<-1.5 theta<-2 #Obtendo valores da variável Y y = (1/(theta*(q-2)))*((u^((1-q)/(2-q))-1)/((1-q)/(2-q))) ###função que quero obter a raiz f <- quote((n/x)-((n*sum(y/(1+x*y)))/sum(log(1+x*y)))-sum(y/(1+x*y))) fx0 <- function(x){ eval(f) } curve(fx0, 2, 10) ### primeira derivada da função f1 <-quote((n*(sum(y/(1+x*y)))^2/(sum(log(1+x*y)))^2)-sum(-(y^2/(1+x*y)^2))-(n*sum(-(y^2/(1+x*y)^2))/sum(log(1+x*y)))-(n/x^2)) fx1 <- function(x){ eval(f1) } curve(fx1, 0, 10, col=2) ###segunda derivada da função f2 <-quote((2*n/x^3)-sum(2*y^3/(1+x*y)^3)-(n*sum(2*y^3/(1+x*y)^3)/sum(log(1+x*y)^3))+(3*n*sum(-(y^2/(1+x*y)^2))*sum(y/(1+x*y))/(sum(log
(1+x*y)))^2)-(2*n*(sum(y/1+x*y))^3/(sum(log(1+x*y)))^3)) fx2 <- function(x){ eval(f2) }
#aplicando o newton-raphson # valor inicial para o passo i <- 1 # valor inical para a diferença entre duas avaliações dif <- 100 # diferência mínima entre duas avaliações (tolerância) tol <- 10^-9 # número máximo de passos dif <- 100 # valor inicial para a raiz x <- 0 while(i<100 & dif>tol){ x[i+1] <- x[i]-fx1(x[i])/fx2(x[i]) dif <- abs(x[i+1]-x[i]) i <- i+1 print(x[i]) }
No final estou tendo o seguinte erro:
[1] NaN Erro em while (i < 100 & dif > tol) { : valor ausente onde TRUE/FALSE necessário
Alguém pode me ajudar?? Obrigado,
Romero.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- Manoel Galdino https://sites.google.com/site/galdinomcz/
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-- [image: Benilton Carvalho on about.me] Benilton Carvalho about.me/benilton <http://about.me/benilton>
participantes (4)
-
Benilton Carvalho
-
Manoel Galdino
-
Rodrigo Coster
-
Romero Luiz M. Sales Filho