Raiz Cubica

15 respostas
claudneto

Pessoal,

Eu preciso fazer isso:

[img]http://img180.imageshack.us/img180/2589/raizcubica.jpg[/img]

Eu já fiz isso:

public double raizCubica (double x) {
    
    int a0 = 0;
    
    //Laço para pegar o valor de a0
    while ((a0 * a0 * a0) <= x) {
      a0++;
    }
    
    double b0 = a0 + 1;
    
    double an = a0;
    
    double bn = b0;
    
    double rn = ((an + bn) / 2.0);
    
    while (absoluto(((rn * rn * rn) - x)) > epsilon) {
      if ((rn * rn * rn) <= x) {
        
        rn = ((an + bn) / 2.0);
        an = rn;

      }
      else {
        
        rn = ((an + bn) / 2.0);
        bn = rn;

      }
    }
    
    return rn;
  }

Porém, no 2º while, ele entra em loop! Eu usei o debugger pra saber e ele não sai do 2º while!

Alguém consegue ver algum erro?

15 Respostas

pvrsouza

Não consegui enxergar nada no seu código! Vou ficar de olho nas respostas pois fiquei curioso.

Mas não seria melhor calcular a raiz cúbica de um número elevando ele a potencia de 1/3?

Abraços!

claudneto

Seria MUITO mais fácil, porém não pode usar o método Math.pow(double x, double y)

:cry:

pvrsouza

Vixe! Então agora é só esperar para alguem ajudar nesse erro. Confesso que eu não estou enxergando!

Poneis123

Nesse seu segundo While, o que significa absoluto() e epsilon??? absoluto() é um método q vc criou? tem o fonte ai? epsilon seria uma variavel? com q tipo e valor?

Po dei risada desse epsilon, vc quis escrever Y ? rsrs

G

Poneis123:
Nesse seu segundo While, o que significa absoluto() e epsilon??? absoluto() é um método q vc criou? tem o fonte ai? epsilon seria uma variavel? com q tipo e valor?

Po dei risada desse epsilon, vc quis escrever Y ? rsrs


Eu ri com vc perguntando se era pra ser um Y, hauhauha!!!

Épsilon (Ε ε) é a quinta letra do alfabeto grego e tem um valor numérico de 5. (Ta no wikipedia)

sergiotaborda

claudneto:

Alguém consegue ver algum erro?

Epsilon não foi definido, o que significa que provavelmente será zero. O absoluto da diferença nunca irá se aproximar de zero para o caso geral (apenas em casos especiais).

Outra opção é o epsilon ter sido setado muito baixo ( mais de 15 casas decimais) ai o método demora muito e parece ter entrado em loop infinito,mas na realidade ele não está conseguindo convergir. Não use epslion menor que 10E-15

Poneis123

gr_marco:
Poneis123:
Nesse seu segundo While, o que significa absoluto() e epsilon??? absoluto() é um método q vc criou? tem o fonte ai? epsilon seria uma variavel? com q tipo e valor?

Po dei risada desse epsilon, vc quis escrever Y ? rsrs


Eu ri com vc perguntando se era pra ser um Y, hauhauha!!!

Épsilon (Ε ε) é a quinta letra do alfabeto grego e tem um valor numérico de 5. (Ta no wikipedia)

AeiuAEHuiAHEIUHAEuiaehiHAEuihae karaka q vergonha. Eu mó ignorante e rindo achando q o cara tava viajando kkkkkkkk

E

Poneis123:
Nesse seu segundo While, o que significa absoluto() e epsilon??? absoluto() é um método q vc criou? tem o fonte ai? epsilon seria uma variavel? com q tipo e valor?

Po dei risada desse epsilon, vc quis escrever Y ? rsrs

As letras do alfabeto grego são: alfa, beta, gama, delta, épsilon, zeta… A letra épsilon é muito parecida com nossa letra E:

Ε - épsilon maiúsculo
ε - épsilon minúsculo.

A nossa letra “Y” tem o nome “ípsilon” ou “i grego”. Não confundir “ípsilon” com “épsilon”.

Em matemática, ε (épsilon) normalmente denota um valor bem pequeno. É muito usado em cálculo diferencial e cálculo numérico.

Poneis123

entanglement:
Poneis123:
Nesse seu segundo While, o que significa absoluto() e epsilon??? absoluto() é um método q vc criou? tem o fonte ai? epsilon seria uma variavel? com q tipo e valor?

Po dei risada desse epsilon, vc quis escrever Y ? rsrs

