(RESOLVIDO) Método de Newton

13 respostas
java
N

Alguém poderia me ajudar estou tentando criar um método que calcule a raiz quadrada.

kj

13 Respostas

lvbarbosa

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!

N

Obrigado Ivbarbosa, estou tentando realizar aqui.

N

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));
}
}
lvbarbosa

Esse método tem que ser static pra vc poder acessa-lo do método raizQuadrada

lvbarbosa

Outra coisa, precisao é epsilon. Não precisa da variável precisao, use epsilon no lugar

lvbarbosa

Você entendeu e está no caminho certo. Só precisa fazer alguns ajustes:

  1. Só precisa de 2 variáveis dentro de raizQuadrada, double chuteAtual e double ultimoChute.

  2. chuteAtual pode começar sem inicializar, ele vai ser inicializado dentro do laço;

  3. ultimoChute pode começar com a/2;

  4. Só precisa melhorar o chute 1 vez dentro do laço:

    do {
         ultimoChute = chuteAtual;
         chuteAtual = 0.5 * (? + ? / ?)
    } while (abs(chuteAtual - ultimoChute) >= epsilon);
    
  5. O retorno do método é o último chute calculado (chuteAtual)

N

Muito obrigado, Ivbarbosa.

Vou fazer os testes aqui.

N

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));
}
lvbarbosa

Dá uma formatada nesse código aí por favor kkkkk

N

Dá para entender melhor ?

rodriguesabner

cara, pra formatar vc tem que selecionar o código todo e apertar no botão </>

image

lvbarbosa

troca isso por chuteAtual = a / 2. Eu falei errado, perdão

N

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.

Criado 17 de abril de 2020
Ultima resposta 18 de abr. de 2020
Respostas 13
Participantes 3