Como resolver uma sucessão no Java?

7 respostas
B

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

7 Respostas

renzonuccitelli

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.

B

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 + .);

}
}
}

B

Não há ninguém que me possa ajudar?

renzonuccitelli

Pelo que vi seu código está correto. O que está acontecendo diferente do que vc esperava?

B

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

renzonuccitelli
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:
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));
		}
	}
}

[]s

B

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 :smiley:

Criado 4 de novembro de 2010
Ultima resposta 6 de nov. de 2010
Respostas 7
Participantes 2