Approssimazione del pigreco
Buon giorno a tutti,
Ho notato che utilizzando l'algoritmo che approssima il pigreco, raddoppiando il numero di lati dei poligoni regolari inscritti a partire(ad esempio) dall' esagono; si ottiene dopo $20$ cicli(ad esempio), che il perimetro del poligono(20-esimo) di raggio(1/2 ) è maggiore di $\pi$.
Possibile che non sia ben programmato l'algoritmo?(tra l'altro preso da un libro)
Ho notato che utilizzando l'algoritmo che approssima il pigreco, raddoppiando il numero di lati dei poligoni regolari inscritti a partire(ad esempio) dall' esagono; si ottiene dopo $20$ cicli(ad esempio), che il perimetro del poligono(20-esimo) di raggio(1/2 ) è maggiore di $\pi$.

Possibile che non sia ben programmato l'algoritmo?(tra l'altro preso da un libro)
Risposte
Scrivi l'algoritmo
"kobeilprofeta":
Scrivi l'algoritmo
L' ho semplicemente ritrascritto in java, il programma era in pascal:
PoligoniInscrittiLIBRO(20) = 3.141592653701082 > 3.141592653589793 static double PoligoniInscrittiLIBRO(int n) { double N; // numero lati poligono regolare(esagono) N = 6; double P = 3; //Perimetro poligono di lato (L_a = 1/2 e raggio, r = 1/2) for (int i = 1; i <= n ; i++) { P = N * (Math.sqrt(1 + P/N) - Math.sqrt(1 - P/N)); N *= 2; } System.out.println("Il perimetro del poligono inscritto(r = 1/2) di " + N + " lati è di: " + P); System.out.println("Il valore di pigreco atteso è: " + Math.PI); return P; }
Posso fare l' ipotesi:
Il perimetro del poligono inscritto non è maggiore della circonferenza ma il valore riportato dal programma è approssimato per eccesso, ad esempio a causa per di una non corretta programmazione.
La formula usata è corretta. Penso che dopo 20 iterazioni, con oltre un milione di lati, gli arrotondamenti possano essere la causa del risultato anomalo, che anche io ho riprodotto.
Ciao,
Andrea
Ciao,
Andrea
Ciao @marmi, e grazie per il tuo intervento; anche io l' ho considerata un' ipotesi quella della non esatta precisione del calcolatore. D' altra parte ho un dubbio: dati i due lati ottenuti dal raddoppio del lato del precedente poligono, essi formano tra loro un angolo $x$(in radianti) $x = \pi$ al tendere di $n$ ad infinito:
$ x = lim n->\infty [\pi(1 - 2/n)] = \pi$
Per cui il segmento piatto somma dei due lati è tangente alla circonferenza per $n -> \infty$ e non è più interno alla circonferenza?
$ x = lim n->\infty [\pi(1 - 2/n)] = \pi$
Per cui il segmento piatto somma dei due lati è tangente alla circonferenza per $n -> \infty$ e non è più interno alla circonferenza?
Direi che l'angolo tende a $pi$ , ma $ AA n$ il poligono è inscritto. Quindi $ AA n$ l'approssimazione è per difetto.
Ciao,
Marmi
Ciao,
Marmi
Immagino effettivamente che le cose stiano come dici, ma non riesco a digerire che un calcolatore produca un errore cosi' grave, sicuramente si può attutire il margine d' errore, ma, non so come...
In effetti un double dovrebbe avere circa 15 cifre significative, mentre qui l'errore si presenta all'undicesima (se non ho sbagliato a contarle).
Per concludere...è inutile dire che la seguente formula:
$\2pi = \sqrt(2-\sqrt(2+\sqrt(2+\sqrt(2+...))))*4*2^i$
dove $i$ in questo caso $3$, cioè: $(\sqrt(2+\sqrt(2+\sqrt(2+...))))$, se tende ad infinito il risultato è esattamente $\2pi$?
$\2pi = \sqrt(2-\sqrt(2+\sqrt(2+\sqrt(2+...))))*4*2^i$
dove $i$ in questo caso $3$, cioè: $(\sqrt(2+\sqrt(2+\sqrt(2+...))))$, se tende ad infinito il risultato è esattamente $\2pi$?
Credo di aver capito l'inghippo. Si tratta solo di arrotondamento del calcolo. Come dice Rigel il problema dovrebbe presentarsi più avanti. Però con l'espressione utilizzata si calcola la differenza fra due valori prossimi fra loro; in questo caso la precisione si riduce al numero di cifre significative della differenza, che sono meno della quindicina supportate dall'elaboratore.
'Razionalizzando' l'espressione, usando cioè:
$ N leftarrow (2N)/(sqrt(1+P/N)+sqrt(1-P/N)) $
[EC] Il risultato dell'espressione deve essere assegnato alla variabile $ P $ e non a $ N $ come, erroneamente, indicato. [strike]Lo stesso dicasi per il numeratore dell'espressione[/strike]. Grazie a curie88 per la segnalazione.
l'apparente anomalia scompare.
Ciao
'Razionalizzando' l'espressione, usando cioè:
$ N leftarrow (2N)/(sqrt(1+P/N)+sqrt(1-P/N)) $
[EC] Il risultato dell'espressione deve essere assegnato alla variabile $ P $ e non a $ N $ come, erroneamente, indicato. [strike]Lo stesso dicasi per il numeratore dell'espressione[/strike]. Grazie a curie88 per la segnalazione.
l'apparente anomalia scompare.
Ciao
Ciao orsoulx, grazie per la verifica, ma non mi trovo con la razionalizzazione...
"curie88":
grazie per la verifica, ma non mi trovo con la razionalizzazione...
Prego! Sono io a ringraziarti per aver postato un problema interessante.
Quanto alla 'razionalizzazione'. Se il problema è l' $ N $ a sinistra, quello è un errore mio: il valore che si trova in ciascuna iterazione è naturalmente il nuovo $ P $, provvederò a correggere.
Se, invece, è il passaggio algebrico:
$ N cdot ( \sqrt (1+P/N)- \sqrt(1-P/N)) = \frac {2N} { \sqrt (1+P/N)+ \sqrt(1-P/N)} $
basta moltiplicare e dividere la parentesi per la somma dei due radicali ed utilizzare il prodotto notevole $ (a-b)(a+b)=a^2-b^2 $.
Ciao
Ho verificato ed effettivamente le cose stanno come dici, l' anomalia scompare nei limiti delle cifre significative.
Bisogna solo sostituire quell' $N$ a numeratore con $P$:
$P = 2 * P / ((\sqrt(1 + P/N) + \sqrt(1 - P/N)))$
Ciao.
Bisogna solo sostituire quell' $N$ a numeratore con $P$:
$P = 2 * P / ((\sqrt(1 + P/N) + \sqrt(1 - P/N)))$
Ciao.
[strike]Dici bene! Se avevo scambiato il nome delle variabili riportando in formula la relazione iterativa del foglio di calcolo, coerentemente, la muccata doveva per forza essere doppia (ma dopo due mesi...)[/strike]
Rettifico, questa volta hai sbagliato tu: al numeratore dell'espressione deve esserci $ N $ e non $ P $, come compare anche nel programma che hai scritto.
Grazie ancora, vado [strike]a completare la correzione[/strike] ad eliminare la seconda correzione.
Ciao
Rettifico, questa volta hai sbagliato tu: al numeratore dell'espressione deve esserci $ N $ e non $ P $, come compare anche nel programma che hai scritto.
Grazie ancora, vado [strike]a completare la correzione[/strike] ad eliminare la seconda correzione.
Ciao
Si è vero(è passato tempo), solo ora ho avuto tempo, pazienza e voglia di verificare il calcolo, comunque ottima idea quella della razionalizzazione; il calcolatore non si inganna in questo modo...anche se non ho ancora ben chiaro il perché...
Ho provato con P funziona...
Posto i calcoli:
$a = sqrt(1+P/N)$
$b = sqrt(1-P/N)$
$a^2 – b^2 = 1 + P/N – (1 – P/N)$
$a^2 – b^2 = 2P/N$
$P = (N * 2P/N) / (sqrt(1+P/N)+sqrt(1-P/N))$
$N$ si semplifica...(invece probabilmente tu hai semplificato $P$ ambo i membri, che comunque non è sbagliato.)
$P = (2P) / (sqrt(1+p/n)+sqrt(1-p/n))$
Ciao
Rettifico, questa volta hai sbagliato tu: al numeratore dell'espressione deve esserci N e non P
Ho provato con P funziona...
Posto i calcoli:
$a = sqrt(1+P/N)$
$b = sqrt(1-P/N)$
$a^2 – b^2 = 1 + P/N – (1 – P/N)$
$a^2 – b^2 = 2P/N$
$P = (N * 2P/N) / (sqrt(1+P/N)+sqrt(1-P/N))$
$N$ si semplifica...(invece probabilmente tu hai semplificato $P$ ambo i membri, che comunque non è sbagliato.)
$P = (2P) / (sqrt(1+p/n)+sqrt(1-p/n))$
Ciao