Il Forum di Orebla.it

Benvenuto nella community di Orebla.it
Oggi è dom 16 feb, 2020 8:56 pm

Tutti gli orari sono UTC + 1 ora




Apri un nuovo argomento Rispondi all’argomento  [ 8 messaggi ] 
Autore Messaggio
Messaggio da leggereInviato: lun 13 ago, 2007 9:01 am 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: mar 28 dic, 2004 6:54 pm
Messaggi: 300
Località: Pisa
Eccovi uno script in Perl che consente il calcolo della costante matematica PI con un grado di precisione arbitraria decisa dall'utente (attenzione che un numero di passi maggiore di 22 rallenta in modo considerevole il sistema e può potenzialmente esaurire le sue risorse, dato che la complessità dell'algoritmo aumenta in modo esponenziale all'aumentare dei passi da compiere).

Il calcolo della costante numerica irrazionale viene effettuato sfruttando uno stratagemma matematico

Immagine

L'integrale viene calcolato approssimativamente con il metodo dei rettangoli. Codice:

Codice:
#!/usr/bin/perl

# Algoritmo per il calcolo approssimato di pi greco attraverso l'approssimazione numerica
# dell'integrale: 4*int [0:1] (1/(1+x²))

@f[100],@a[100],@A[100];
$a1=$A1=$x=0;

print "\nAttenzione: Maggiore sarà il numero di passi di approssimazione, maggiore sarà il tempo\n";
print "che il calcolatore impiegherà a calcolare pi!\n\n";
print "Quanti passi di approssimazione devo effetturare? ";
$steps = <STDIN>;

print "Attendere prego...\n";

if ($steps<1)  {
     print "Numero di passi non valido\n";
     exit(-1);
}

$base = 1/(2**($steps-1));
$f[0] = 1;

for ($i=1; $i<=(2**($steps-1)); $i++) {
     $x += $base;
     $f[$i] = 1/(1+$x*$x);
     $a[$i] = $base*$f[$i];
     $A[$i] = $base*$f[$i-1];
}

for ($i=1; $i<=(2**($steps-1)); $i++) {
     $A1 += $A[$i];
     $a1 += $a[$i];
}

$pi = ($A1+$a1)*2;

print "Approssimazione di pi: ",$pi,"\n";


Top
 Profilo  
 
Messaggio da leggereInviato: lun 13 ago, 2007 6:16 pm 
Non connesso
Amministratore
Amministratore
Avatar utente

Iscritto il: lun 27 dic, 2004 10:32 am
Messaggi: 2614
Località: Ferrara
Cavolo questo veramente per me è assai complicato... Io e la matematica abbiamo sempre litigato...

_________________
I'm so happy because today
I've found my friends ...
They're in my head

[NIRVANA - LITHIUM]
Il Blog del disperato: http://blog.orebla.it


Top
 Profilo  
 
Messaggio da leggereInviato: mar 14 ago, 2007 4:18 pm 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: mar 28 dic, 2004 6:54 pm
Messaggi: 300
Località: Pisa
Beh a parte lo stratagemma matematico l'algoritmo in sé non è molto complesso matematicamente...si tratta semplicemente di suddividere un intervallo in tanti rettangoli, e calcolare approssimativamente l'area sotto la curva (che corrisponde al pi greco) come somma delle aree di questi rettangoli. Maggiore sarà il numero di parti in cui è diviso l'intervallo, maggiore sarà il numero di rettangoli e quindi sarà maggiore anche la precisione del calcolo, ma anche il tempo impiegato per effettuarlo. Già uno step pari a 25 divide l'intervallo [0,1] in 2^24 parti, ovvero oltre 16 milioni di rettangoli per eccesso e 16 milioni per difetto. Ciò equivale ad allocare memoria per due array che complessivamente occuperanno oltre 32 MB in memoria, ed effettuare oltre 32 milioni di moltiplicazioni e oltre 16 milioni di somme, un carico non indifferente per memoria e CPU (ma che consente il calcolo di pi greco con una precisione fino alla 20° cifra decimale).

