Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017...2017/06/02 · Type: ‘twister’ Seed: 0...
Transcript of Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017...2017/06/02 · Type: ‘twister’ Seed: 0...
Scuola di Calcolo Scientifico con MATLAB (SCSM) 2017Palermo 24 - 28 Luglio 2017
L.2.1. Numeri Pseudocasuali
www.u4learn.it Arianna Pipitone
L.2.1. Numeri Pseudocasuali
Introduzione alla probabilità
MATLAB mette a disposizione degli utenti una serie di funzioni per la gestione dei numeri pseudocasuali che ci consentono di avvicinarci al mondo della probabilità in modo semplice ed intuitivo.
Nel dettaglio, in quanto segue mostreremo come sia possibile utilizzare le funzioni di MATLAB per simulare semplici esperimenti relativi al lancio di:
• monete
• dadi
L.2.1. Numeri Pseudocasuali
La legge dei grandi numeri
La legge dei grandi numeri, detta anche Teorema di Bernoulli, descrive il comportamento della media di una sequenza di n variabili casuali, indipendenti e caratterizzate dalla stessa distribuzione di probabilità (per esempio, n misure della stessa grandezza, n lanci della stessa monete, ecc…) al tendere ad infinito della numerosità della sequenza stessa (n).
L.2.1. Numeri Pseudocasuali
Testa o croce?
Vogliamo realizzare una funzione in MATLAB che ci consenta di simulare il processo di lancio di una moneta ed analizzarne l’esito
Per questo, ci viene in aiuto la funzione MATLAB rand
Il comando help permette di comprendere il comportamento di questa funzione.
>> help rand
Uniformly distributed pseudorandom numbers
Digitando il comando:
otteniamo un numero pseudocasuale compreso in (0, 1) intervallo aperto
MATLAB, in pratica, suddivide l’intervallo compreso tra 0 e 1 uniformemente, restituendo un valore appartenente a questo intervallo. Tutti i sotto intervalli sono equiprobabili
>> rand
L.2.1. Numeri Pseudocasuali
Cosa vuol dire pseudo-casuali?
I numeri sono detti pseudo-casuali perché sono generati
da metodi deterministici ben definiti e con passi precisi, a
partire da un determinato valore iniziale (seme o seed)
Partendo da un particolare seed, tali procedure generano,
con calcoli precisi e noti, sequenze di numeri che
sembrano casuali, pur in realtà non essendolo. La
casualità può essere determinata modificando a piacere il
seed.
Normalmente MATLAB all’avvio imposta il seed a 0
L.2.1. Numeri Pseudocasuali
Vettori di valori pseudo-casuali
Per vedere l’attuale valore del seed si utilizza il comando rng:
• Type indica la strategia di generazione dei numeri a partire dal Seed
• State rappresenta il vettore dei numeri pseudo-casuali generato
La pseudocasualità (che può essere eliminata) è utile per poter assicurare la ripetibilità degli esperimenti e il controllo del codice
>>rng
ans =
Type: ‘twister’
Seed: 0
State: [625x1 unit32]
L.2.1. Numeri Pseudocasuali
Vettori di valori pseudo-casuali
Il seed è un numero intero minore di 232 e, come visto, di default è pari 0 per tutti i metodi di estrazione
Si può variare sia il metodo per generare numeri pseudocasuali sia il valore del seed usato dagli algoritmi mediante il comando RandStream
Per esempio:
Le istruzioni seguenti permettono di inizializzare il seed sul valore di clock (orologio interno del computer) permettendo la generazione di numeri casuali non ripetibili
Il comando clock restituisce un vettore [yyyy mm dd hh mm ss]
per versioni < 7.7
per versioni ≥ 7.7
>> s = RandStream('mt19937ar', 'seed', 1);
>> RandStream.setGlobalStream(s);
>> rand('seed',sum(100*clock))
>> RandStream.setDefaultStream(RandStream...
('mt19937ar','seed',sum(100*clock)))
L.2.1. Numeri Pseudocasuali
Vettori di valori pseudo-casuali
Il seed può essere modificato anche tramite
Inizializzando il seed si riporta la procedura di estrazione dei numeri
ad uno stato iniziale ben definito
Ogni volta che si esegue un’estrazione, si ottiene un numero casuale e
si modifica lo stato interno del processo in maniera deterministica per
l’estrazione del numero successivo
Quando il seed viene inizializzato ad uno specifico valore, si otterrà
sempre la stessa sequenza di estrazioni; ad ogni seed corrisponde
una ben definita sequenza di numeri
>> rng(1)
L.2.1. Numeri Pseudocasuali
Approcci alla modellazione di eventi reali
Dopo aver visto come estrarre una sequenza di numeri pseudocasuali compresi tra 0 e 1, vediamo come è possibile trasformare ogni evento di estrazione in un risultato corrispondente ad un evento reale, qualequellodel lancio di una moneta.
Come facciamo a fare corrispondere Testa o Croce all’estrazione di un numero pseudocasuale?
L.2.1. Numeri Pseudocasuali
Funzione moneta
Un possibile approccio è testare su ogni elemento del vettore/matrice creato se il numero estratto ricade in certi sotto-intervalli che corrispondono ai possibili esiti esterni. Il numero dei sotto-intervalli deve essere uguale al numero degli esiti
Per esempio, nel lancio della moneta ci sono 2 esiti:
1. Testa
2. Croce
Si divide pertanto l’intervallo in 2 sotto-intervalli e si sceglie, arbitrariamente che, per esempio, a valori compresi tra 0 e 0.5 corrisponde Testa, a valori compresi tra 0.5 e 1 corrisponde Croce
Basterà poi verificare se il numero estratto è maggiore o minore di 0.5 per avere simulato l’evento reale del lancio di una moneta
L.2.1. Numeri Pseudocasuali
Funzione moneta
Per simulare il lancio di una moneta, vasterà quindi estrarre un numero causale compreso tra 0 e 1 tramite il comando rand
e poi controllare se il valore estratto è maggiore o minore di 0.5 ricorrendo, per esempio, ad una funzione booleana
>> estrazione = rand;
>> risultato = estrazione > 0.5
L.2.1. Numeri Pseudocasuali
Varianti della funzione rand
In base alla specifica di una serie di parametri, la funzione rand genera output diversi
rand Genera un numero pseudocasuale nell’intervallo (0,1)
rand(n) Costruisce una matrice quadrata nxn di numeri pseudocasuali uniformemente distribuiti nell’intervallo (0,1)
rand(m,n,t,…) Costruisce una matrice mxnxtx… di numeri pseudocasuali uniformemente distribuit nell’intervallo (0,1)
L.2.1. Numeri Pseudocasuali
Numeri pseudocasuali interi
MATALB dispone anche di un generatore di numeri interi positivi pseudocasuali
randi(b) Genera un numero intero positivo pseudocasuale nell’intervallo [1,b]
randi(b,n) Costruisce una matrice quadrata nxn di numeri interi positivi pseudocasuali uniformemente distribuiti nell’intervallo [1,b]
randi(b,m,n,t,…) Costruisce una matrice mxnxtx… di numeri interi positivi pseudocasuali uniformemente distribuiti nell’intervallo [1,b]
L.2.1. Numeri Pseudocasuali
Numeri pseudocasuali interi
A volte torna utile generare numeri pseudocasuali che abbiano una media e una deviazione standard assegnata
randn Genera un numero pseudocasuale con media 0 e deviazione standard 1
randn(n) Costruisce una matrice quadrata nxn di numeri pseudocasuali con media 0 e deviazione standard 1
randn(m,n,t,…) Costruisce una matrice mxnxtx… di numeri pseudocasuali con media 0 e deviazione standard 1
L.2.1. Numeri Pseudocasuali
Funzioni di approssimazione di MATLAB
NOTA: tutte le funzioni di approssimazione operano anche sulle matrici (elemento per elemento)
round(x) Approssima il numero x all’intero positivo o negativo più vicino
floor(x) Approssima il numero x all’intero positivo o negativo più piccolo. Corrisponde alla parte intera inferiore ( )
ceil(x) Approssima il numero x all’intero positivo o negativo più grande. Corrisponde alla parte intera superiore ( )
fix(x) Approssima il numero x all’intero positivo o negativo più vicino allo zero
MATLAB offre diverse funzioni per l’approssimazione di numeri
L.2.1. Numeri Pseudocasuali
Funzioni di approssimazione di MATLAB
>> round(3.1)
ans =
3
>> round(3.7)
ans =
4
>> round(3.5)
ans =
4
>> floor(3.7)
ans =
3
>> floor(-3.1)
ans =
-4
>> floor(-3.7)
ans =
-4
>> ceil(3.1)
ans =
4
>> ceil(-3.1)
ans =
-3
>> ceil(-3.7)
ans =
-3
>> fix(3.7)
ans =
3
>> fix(-3.1)
ans =
-3
>> fix(-3.7)
ans =
-3
L.2.1. Numeri Pseudocasuali
Testa o Croce?
Proviamo a modellare lo stesso evento del lancio della moneta tramite la funzione round
Perché basta questo?
>> help round
rounds towards nearest decimal or integer
round(X) rounds each element of X to the nearest integer.
>> risultato = round(estrazione)
L.2.1. Numeri Pseudocasuali
Lancio dei dadi
Si può provare ad analizzare empiricamente le probabilità legate all’evento di lancio dei dadi
La funzione round non va bene in questo caso
Perché?
Qual è la funzione più opportuna?
Possiamo pure combinare alcune delle funzioni viste per risolvere diversamente il problema
L.2.1. Numeri Pseudocasuali
Lancio dei dadi
Con la funzione floor
Con la funzione ceil
L.2.1. Numeri Pseudocasuali
Problema 10: Numeri pseudocasuali
1. Si generi una matrice A 6x9 contenente nelle prime 6 colonne numeri casuali uniformemente distribuiti in (0 , 1) e nelle ultime 3 il valore 10
2. Si generi una matrice quadrata B di dimensioni 10x10 contenente numeri casuali uniformemente distribuiti nell'intervallo (-3 , 11)
3. Si generi una matrice C 8x10 avente 0 sulle colonne pari e 1 su quelle dispari
4. Si generi una matrice D di dimensioni 7x4 contenente zeri sulle righe pari e numeri interi uniformemente distribuiti in [30 , 52] sulle righe dispari
5. Si generi un numero intero casuale maggiore di 251
6. Si generi una matrice F di dimensioni 9 x 5 avente nelle righe 2, 3 e 5 numeri casuali distribuiti con media 10 e deviazione standard 1 e nelle restanti righe numeri uniformemente distribuiti minori di zero
L.2.1. Numeri Pseudocasuali
Problema 11: Numeri pseudocasuali e funzioni di appros.
1. Si generi una matrice quadrata A 9x9 contenente 1 nella diagonale secondaria e 0 altrove
2. Si generi una matrice triangolare superiore B di dimensioni 8x8 contenente numeri interi casuali uniformemente distribuiti nell'intervallo [-9 , 11)
3. Si generi una matrice quadrata C 10x10 che abbia 0 sulla diagonale principale e 4 altrove
4. Si generi una matrice D 8x10 avente numeri complessi sulla diagonale principale e numeri interi uniformemente distribuiti in [-4 , 4] altrove
5. Si generi una matrice quadrata E 7x7 che abbia -1 sulla diagonale principale e su quella secondaria e 3 altrove
6. Date due matrici M 4x6 ed N 6x4 di numeri interi minori di 100, verificare che (M * N)T = NT * NT
7. Calcolare il determinante della matrice magica di ordine 8 ed invertire la matrice B costruita al punto 2