-> 2. calcolare epsilon
Epsilon serve per calcolare il grado di precisione, non è altro che 10^-n. Se ho una sommatoria che crea questi risultati parziali:
p1 = 5.61346
p2 = 5.62953
p3 = 5.61534
p4 = 5.61275
p5 = 5.61187
(...)
è chiaro (dal momento che la serie è convergente) che il numero cercato sarà del tipo
5.61*******
dunque se cerchi una precisione pari a due cifre decimali basta che il modulo della differenza di due risultati parziali (nell'esempio |p4-p3|=0.00259) sia minore di 0.01 = 10^-2.
Qui non sono d'accordo con il tuo professore: il modulo della differenza deve essere fatto su due risultati parziali e non su due elementi della sommatoria.
-> 3 calcolo il primo e il secondo elemento della serie
primo elemento = (-1)^0*(4/(2*0+1))
secondo elemento = (-1)^1*(4/(2*1+1))
-> 4 imposto m=2
m rapppresenta l'indice del prossimo termine. Avendo calcolato i termini per n = 0 e n = 1 l'indice del prossimo termine sarà n = 2.
-> 5
Poi finchè non si raggiunge il grado di precisione voluto (finchè il modulo della differenza di due sommatorie parziali non è minore di epsilon) si calcola il prossimo termine e lo si usa per calcolare la nuova sommatoria parziale.
Questa è una possibile implementazione. Non tiene conto della lettura di n è probabilmente non segue le convenzioni del codice adottate dal tuo prof
codice:
class PiGreco {
public static void main(String[] args) {
System.out.println(piGreco(4));
}
private static double piGreco(int n) {
double epsilon,nElemento,nMenoUnoElemento;
double piGreco,piGrecoPrecedente;
int m;
// 2. calcolare epsilon
// 2.1 inizializzo epsilon = 0.1
epsilon = 0.1;
// 2.2 per n volte epsilon=epsilon/10
for(int i = 0; i < n; i++) {
epsilon /= 10;
}
// 3 calcolo il primo e il secondo elemento della serie
nMenoUnoElemento = 4.0; // (-1)^0*(4/(2*0+1))
nElemento = -4.0/3.0; // (-1)^1*(4/(2*1+1))
// 4 imposto m=2
m = 2;
piGrecoPrecedente = nMenoUnoElemento;
piGreco = nMenoUnoElemento + nElemento;
// finchè |piGreco-piGrecoPrecedente| < epsilon
while (!(Math.abs(piGreco-piGrecoPrecedente) < epsilon)) {
piGrecoPrecedente = piGreco;
// 5.1 il valore del n-1 elemento della successione=
// il valore del n elemento della successione
nMenoUnoElemento = nElemento;
// 5.2 calcolo il nuovo valore del m elemento della successione
nElemento = Math.pow(-1,m)*(4.0/(2.0*m+1));
piGreco += nElemento;
// 5.3 incremento m
m++;
}
// 6 stampo il risultato
return piGreco;
}
}
Attenzione che se testi il programma per n > 7 sono già necessari molti conti (e tempo)...