Pessoal,
Eu preciso fazer isso:

Eu já fiz isso:
[code]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;
}[/code]
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?
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!
Seria MUITO mais fácil, porém não pode usar o método Math.pow(double x, double y)

Vixe! Então agora é só esperar para alguem ajudar nesse erro. Confesso que eu não estou enxergando!
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
[quote=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[/quote]
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)
[quote=claudneto]
Alguém consegue ver algum erro?[/quote]
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
[quote=gr_marco][quote=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[/quote]
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)[/quote]
AeiuAEHuiAHEIUHAEuiaehiHAEuihae karaka q vergonha. Eu mó ignorante e rindo achando q o cara tava viajando kkkkkkkk
[quote=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[/quote]
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.
[quote=entanglement][quote=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[/quote]
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.[/quote]
Vlw num sabia =))
Ainda bem q eu não falei zuando… o q ia ter de gente me chamando de burro kkkkkk
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.
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.
while ((a0 * a0 * a0) <= x) {
a0++;
}
O a0 está passando desse ponto com o valor uma unidade maior do que deveria.
[code] while (absoluto(((rn * rn * rn) - x)) > epsilon) {
rn = ((an + bn) / 2.0);
if ((rn * rn * rn) <= x) {
an = rn;
}
else {
bn = rn;
}
}[/code]
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
[quote=Tiago Borghi] while ((a0 * a0 * a0) <= x) {
a0++;
}
O a0 está passando desse ponto com o valor uma unidade maior do que deveria.
[code] while (absoluto(((rn * rn * rn) - x)) > epsilon) {
rn = ((an + bn) / 2.0);
if ((rn * rn * rn) <= x) {
an = rn;
}
else {
bn = rn;
}
}[/code]
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[/quote]
É isso mesmo!
O an eu coloquei valendo a0 - 1…ai ele fica certo!
Valeu!
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));
}
}