domenica 22 marzo 2009

Esempio preliminare di integrale NON deterministico

(solo per gente veramente interessata alle tecniche di simulazione dinamica).

La tecnica chiamata "metodo montecarlo" è la tecnica più potente a nostra disposizione ed in realtà l'unica che abbiamo per analizzare problemi ad alta complessità. Per poter spiegare come la si può impiegare per calcolare l'integrale dell'esercizio precedente, assegno un esercizio preliminare.
Premesse:
a) Se una sfera di raggio 1 ha centro nell'origine, il volume della parte con x,y,z tutti positivi è (4pigreco/3)/8.
b) Ogni linguaggio di programmazione ha la funzione random(), o rand(), che estrae un numero random tra 0 ed 1.
c) Se estraggo random tre numeri x,y,z, ottengo un vettore a casaccio da qualche parte nel cubo (0,1)*(0,1)*(0,1).

L'esercizio consiste in questo: fai estrarre da un programma N vettori random x,y,z come appena descritto. Conta il numero M di quelli che hanno x*x+y*y+z*z < 1, e verifica che quando N è abbastanza grande il rapporto M/N è (approx) uguale a (4pigreco/3)/8.

4 commenti:

  1. In ottica ESAME, a che può servire 'sta roba? Stavo cominciando a pensare di trovare un sistema per valorizzare una competenza acquisita di questo tipo. In pratica, ad una persona potrei lasciare un po' di tempo (in ufficio mio) per provare a preparare uno o più programmi che risolvano dei problemi dinamici, ed analizzare gli eventuali files di dati. Probabilmente ogni tanto questa persona avrà bisogno di una spinta, ma questo succede anche a quasi tutti quelli che sostengono un orale "normale". AB

    RispondiElimina
  2. ma come si fa a estrarre un numero REALE a caso?la fnz rand() vale solo per gli interi...

    RispondiElimina
  3. devi porre:
    x=rand()/RAND_MAX;

    praticamente ti calcola un qualsiasi n reale e te lo divide per il max possibile (32 mila e qualcosa..)

    RispondiElimina
  4. PERICOLO!!!
    se il vostro compilatore non è MOLTO furbo, rand()/RAND_MAX = (intero minore)/(intero maggiore) = 0.
    La versione corretta è
    ( rand()*1. ) / RAND_MAX.
    AB

    RispondiElimina