(RESOLVIDO) Método de Newton

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

kj

1 curtida

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!

3 curtidas

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:

  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)

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 </>

image

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.