<div dir="ltr">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)<div class="gmail_extra">
<br><br><div class="gmail_quote">2014-06-25 10:16 GMT-03:00 Manoel Galdino <span dir="ltr"><<a href="mailto:mcz.fea@gmail.com" target="_blank">mcz.fea@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Confesso que fiquei com preguiça de olhar o seu código. Mas tente o seguinte para descobrir qual é o erro:<div>
<br></div><div>1. Adicione um print(i) no loop para saber em que passo do loop dá o erro.</div><div>
2. Em seguida, rode <span style="font-family:arial,sans-serif;font-size:13px">i < 100 & dif > tol e veja se retorna um True ou False.</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">3. Não retornando, veja o conteúdo de dif e tol.</span></div>
<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><font face="arial, sans-serif">Por fim, vendo o erro (NaN, ou seja, Not a Number), em algum momento você pode estar fazendo alguma operação proibida.</font></div>
<div><font face="arial, sans-serif">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.</font></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Abcs</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">M</font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-06-25 1:09 GMT-03:00 Romero Luiz M. Sales Filho <span dir="ltr"><<a href="mailto:romero.sfilho@gmail.com" target="_blank">romero.sfilho@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Caros amigos, <div><br></div><div>por gentileza alguém poderia me auxiliar nesse programa!!</div>
<div><br>
</div><div>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?</div>
<div><br></div><div>Segue o códio completo:</div><div><br></div><div><div>#fornecendo os parâmetros</div><div>n<-100</div><div>u<-runif(n)</div><div>q<-1.5</div><div>theta<-2</div><div>#Obtendo valores da variável Y</div>
<div>y = (1/(theta*(q-2)))*((u^((1-q)/(2-q))-1)/((1-q)/(2-q)))</div><div>###função que quero obter a raiz</div><div>f <- quote((n/x)-((n*sum(y/(1+x*y)))/sum(log(1+x*y)))-sum(y/(1+x*y)))</div><div>fx0 <- function(x){ eval(f) }</div>
<div>curve(fx0, 2, 10)</div><div>### primeira derivada da função</div><div>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))</div><div>fx1 <- function(x){ eval(f1) }</div>
<div>curve(fx1, 0, 10, col=2) </div><div>###segunda derivada da função</div><div>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</div>
<div><br></div><div>(1+x*y)))^2)-(2*n*(sum(y/1+x*y))^3/(sum(log(1+x*y)))^3))</div><div>fx2 <- function(x){ eval(f2) } </div><div><br></div><div>#aplicando o newton-raphson</div><div># valor inicial para o passo</div><div>
i <- 1 </div><div># valor inical para a diferença entre duas avaliações</div><div>dif <- 100 </div><div># diferência mínima entre duas avaliações (tolerância)</div><div>tol <- 10^-9 </div><div># número máximo de passos</div>
<div>dif <- 100 </div><div># valor inicial para a raiz</div><div>x <- 0 </div><div> while(i<100 & dif>tol){</div><div> x[i+1] <- x[i]-fx1(x[i])/fx2(x[i])</div><div> dif <- abs(x[i+1]-x[i])</div>
<div> i <- i+1</div><div> print(x[i])</div><div>}</div><div><br></div><div><br></div><div>No final estou tendo o seguinte erro:</div><div><br></div><div><div>[1] NaN</div><div>Erro em while (i < 100 & dif > tol) { : </div>
<div> valor ausente onde TRUE/FALSE necessário</div></div><div><br></div><div><br></div><div><br></div><div>Alguém pode me ajudar??</div><div>Obrigado,</div><div><br></div><div>Romero.<br></div>
</div></div>
<br></div></div>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<span><font color="#888888"><br></font></span></blockquote>
</div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br>
Manoel Galdino<br><a href="https://sites.google.com/site/galdinomcz/" target="_blank">https://sites.google.com/site/galdinomcz/</a><br>
</font></span></div>
<br>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br></blockquote></div><br></div></div>