Documente Academic
Documente Profesional
Documente Cultură
Dupa ce am generat un numar mare de puncte, ratia numerelor de puncte care se afla
in cerc / numarul total de puncte generate se va apropia de ratia dintre aria cercului / aria
patratului. Astfel valoarea lui Pi va deveni simplu
Pi este aproximativ 4 * (Numarul de puncte din interiorul cercului) / (Numarul total
de puncte generate)
Astfel putem gasi o aproximare la pentru Pi folosind matematica elementara.
Programul urmator poate fi folosit pentru a gasi o aproximare pentru Pi
% Program Matlab de cautare a lui Pi folosind numere aleatoare
% Tom Huber, 15 Iunie, 1996
Nrand = input('Cate numere aleatoare ');
NInside = 0;
for nloops=1:Nrand
Xrand = rand; % Genereaza un punct XY aleator
Yrand = rand;
Rrand = Xrand^2 + Yrand^2; % Gaseste originea fata de distanta
if (Rrand <= 1)
NInside = NInside + 1;
end
end
disp(['Total Generate: ' num2str(Nrand) ' Puncte interioare: '
num2str(NInside)]);
piapprox = 4*NInside/Nrand;
disp([' Pi aproximativ = ' num2str(piapprox)]);
Sa se ruleze programul cu aproape 1000 de puncte aleatorii. Cat de buna este
aproximarea? Ne da acelasi rezultat de fiecare data cand rulezi programul? Rezultatul se
imbunatateste daca rulam programul cu 5000 de puncte? Cat timp in plus ii ia sa
calculeze?
Ne putem imbunatati semnificativ viteza programului optimizandu-l pentru Matlab.
In particular, Matlab este foarte rapid in lucrul cu vectori si cu matrici de numere. In
editia pentru studenti a Matlab-ului, cel mai mare vector care poate fi folosit poate avea
8192 de elemente, deci vom pune programul sa genereze 8192 de numere aleatoare cu un
singur apel al functiei rand. Apoi vom determina raza pentru toate acestea simultan,
folosind comanda
Rrand = Xrand.^2 + Yrand.^2;
A se observa utilizarea operatorului .^ - acesta ridica la patrat fiecare element al
vectorului separat in loc sa faca o inmultire in matrice. in final, putem verifica toate
elementele vectorului pentru a vedea daca raza este < 1 folosind o singura comanda
CheckValue = Rrand<=1.;
Aceasta va crea un vector CheckValue care va avea cate un 1 pentru fiecare element
care indeplineste conditia (Rrand<=1.) si 0 pentru fiecare element care nu indeplineste
conditia. La sfarsit, putem determina numarul din interior prin adunarea tutuor valorilor
din CheckValue.
NInside = NInside + sum(CheckValue);
Urmatorul program poate fi folosit pentru a aproxima valoarea lui Pi si va fi mult
mai rapid decat versiunea precedenta.
% Program Matlab optimizat pentru a-l gasi Pi folosind numere aleatoare