Re:raiz quadrada [RESOLVIDO]

ola pessoal, gostaria de saber se alguem sabe calcular a raiz quadrada de um determinado numero, sem o metodo math, ou seja de maneira iterativa, onde o metodo raizQuadrada(double x), recebe esse x e deve devolver raiz de x, e gostaria de oferecer como construtor um epsilon, q descreve a precisão necessaria. Bom a minha idéia é o seguinte, recebendo esses epsilon e guarda no atributo(construtor), depois no metodo raizQuadrada(double x), ele tera um if para verificar se nao é negativo, e depois um while, que ira fazendo a iteração ate (r(n+1) - r(n) >= epsilon).
Mas o problema que estou enfrentando é que nao estou conseguindo trascrever essas formulas , pois no java nao da pra escrever r(n+1, ou r(n), que descreve o metodo de newton, que estou tentando utilizar.
E tem outro problema, eu teria que implementar sem fornecer um palpite, ou seja se quero calcular a raiz de 63, naum posso fornecer que ela esta entre 7 e 8, ou seja tera que partir só com o valor de x e fazer de maneira iterativa!!
sera que alguem pode me dar uma idéia de como realizar esses calculos!??

Bom, não entendi muito bem oque você quer, mas se for só raiz quadrada que vc quer msm não precisa fazer iteração, basta fazer o número vezes ele mesmo.

[]s

[quote=Naruffy]Bom, não entendi muito bem oque você quer, mas se for só raiz quadrada que vc quer msm não precisa fazer iteração, basta fazer o número vezes ele mesmo.

[]s[/quote]

Não camarada, isso é quadrado do número, ou potência de 2. A raiz quadrada é a operação inversa disso;

então pessoal, é o seguinte, suponha que tenh que calcular a raiz quadrada de um numero x >0. ai eu escolho como estimativa inicial para raiz de x, o numero r(zero) = x
e calcula-se a seguinte sequencia:
rn+1 = 1/2*(rn + x/rn) n = 0,1,2,3… obs: rn e rn+1, não é “r de n” , quer dizer um sequencia, r um , r dois, r tres, e assm por diante, e recebendo ele a cada nova iteração.
ou seja, obtemos para n=0 -> r1 = 1/2*(r0 + x/ r0) =
1/2*(x + x/x) = (x +1)/2, a partir de r1 obtenho r2, e por ai vai. ele deve ser repetido até | rn+1 - rn| >= epsilon.

tenho uma tabela aqui, que talvez ajude as entradas e saida

n = 0 - rn = 63.0 - rn+1 = 32.0 - |rn+1 - rn| = 31
n = 1 - rn = 32.0 - rn+1 = 16.984375 - |rn+1 - rn| = 15.015625.

e por ai vai.
mas os calculos que meu professor me mandou, que ele diz ser o metodo de newton, não batem com esse valor, ai procurei outro site, que tem outro jeito de calcular, mas eu naum consegui implementar um métodp que consiga calcular isso. o site é http://obaricentrodamente.blogspot.com/2008/11/mtodo-de-newton-para-aproximo-de-raz.html.
obrigado!!

SE eu entendi bem(li rapido porque estou no trabalho) vc quer um método que calcule a raiz(quadrada) sem o uso do math…é isso? Então lá vai:

public double calculaRaiz(double valor) { double fatorCalculo = 0.01; //quanto menor o fator maior a precisao. Ex.: 0.0001 while (fatorCalculo * fatorCalculo < valor) { fatorCalculo += 0.01; } return fatorCalculo; }

Espero ter entendido!!

Abraços!

pow pvrsouza, legal, mas na verdade o epsilon que te falei ele é fonrcido por construtor, mas esse não é o metodo de newton não né? olha mas legal, vou fazer um teste de mesa para ver como funciona. mas ainda tenho que resolver esse problema, o que vc fez foi interessante, mas o calculo não bate ainda, vou verificar mano, valew mesmo, obrigado pelo seu tempo

então pessoal o que estou fazendo e o que desejo


class Raizes{
  
  double _epsilon;

  
  
  public Raizes(double epsilon){
    
    _epsilon = epsilon;
  }
  
  public double raizQuadrada(double valor){

 if(x>0){

//while((rn+1 - rn)>= _epsilon){

//faz os caluculos atrves do metodo de newton
}

os problemas para mim estão, no * while, pois nao da pra escrever em jana essas funções, no site que passei , mostra o metodo de newton, mas naum estou conseguindo implementar daquele jeito matematico.

obrigado pela colaboração .

Não , o que ele te passou não é o método de Newton. Mas acho que é o melhor que você vai conseguir encontrar, porque o método de newton usa derivadas, e é meio complicado fazer um programa que calcule uma derivada…

EDIT - Na verdade, o centro do problema é determinar a derivada. Como no caso da raiz quadrada é sempre 2x, você só precisa criar um loop pra determinar quando ((o número que você achou) ao quadrado) - (radicando) é maior que (epsilon).

O pseudo-código está muito bem explicado no site que você passou.

[]´s

Já viu esta explicação na wikipedia? http://en.wikipedia.org/wiki/Newton's_method#Square_root_of_a_number


Cálculo da raiz quadrada de 612, com chute inicial em 10.

sim ja vi sim bruno , o problema esta nas funcões, e nos x0, x1, x2, nao estou conseguindo ver uma saida para fazer o calculo iterativo no while, ou seja ele continua a partir do ultima calculado, e tem outro porem, o meu r0, tem que começar com o x passado por parametro no metodo raizQuadrada, ou seja r0 = x. e ai vai fazendo os calculos.

Não tem muito mistério:

função raiz_quadrada (numero, chute inicial)

  anterior <- chute inicial

  atual <- anterior - (anterior² - numero) / (2 * anterior)


  enquanto (| anterior - atual | > epsilon)

    anterior <- atual

    atual <- anterior - (anterior² - numero) / (2 * anterior)

  fim

  retorna atual

fim

[quote=asaudate]Não , o que ele te passou não é o método de Newton. Mas acho que é o melhor que você vai conseguir encontrar, porque o método de newton usa derivadas, e é meio complicado fazer um programa que calcule uma derivada…

EDIT - Na verdade, o centro do problema é determinar a derivada. Como no caso da raiz quadrada é sempre 2x, você só precisa criar um loop pra determinar quando ((o número que você achou) ao quadrado) - (radicando) é maior que (epsilon).

O pseudo-código está muito bem explicado no site que você passou.
[/quote]

O método de newton não implica em tirar derivadas. Ele é um método de aproximação. Por isso é preciso o epsilon que indica o quão proximo precisa estar.

opa bruno valew camarada, estou dando uma testada aqui. voa tentar mehlorar, se tiver mais duvida doou um toque , valew!!

[quote=sergiotaborda][quote=asaudate]Não , o que ele te passou não é o método de Newton. Mas acho que é o melhor que você vai conseguir encontrar, porque o método de newton usa derivadas, e é meio complicado fazer um programa que calcule uma derivada…

EDIT - Na verdade, o centro do problema é determinar a derivada. Como no caso da raiz quadrada é sempre 2x, você só precisa criar um loop pra determinar quando ((o número que você achou) ao quadrado) - (radicando) é maior que (epsilon).

O pseudo-código está muito bem explicado no site que você passou.
[/quote]

O método de newton não implica em tirar derivadas. Ele é um método de aproximação. Por isso é preciso o epsilon que indica o quão proximo precisa estar. [/quote]

Sim, mas de qualquer maneira, a função usada na divisão é da derivada. Só depois me toquei que ela é praticamente constante (raiz quadrada - 2x - raiz cúbica - 3x - e assim vai… ).

[]´s

então pessoal, estou enfrentando outro problema, é com relação a precisão, independente do construtor que eu carrego, ele continua dando a mesma raiz!!!, utilizei a ideia do bruno, que postou o codigo. obirgado!!

Poste o teu código para vermos.

então bruno , fiz ai mais ou menos, acho, o que vc falou, ainda tem outros metodos que tenho que fazer, mais isso depois eu vejo, o problema é em ralação a precisão(o epsilon), se eu coloco 0.001, é o mesmo para 0.000000001 e 0.0000000000000000000001, independente, e outra coisa, se coloco 1, ele da precisão com duas casa decimais!!!, valew bruno a ajuda!!

class Raizes{
  
  double _epsilon;
  double _anterior;
  double _atual;
  
  
  
  public Raizes(double epsilon){
    
    _epsilon = epsilon;
  }
  
  public double raizQuadrada(double numero, double chuteInicial){
    
    double anterior = chuteInicial;
    double atual = anterior - (anterior*anterior - numero)/(2*anterior); 
    
    if(numero > 0 && chuteInicial > 0){
      
      while (-(anterior -atual) >= _epsilon){
        
        anterior = atual;
        atual = anterior - (anterior*anterior - numero)/(2*anterior);
      }
      return atual;
    }
    
    else{
      System.out.println("erro!!");
    }
    return -1;
  }
}

ou seja se eu fizer para valor 63 com precisão 0.001 e chute 7.5 da: 7.937264150943396
se eu faço 0.000000001 da a mesma coisa, não deveria dar diferente?? ou eu estoou viajando?

O problema pode estar na parte que ele compara o epsilon com o módulo da diferença. Você não está usando módulo, e a diferença pode muito bem dar menos que zero. O cálculo da raiz de aproxima tanto por cima quanto por baixo.

haha certo bruno, mas naum sei usar modulo em java, nao módulo como na matematica, só sei do modulo para o resto!!%%, agora m´dulo assim : |-6|=6 nao sei , vc sabe como? ou algum da vcs!! valew!!