Dopo delle richieste su altri forum, ho preparato anche una versione del programma in C:

Codice:
// Algoritmo per il calcolo approssimato di pi greco attraverso l'approssimazione numerica
// dell'integrale: 3*int [0:1] (1/(1+x²))

#include <stdio.h>
#include <stdlib.h>

int my_pow(int steps);

main()  {
        double *f,*a,*A;
        double base,pi,a1=0,A1=0,x=0;
        int i,steps;

        printf( "\nAttenzione: Maggiore sarà il numero di passi di approssimazione, maggiore sarà il tempo\n"
                "che il calcolatore impiegherà a calcolare pi!\n\n");

        printf( "Quanti passi di approssimazione devo effetturare? (1-100) ");
        scanf("%d",&steps);

        if ((steps<1) || (steps>100))  {
                printf( "Numero di passi non valido\n");
                return -1;
        }

        f = (double*) malloc (my_pow(steps-1)*sizeof(double));
        a = (double*) malloc (my_pow(steps-1)*sizeof(double));
        A = (double*) malloc (my_pow(steps-1)*sizeof(double));

        base = (float) 1/(my_pow(steps-1));
        f[0] = 1;

        for (i=1; i<=my_pow(steps-1); i++)  {
                x += base;
                f[i] = 1/(1+x*x);
                a[i] = base*f[i];
                A[i] = base*f[i-1];
        }

        for (i=1; i<=my_pow(steps-1); i++) {
                A1 += A[i];
                a1 += a[i];
        }

        pi = (A1+a1)*2;

        printf("Approssimazione di pi: %.40lf\n",pi);
}

int my_pow(int steps)  {
        int i,res=1;

        for (i=0; i<steps; i++)
                res*=2;

        return res;
}


e in Java:

Codice:
import java.io.*;
import java.lang.*;

public class Pi  {
        public static void main (String args[])  {
                float steps=0;
                float a1=0;
                float A1=0;
                float x=0;

                System.out.print ("Numero di passi da effettuare: ");

                try  {
                        DataInputStream in = new DataInputStream (System.in);
                        steps = Float.valueOf(in.readLine()).floatValue();
                }

                catch (Exception e)  {}

                if (steps<1)  {
                        System.out.println ("Numero di steps non valido");
                        System.exit(1);
                }

                float f[] = new float[ (int) Math.pow(2.0,steps)];
                float a[] = new float[ (int) Math.pow(2.0,steps)];
                float A[] = new float[ (int) Math.pow(2.0,steps)];
                float base = 1/( (float) Math.pow(2.0,steps-1));
                f[0] = 1;

                for (int i=1; i<=Math.pow(2.0,steps-1); i++)  {
                        x += base;
                        f[i] = 1/(1+(x*x));
                        a[i] = base*f[i];
                        A[i] = base*f[i-1];
                }

                for (int i=1; i<=Math.pow(2.0,steps-1); i++)  {
                        A1 += A[i];
                        a1 += a[i];
                }

                float pi = (A1+a1)*2;
                System.out.println ("Valore approssimato di PI: " + pi + "\n");
        }
}

_________________
Immagine
Immagine


Top
 Profilo  
 
Messaggio da leggereInviato: mar 04 set, 2007 6:45 pm 
Non connesso
SuperStar
SuperStar
Avatar utente

Iscritto il: sab 30 apr, 2005 2:50 pm
Messaggi: 682
Località: vicino a casa tua...
pemettimi una domanda....quante volte ci hai pensato a tutti questi ragionamenti e a farlo?

_________________
l'ho sempre detto e lo dirò sempre......prima o poi dobbiamo morire! :D
le donne sono come il vento...all'improvviso cambiano e non si sa perchè
<a target="_blank" href="http://www.investimenti-sicuri.net/">


Top
 Profilo  
 
