Metodi Computazionali Generazione di numeri pseudocasuali A.A. 2009/2010 Generating a random permutation Creare un vettore di n=100 elementi di valori random usando Mixed Congruential Method con m=231-1 e a=75 9 15 17 … … Esercizio 1: Effettuare n=100 permutazioni - restituire il nuovo vettore “permutato” P.S.: ogni numero può essere permutato con qualsiasi altro numero con probabilità uniforme Generating a random permutation function [vector]=permutation(vector) numPerm=length(vector); K=length(vector); for i=1:numPerm U=rand(); I=fix(K*U)+1; temp=vector(I); vector(I)=vector(K); vector(K)=temp; K=K-1; end Generating a Poisson Random Variable La variabile random X è una Poisson con media λ se: i λ pi = P ( X = i) = e− λ i! Per generare una serie di poisson random € variables: λ pi+1 = pi i +1 Esercizio 2: generare una poisson random variable € Generating a Poisson Random Variable function [X]=poisson(lambda) U=rand; i=0; p=exp(-lambda); F=p; exit=1; while(exit==1) if U<F X=i; break; else p=(lambda*p)/(i+1); F=F+p; i=i+1; end end Acceptance Rejection Method Supponiamo di voler simulare il valore di una variabile random X che assume i seguenti valori 1 2 3 4 5 6 7 8 9 10 0.10 0.9 0.9 0.10 0.10 con le seguenti probabilità 0.11 0.12 0.09 0.08 0.12 Esercizio 3: Simulare attraverso il metodo Acceptance-Rejection Acceptance Rejection Method function [X]=acceptanceRejection(vector, probability) n=length(vector); q=1/n; fract=probability/q; c=max(fract); fract=fract*(1/c); while(1) U1=rand; Y=fix(n*U1)+1; U2=rand; if U2<=fract(Y) X=Y; break; end end Calcolo di un integrale singolo La stima di un integrale può essere ricavata simulando una serie di numeri pseudo-casuali 1 2 3/2 ∫ (1− x ) dx 0 nTrials € 2 3/2 ∑ (1− U ) i=1 nTrials Esercizio 3: Calcolare il valore dell’integrale Calcolo di un integrale singolo function [value] = integral(nTrials) randomNumbers = zeros(1,nTrials); value=0; for i=1:nTrials randomNumbers(i)=rand; end for i=1:nTrials value=value + ((1-randomNumbers(i)^2)^(3/2)); end value=value/nTrials; Calcolo di un integrale singolo Verifichiamo, attraverso il calcolo degli integrali messo a disposizione da Matlab, che il nostro risultato si avvicina al valore esatto syms x f=(1-x^2)^(3/2) int(f,x,0,1) Generating a Normal Random Variable 1. 2. 3. Generare una variabile random Y esponenziale con rate λ=1 Generare una variabile pseudocasuale U IF U<= exp(-(Y-1)^2)/2) Then X=Y; Else go to step 1. Esercizio 5 Generating a Normal Random Variable function [X] = normalRandomVariable(lambda) while (1) U1=rand; Y=-(1/lambda)*log(U1); U2=rand; if U2<=exp(-(Y-1)^2)/2 X=Y; break; end end