Alguém poderia me ajudar estou tentando criar um método que calcule a raiz quadrada.
O método de Newton é uma aproximação. Parece muito uma busca binária.
A ideia é que se você tem um número cuja raiz quadrada quer calcular (A, digamos) e um chute de qual é essa raiz (X, digamos), você consegue aproximar X da raiz de A fazendo essa conta: Xmelhor = 1/2 * (X + A/X).
Agora com o Xmelhor em mãos, você pode melhorar ele ainda mais: XmelhorAinda = 1/2 * (Xmelhor + A/Xmelhor).
E assim por diante. Um chute inicial muito bom é justamente esse que ele passou no exercício: A/2.
O exercício pede que você faça esse processo de melhoria até que a diferença entre um X melhor e um X melhor ainda seja menor do que 0,001. Só isso. Boa sorte!
Obrigado Ivbarbosa, estou tentando realizar aqui.
Iv barbosa tentei criar um método para calcular a raiz quadrada segundo a sua explicação. porém está dando erro no método while, troquei o Math.abs ( Valor Absoluto) pelo comando auxiliar mod, não sei se o problema é ali ou na precisao que está aparecendo “variável não estática precisao não pode ser referenciada a partir de um contexto estático”
public class Raiz {
// O programa √x usando o método de Newton.
public double mod(double valor) {
if(valor < 0)
valor = valor* -1;
return valor;
}
static double raizQuadrada(double a, double epsilon) {
double ChuteInicial;
double ChuteMelhor;
double valor;
double precisao;
ChuteInicial = a/2; // Primeira interação para se aproximar da raiz quadrada.
do {
valor= ChuteInicial;
ChuteInicial = 1/2 * (valor + a/valor);
ChuteMelhor = 1/2 * (ChuteInicial+a/ChuteInicial);
} while ( mod( valor - ChuteInicial) > precisao);
return -1;
}
/* Teste do Programa*/
public static void main(String[] args) {
double valor = 63;
double precisao = 0.001;
System.out.println("Raiz de : "+valor+" = "+raizQuadrada(valor, precisao));
}
}
Esse método tem que ser static
pra vc poder acessa-lo do método raizQuadrada
Outra coisa, precisao
é epsilon
. Não precisa da variável precisao
, use epsilon
no lugar
Você entendeu e está no caminho certo. Só precisa fazer alguns ajustes:
-
Só precisa de 2 variáveis dentro de
raizQuadrada
,double chuteAtual
edouble ultimoChute
. -
chuteAtual
pode começar sem inicializar, ele vai ser inicializado dentro do laço; -
ultimoChute
pode começar coma/2
; -
Só precisa melhorar o chute 1 vez dentro do laço:
do { ultimoChute = chuteAtual; chuteAtual = 0.5 * (? + ? / ?) } while (abs(chuteAtual - ultimoChute) >= epsilon);
-
O retorno do método é o último chute calculado (
chuteAtual
)
Muito obrigado, Ivbarbosa.
Vou fazer os testes aqui.
Já estou entendendo melhor como funciona esse método de Newton.
Na sua primeira sugestão não posso mudar, pq, segundo o arquivo que postei, diz:
Seu método não pode mudar a seguinte assinatura: static double raizQuadrada(double a, double epsilon).
a é minha raiz
epsilon é minha precisão
E o compilador java está dando “Variável ultimoChute= chuteAtual; não foi inicializada”.
Ai fico assim:
public class Raiz {
static double mod(double a) {
if (a < 0) {
a = a * -1;
}
return a;
}
static double raizQuadrada(double a, double epsilon) {
double chuteAtual;
double ultimoChute;
ultimoChute = a / 2; // Primeira interação para se aproximar da raiz quadrada.
do {
ultimoChute = chuteAtual;
chuteAtual = 1 / 2 * (ultimoChute + a / ultimoChute);
} while (mod(chuteAtual - ultimoChute) >= epsilon);
return chuteAtual;
}
}
//Teste do Programa
public static void main(String[] args) {
double a = 63;
double epsilon = 0.001;
System.out.println * * ("Raiz de : " + a + " = " + raizQuadrada(a, epsilon));
}
Dá uma formatada nesse código aí por favor kkkkk
Dá para entender melhor ?
cara, pra formatar vc tem que selecionar o código todo e apertar no botão </>
troca isso por chuteAtual = a / 2
. Eu falei errado, perdão
Ivbarbosa consegui, muito obrigado mesmo.
Depois deu outro erro de NaN, parecia que na minha divisão 1/2 o java tava devolvendo um número inteiro q era 0 e por isso não completava meu cálculo, foi ai q coloquei o 0.5 que vc sugeriu em cima e deu certo.
Agradeço sua paciência.
Espero aprender mais e conseguir ajudar as pessoas como vc.