Messaggio da leggereInviato: mar 04 set, 2007 7:10 pm 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: ven 12 mag, 2006 8:47 pm
Messaggi: 279
Località: Almese (TO)
Lo sò è molto, molto difficile far quadrare il cerchio...

Ciao

_________________
questa sera l'aria è fresca, potrebbero venirmi dei pensieri.

Immagine


Top
 Profilo  
 
Messaggio da leggereInviato: mar 04 set, 2007 8:51 pm 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: mar 28 dic, 2004 6:54 pm
Messaggi: 300
Località: Pisa
Cita:
pemettimi una domanda....quante volte ci hai pensato a tutti questi ragionamenti e a farlo?


Mi è capitato così mentre calcolavo un integrale al quinto anno di liceo...avevo notato che effettivamente era possibile ottenere PI, suoi multipli o sottomultipli come risultato dell'integrale di una funzione calcolato tra due numeri razionali. La cosa mi aveva colpito abbastanza...il poter ottenere un numero irrazionale da un integrale di una funzione razionale calcolata tra due numeri razionali, come 1/(1+x²) (la cui primitiva è l'arcotangente). Mi sono ricordato del metodo a cui avevamo accennato appena avevamo cominciato a parlare degli integrali definiti, il metodo del calcolo approssimato tramite rettangoli, e l'ho applicato nell'algoritmo.

_________________
Immagine
Immagine


Top
 Profilo  
 
Messaggio da leggereInviato: mer 05 set, 2007 11:08 am 
Non connesso
SuperStar
SuperStar
Avatar utente

Iscritto il: sab 30 apr, 2005 2:50 pm
Messaggi: 682
Località: vicino a casa tua...
compilmenti comunque!

l'hai fatto tutto da solo oppure ti sei fatto aiutare da qualcuno?

sei anche bravo a farti queste domande e se c'è qualche altro metodo

_________________
l'ho sempre detto e lo dirò sempre......prima o poi dobbiamo morire! :D
le donne sono come il vento...all'improvviso cambiano e non si sa perchè
<a target="_blank" href="http://www.investimenti-sicuri.net/">


Top
 Profilo  
 
Messaggio da leggereInviato: mer 05 set, 2007 3:51 pm 
Non connesso
super-guru
super-guru
Avatar utente

Iscritto il: mar 28 dic, 2004 6:54 pm
Messaggi: 300
Località: Pisa
Grazie :wink:
Da solo da solo, tanto si trattava solo di tradurre il calcolo dell'integrale con il metodo approssimato dei rettangoli che avevo in mente in un linguaggio di programmazione...il codice in sé per sé non è complesso da scrivere, sono una decina di righe, il difficile era trovare un integrale che potesse dare con un paio di passaggi matematici PI (ovviamente un integrale che non avesse altri numeri irrazionali di mezzo) e tradurre un algoritmo manuale come quello dei rettangoli in un algoritmo automatico (ho provato anche con quello dei trapezi, che è più preciso a parità di passi compiuti, ma i calcoli si complicavano notevolmente, con il calcolo di rette secanti e tangenti alla curva).

_________________
Immagine
Immagine


Top
 Profilo  
 
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Rispondi all’argomento  [ 8 messaggi ] 

Tutti gli orari sono UTC + 1 ora


{ RELATED_TOPICS }
 Argomenti   Autore   Risposte   Visite    Ultimo messaggio 
Non ci sono nuovi messaggi in questo argomento. [Perl / C] Ip2Host

BlackLight

0

2274

sab 02 giu, 2007 2:39 pm

BlackLight Vedi ultimi messaggi

Non ci sono nuovi messaggi in questo argomento. [Perl] Telnet bruter

BlackLight

2

2276

dom 17 feb, 2008 9:02 pm

BlackLight Vedi ultimi messaggi

 


Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Cerca per:
Vai a:  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduzione Italiana phpBBItalia.net basata su phpBB.it 2010
phpBB SEO