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!??
Re:raiz quadrada [RESOLVIDO]
32 Respostas
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
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
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
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.
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!!
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.
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.
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!!
Não se chama modulo. chama-se Valor Absoluto (Absolute Value)
Em programação a função valor absoluto é chamada abs. Vc pode encontrar ela na classe Math.
Algumas outras considerações:
Não é boa prática usar _ nos atributos. Use a palavra reservada this
Coisas que se calculam num método apenas como auxiliares não precisam ser atributos da classe
Validações de consistencia devem ser feitas antes de qq outra coisa.
Se os argumentos não são utilizáveis deve lançar uma exeção IllegalArgumentException
class Raizes{
double epsilon;
public Raizes(double epsilon){
this.epsilon = epsilon;
}
public double raizQuadrada(double numero, double chuteInicial){
if(numero ==0){
return 0;
} else if (numero <0 ){
thrown new IllegalArgumentException("Só pode ser calculada a raiz quadrada de numeros positivos");
} else if (chuteInicial <0 ){
thrown new IllegalArgumentException("O chute deve ser maior ou igual a zero");
}
double anterior = chuteInicial;
double atual = anterior - (anterior*anterior - numero)/(2*anterior);
while (Math.abs(anterior -atual) >= _epsilon){
anterior = atual;
atual = anterior - (anterior*anterior - numero)/(2*anterior);
}
return atual;
}
}
opa sergio valew mano, mas nesse exercicio programa eu preciso realmente implementar da maneira mais simples possivel, eu entendi o que vc falou, mas nele não posso usar o math, seria muito mais facil, mas sou meio iniciante,
mas conheço o Math, se eu pudesse usar seria mais facil,
quanto au exption, naum conheço, obrigado mano, mas tenho que fazer bem simples, para pensar na implementação! mas guardarei suas recomendações, com certeza sera util!! valew!
ola pessoal, então consegui entender melhor o metodo de newton, realmente da pra fazer sem um chute inicial, ou seja é so colocar uma constante, no caso do meu codigo seria o numero, ou um x qualquer, e as variaveis seriam r+1 e rn, ou seja atual e anterior. as contas batem , mas fiz esse codigo que postei a baixo, e esta dando um erro que desconheço NaN, AGUEM PODEME AJUDAR?
class Raizes1{
double _epsilon;
double atual = 0;
public Raizes1(double epsilon){
_epsilon = epsilon;
}
public double mod(double numero){
if(numero < 0)
numero = numero*-1;
return numero;
}
public double raizQuadrada(double numero){
double anterior = numero;
atual = 1/2*(anterior + numero/anterior);
if(numero > 0){
while (mod(atual - anterior) >= _epsilon){
anterior =atual;
atual = 1/2*(anterior + numero/anterior);
}
return atual;
}
else{
System.out.println("erro!!");
}
return -1;
}
}
O que ocorre quando você divide um número por zero, no
Java?
humm, mas pensei que tivesse inicializado quando igualei anterior à numero, e outra pergunta, o para metro numero eu naum quero que mude , quero que seja fixo, por acaso do jeito que fiz ele muda em agum momento, por exemplo quando igualo ela a anterior? obrigado entanglement!!
Não entendi nada o que você escreveu.
Só vi que vai ocorrer, no seu programa, uma divisão por zero.
Se isso ocorrer, você vai obter um Math.NaN logo de cara.
Pense um pouco melhor, e veja o que dá para fazer.
NaN significa Not a Number. É um valor especial para o resultado de algumas operações especiais, como a divisão de zero por zero, infinito por infinito, etc.
ta ok pessoal vou dar uma olhada, mas é que como eu acabei igualando ao parametro passado, pensei que naum iria ficar zerado!! vou ver valew
opa sergio valew mano, mas nesse exercicio programa eu preciso realmente implementar da maneira mais simples possivel, eu entendi o que vc falou, mas nele não posso usar o math, seria muito mais facil, mas sou meio iniciante,
mas conheço o Math, se eu pudesse usar seria mais facil,
quanto au exption, naum conheço, obrigado mano, mas tenho que fazer bem simples, para pensar na implementação! mas guardarei suas recomendações, com certeza sera util!! valew!
uma coisa que vc tem que aprender desee já é que “simples” não significa “do jeito que der” nem “incompleto”.
Não sei porque vc não pode usar o Math. Se é imposição do professor ou algo assim, seja. Mas vc tem que saber na sua cabeça que o jeito correto de fazer é chamando Math.abs. O que ele faz é mais complexo que o seu método mod. Num codigo real vc seria poibido de não usar Math, portanto já se vá habitando a procurar a maneira correta de fazer. Se no final, alguem o proibir disso, vc tem que saber argumentar contra isso.
O mesmo quando a exceções. Vc não conseguirá ir longe em java sem as entender. Tudo bem que é opcional e o seu código tb funciona ( até um certo ponto). Não estou dizendo que o seu código não funciona ou que está errado, estou dizendo que tem que se preocupar em aprender o que é correto e por quê o mais cedo possível.
opa sergio valew mano, mas nesse exercicio programa eu preciso realmente implementar da maneira mais simples possivel, eu entendi o que vc falou, mas nele não posso usar o math, seria muito mais facil, mas sou meio iniciante,
mas conheço o Math, se eu pudesse usar seria mais facil,
quanto au exption, naum conheço, obrigado mano, mas tenho que fazer bem simples, para pensar na implementação! mas guardarei suas recomendações, com certeza sera util!! valew!uma coisa que vc tem que aprender desee já é que “simples” não significa “do jeito que der” nem “incompleto”.
Não sei porque vc não pode usar o Math. Se é imposição do professor ou algo assim, seja. Mas vc tem que saber na sua cabeça que o jeito correto de fazer é chamando Math.abs. O que ele faz é mais complexo que o seu método mod. Num codigo real vc seria poibido de não usar Math, portanto já se vá habitando a procurar a maneira correta de fazer. Se no final, alguem o proibir disso, vc tem que saber argumentar contra isso.O mesmo quando a exceções. Vc não conseguirá ir longe em java sem as entender. Tudo bem que é opcional e o seu código tb funciona ( até um certo ponto). Não estou dizendo que o seu código não funciona ou que está errado, estou dizendo que tem que se preocupar em aprender o que é correto e por quê o mais cedo possível.
Sérgio, vá com calma… acho que a idéia do professor do rapaz é ensinar lógica de programação, não a programação em si. Assim, ele tem que saber raciocinar primeiro, antes de usar os métodos de API.
Que, aliás, tá precisando… porque pra fazer o mesmo que o método Math.abs, só fazer um
if (numero < 0)
return numero * -1;
return numero;
[]´s
opa pessoal obrigado pelas dicas e pela paciencia, sergio, valew os toques, vou tentar seguir essas dicas,mas tenho que aprender mesmo um pouco mais de lógica, e asaudate
valew a paciencia, todos estão sendo de grande ajuda, pois quando aprender, quero ter o mesmo impeto para ajudar outras pessoas!!
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
Não camarada, isso é quadrado do número, ou potência de 2. A raiz quadrada é a operação inversa disso;
Nossa viajei msm =/
ola pessoal vim novamente, para agradecere falar que resolvi o problema!!! realmente o problema estava em alguma divisão, e era a mais simples, a divisão de 1/2, que o java devolve como inteira e o resultado igual a zero, o q portanto zerava minha primeira conta, e lógico que naum dava pra continuar. mas graças a vcs e um pouco de persistencia consegumos resolver, obrigado novamente!!!