As letras do alfabeto grego são: alfa, beta, gama, delta, épsilon, zeta… A letra épsilon é muito parecida com nossa letra E:

Ε - épsilon maiúsculo
ε - épsilon minúsculo.

A nossa letra “Y” tem o nome “ípsilon” ou “i grego”. Não confundir “ípsilon” com “épsilon”.

Em matemática, ε (épsilon) normalmente denota um valor bem pequeno. É muito usado em cálculo diferencial e cálculo numérico.

Vlw num sabia =))
Ainda bem q eu não falei zuando… o q ia ter de gente me chamando de burro kkkkkk

E

Bom, é sempre bom reconhecer que não se sabe alguma coisa.

Você não é obrigado, por exemplo, a saber os nomes das letras do alfabeto hebraico (alef, bet, gimel, dalet etc.) ou do alfabeto árabe (alif, ba, ta, gim, ha etc.)
Mas como em matemática eventualmente você acaba aprendendo os nomes de algumas letras do alfabeto grego*, é bom anotar para ficar sabendo.

  • Acho que se você for algum estudioso da Bíblia, por exemplo, talvez saiba os nomes da primeira e da última letras do alfabeto grego, que são respectivamente alfa e ômega.
claudneto

epsilon é um atributo double que eu já havia criado…

E absoluto calcula o módulo de um valor…

Esqueci de dizer essas coisas! Hehehe…e o epsilon é definido no construtor da classe…

Porém eu estou usando epsilon = 0.001, pois foi o usado no exemplo que eu tenho.

T
while  ((a0 * a0 * a0) <= x) {  
       a0++;  
 }

O a0 está passando desse ponto com o valor uma unidade maior do que deveria.

while  (absoluto(((rn * rn * rn) - x)) > epsilon) {  
       rn = ((an + bn) / 2.0);  
       if ((rn * rn * rn) <= x) {             
    
         an = rn;  
   
       }  
       else {  
           
         bn = rn;  
   
       }  
     }

Dentro do While tem que fazer a nova atribuição ao rn antes da comparação, senão ele vai assumir um valor errado e não sair mesmo do laço.

Dê uma olhada se assim funciona.

Abraço

claudneto
Tiago Borghi:
while  ((a0 * a0 * a0) <= x) {  
       a0++;  
 }

O a0 está passando desse ponto com o valor uma unidade maior do que deveria.

while  (absoluto(((rn * rn * rn) - x)) > epsilon) {  
       rn = ((an + bn) / 2.0);  
       if ((rn * rn * rn) <= x) {             
    
         an = rn;  
   
       }  
       else {  
           
         bn = rn;  
   
       }  
     }

Dentro do While tem que fazer a nova atribuição ao rn antes da comparação, senão ele vai assumir um valor errado e não sair mesmo do laço.

Dê uma olhada se assim funciona.

Abraço

É isso mesmo!

O an eu coloquei valendo a0 - 1...ai ele fica certo!

Valeu!

E

Acho que você precisava de mais uma variável. Veja por que é que seu código não funcionava.

class RaizCubica {

 public double absoluto (double x) {
     if (x < 0) return -x;
     return x;
 }
 private double epsilon = 0.001;
 public  double raizCubica (double x) {  
       
     int b0 = 0;  
       
     //Laço para pegar o valor de a0  
     while ((b0 * b0 * b0) < x) {  
       b0++;  
     }  
       
     double a0 = b0 - 1;  
     double an = a0;  
     double bn = b0;  
     double rn = ((an + bn) / 2.0);  
     double p;

     while (absoluto (rn * rn * rn - x) > epsilon) {
         if ( (rn * rn * rn) < x ) {
             p = rn;
             rn = (bn + rn) / 2;
             an = p;
         } else {
             p = rn;
             rn = (an + rn) / 2;
             bn = p;
         }
         System.out.printf ("an = %10.7f, bn = %10.7f, rn = 

%10.7f, dif = %12.7f%n", 
             an, bn, rn, absoluto (rn * rn * rn - x));
     }
       
     return rn;  
   } 

   public static void main(String[] args) {
       RaizCubica rc = new RaizCubica();
       System.out.println (rc.raizCubica (32.3 * 32.3 * 32.3));
       System.out.println (rc.raizCubica (17 * 17 * 17));
       System.out.println (rc.raizCubica (0.77 * 0.77 * 0.77));
   }
}
peczenyj

absoluto = Math.abs ??

Criado 7 de abril de 2010
Ultima resposta 7 de abr. de 2010
Respostas 15
Participantes 8