[R-br] Ajuda com método de Newton Raphson!! Urgente!!!

Robert Iquiapaza rbali em ufmg.br
Quarta Junho 25 17:04:55 BRT 2014


Romero,

A função curve não serve não seu caso porque vc tem um vetor na sua função. Compare os gráficos

xi=seq(1.8,2.1,length.out=180)
fi=vector()
for (i in 1:length(xi))fi[i]=fx0(xi[i])
fyt=curve(fx0, 1.5, 2.5,n=length(xi))
plot(xi,fi,type="l")
cbind(xi,fi,fyt$x,fyt$y)
xi[which.min(fi)] 

Para seu código não dar erro tem que definir x primeiro como vetor e depois atribuir o valor inicial
x <- vector()
x <- 1.6

Logo seu código roda mas não para a função específica que vc quer, não pesquisei porque, mesmo aumentando o nº de passos a 500. Pode ser que exista um probelma mas derivadas, pois elas não aproximan da solução. O algoritmo em si aparentemente funciona, teste com 

#Aproximação da raiz de 5
> f=function(x){(x^3)/3-5*x}
> df=function(x){x^2 - 5}
> ddf=function(x){2*x}
> 
> ns=110
> tol=10^-9 
> 
> i=1
> x=vector()
> x=12.5
> dif=100
> 
> while(i<ns & dif>tol){
+     x[i+1] <- x[i]-df(x[i])/ddf(x[i])
+     dif <- abs(x[i+1]-x[i])
+     i <- i+1
+     print(c(i,x[i]))
+ }
[1] 2.00 6.45
[1] 3.000000 3.612597
[1] 4.000000 2.498321
[1] 5.000000 2.249833
[1] 6.00000 2.23611
[1] 7.000000 2.236068
[1] 8.000000 2.236068
From: Benilton Carvalho 
Sent: Wednesday, June 25, 2014 1:43 PM
To: r-br 
Subject: Re: [R-br]Ajuda com método de Newton Raphson!! Urgente!!!

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 em 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 em 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 em 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 em 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.


-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140625/a29cfaef/attachment.html>


Mais detalhes sobre a lista de discussão R-br