Não sei se já foi aberto um tópico sobre isto ou relacionado com isto, mas aqui vai:
Sendo :
t0 = n
ti+1 = 1/2 * (ti + n/ti)
Como eu posso calcular t1, t2, t3… ?
Isto num programa java.
Agradecia uma resposta rápida, obrigado
Não sei se já foi aberto um tópico sobre isto ou relacionado com isto, mas aqui vai:
Sendo :
t0 = n
ti+1 = 1/2 * (ti + n/ti)
Como eu posso calcular t1, t2, t3… ?
Isto num programa java.
Agradecia uma resposta rápida, obrigado
Vc já tem a fórmula, basta escrevê-la em forma de código. Pelo menos faça uma tentativa antes de obter a resposta, se não vai ser dificil de alguém ajudar.
O problema é:
Considere a sucessão definida por: t0=n, ti+1=1/2 * (ti+n/ti). Calcular os elementos da sucessão t0, t1, t2… enquanto |ti -n/ti |> epsilon*ti . Parar quando se encontra o primeiro elemento que não satisfaz esta condição.
Está aqui o código que eu andei a tentar formar. Quando eu o executo, não dá como eu quero. Já tentei entender porquê, mas não consigo :\
public class Exercicio {
public static void main (String [] args) {
double n = 10;
double epsilon = 0.01;
double t0 = n;
int contador1 = 0;
for (double ti = t0; ((Math.abs (ti - n/ti)) > (epsilon * ti)); ti = (((1/2) * (ti + n/ti)) )) {
for (int i = 0; i <= ti; i++)
System.out.println ("O elemento " + i + " da sucessao ti e " + ti + “.”);
}
}
}
Não há ninguém que me possa ajudar?
Pelo que vi seu código está correto. O que está acontecendo diferente do que vc esperava?
Eu resolvi à mão e, por exemplo, o t1 = 5.
No programa, esse ciclo vai de t0 a t9, e é sempre 9 o resultado. De certeza que estou a fazer alguma coisa mal, não estou a ver é o quê… Alguém com mais experiência no java percebe de certeza o que está errado
Arrumei um pouco seu código. Tinha um for dentro do outro que acho que não servia pra nada, só complicava:
public class Recursiva {
public static void main(String[] args) {
double n = 5;
double epsilon = 0.01;
double t0 = n;
int i = 0;
for (double ti = t0; ((Math.abs(ti - n / ti)) > (epsilon * ti)); ti = ((double) 1 / 2) * (ti + n / ti)) {
System.out.println("O elemento " + i + " da sucessao ti e " + ti + ".");
++i;
}
}
}
Para n= 5 o resultado foi:
O elemento 0 da sucessao ti e 5.0.
O elemento 1 da sucessao ti e 3.0.
O elemento 2 da sucessao ti e 2.3333333333333335.
Além disse, repare que fiz um cast na divisão 1/2. Pq eu fiz isso? Teste o seguinte programa:
public class Recursiva {
public static void main(String[] args) {
// double n = 5;
// double epsilon = 0.01;
// double t0 = n;
// int i = 0;
// for (double ti = t0; ((Math.abs(ti - n / ti)) > (epsilon * ti)); ti = ((double) 1 / 2) * (ti + n / ti)) {
// System.out.println("O elemento " + i + " da sucessao ti e " + ti + ".");
// ++i;
// }
System.out.println(1 / 2);
System.out.println((double) 1 / 2);
}
}
vc vai ver que ele printa 0 e depois 0.5. Pq isso? pq quando vc divide um inteiro por outro, ele trunca o valor para um inteiro. Ou seja, ele só pega o resultado inteiro da divisão e ignora o resto. Por isso 1/2 deu 0. Já quando eu uso o (double) 1, aí ele considera a parte decimal do número.
Não pude deixar de notar o nome de sua classe: Recursiva. No caso de vc querer fazer recursão, o código poderia ser algo como:
[code]public class Recursiva {
private static final double epsilon = 0.01;
private static final double n = 5;
public static void main(String[] args) {
recursiva(0, n);
}
public static void recursiva(int i, double ti) {
if (Math.abs(ti - n / ti) > (epsilon * ti)) {
System.out.println("O elemento " + i + " da sucessao ti e " + ti + ".");
recursiva(++i, ((double) 1 / 2) * (ti + n / ti));
}
}
}
[/code]
[]s
Era mesmo isso que eu queria, acho que o que estava mal era o double que não pus antes de 1/2. Se tivesse posto 0.5 já não tinha esse problema.
Muito obrigada