Politechnika Zielonogórska Wydział Elektryczny |
Imię i nazwisko: Marcin Gałkowski |
Grupa lab. 37C |
Nr ćwicz. 2 |
Ocena |
Laboratorium modelowania i symulacji.
|
||||
Temat ćwiczenia:
Generowanie i testowanie liczb pseudolosowych o rozkładzie równomiernym.
|
Data wyk. 16.10. 2000r. |
Data odd. 23.10. 2000r. |
Podpis |
Program ćwiczenia
Przed wykonaniem kolejnych punktów programu ćwiczenia należy dokładnie zapoznać się z załączonymi programami w języku Matlab,
Za pomocą programu generatora multiplikatywnego uran wygenerować ciągi liczb pseudolosowych dla różnych typów parametru m (liczba pierwsza),
Napisać i uruchomić funkcję w języku Matlab wyznaczającą długość okresu generatora. Wyznaczyć długości okresów dla kilku wybranych generatorów.
Wygenerować wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1), o zadanej długości M, za pomocą programu ugen.
Obliczyć histogram rozkładu (hist).
Uruchomić program testu autokorelacji (test). Zbadać wpływ doboru stałych a i m na skorelowanie ciągu. Uwaga: wartości a zbliżone do zapewniają dobre właściwości statystyczne generatora, dla wartości bliskich 1 lub m test korelacji zwykle nie jest spełniony.
Napisać i uruchomić funkcje w języku Matlab generowania liczb pseudolosowych za pomocą generatorów mieszanego i addytywnego.
Wygenerować za pomocą generatorów mieszanego i addytywnego wektory pseudolosowe o rozkładzie równomiernym na przedziale (0,1), o zadanej długości M.
Obliczyć histogramy rozkładu (hist).
Uruchomić program testu autokorelacji (test).
Napisać i uruchomić funkcje w języku Matlab generowania liczb pseudolosowych za pomocą generatora kwadratowego.
Dobrać eksperymentalnie parametry generatora (wartość początkową x i liczbę m) tak, aby otrzymać ciąg o założonej długości.
Wygenerować wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1), o zadanej długości M.
Obliczyć histogram rozkładu (hist).
Uruchomić program testu autokorelacji (test).
Wygenerować za pomocą generatora rand wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1).
Obliczyć histogramy rozkładu (hist).
Uruchomić program testu autokorelacji (test).
Programy wykorzystywane w ćwiczeniu
3.1. Funkcja uran - generator multiplikatywny
%URAN Generator multiplikatywny,
% x=a*x(mod m)
function[x]=uran(x,a,m);
x=rem(a*x,m);
3.2. Funkcja ugen - generowanie wektora (Nx1)
%UGEN Generowanie wektora liczb pseudolosowych,
% X - wektor Nx1 liczb o rozkładzie równomiernym na przedziale (0,1)
function[X]=ugen(x,a,m,N);
for i=1:N,
x=uran(x,a,m);
X(i)=x/m;
end;
3.3. Program test - test autokorelacji dla generatora liczb pseudolosowych o rozkładzie
równomiernym
%TEST Test autokorelacji dla generatora liczb pseudolosowych o rozkładzie
% równomiernym na przedziale (0,1)
X=X-0.5;
Z=corr(X,N,M);
Z=Z/Z(1);
figure(1); clf; hold on;
plot([0:M-1],Z,'*');
% Obliczenie granicy przedziału ufności dla poziomu ufności 0.95
k=1.96*sqrt(1/N);
K=k*ones(M,1);
plot([0:M-1],K,'--r');
plot([0:M-1],-K,'--r'); hold off;
3.4. Funkcja corr - obliczanie funkcji korelacyjnej
%CORR Obliczanie funkcji korelacyjnej
% c=corr(x,N,M),
% x jest wektorem Nx1 zawierającym badany ciąg,
% M-1 określa maksymalne opóźnienie,
% c oznacza wektor 1xM zawierający wartości funkcji korelacyjnej
function[c]=corr(x,N,M);
% Obliczanie funkcji korelacji własnej
c=0*zeros(1,M);
for I=1:M,
for i=1:N-M+1,
c(I)=c(I)+x(i)*x(i+I-1);
end;
c(I)=(1/(N-M+1))*c(I);
end;
3.1.2. Ciągi liczb pseudolosowych dla różnych typów parametru m.
m=2n;
m=8; a=7; x0=1;
x = 7 1 7 1 7 1 7 1
m=16; a=9; x0=1;
x = 9 1 9 1 9 1
m=32; a=10; x0=1;
x = 10 4 8 16 0 0
m=10n;
m=10000; a=10; x0=1;
x = 10 100 1000 0 0 0
m=100000; a=100; x0=1;
x = 100 10000 0 0 0 0
m=1000000; a=10000; x0=1;
x = 10000 0 0 0 0 0
m=liczba pierwsza;
m=11; a=10; x0=1;
x = 10 1 10 1 10 1
m=17; a=13; x0=1;
x = 13 16 4 1 13 16
m=29; a=20; x0=1;
x = 20 23 25 7 24 16
3.1.3. Długość okresu generatora ( N ).
Badanie przeprowadzono dla parametrów z podpunktu 3.1.2.
m=2n;
m=8; a=7; x0=1;
N = 1;
m=16; a=9; x0=1;
N = 1;
m=32; a=10; x0=1;
N = nieskończenie długi;
m=10n;
m=10000; a=10; x0=1;
N = nieskończenie długi;
m=100000; a=100; x0=1;
N = nieskończenie długi;
m=1000000; a=10000; x0=1;
N = nieskończenie długi;
m=liczba pierwsza;
m=11; a=10; x0=1;
N = 1;
m=17; a=13; x0=1;
N = 4;
m=29; a=20; x0=1;
N = 6;
3.1.4. Wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1):
a = 0.5; m = 0.9; x0 = 0.1; M = 10;
X = 0.05 0.025 0.0125 0.0062 0.0031 0.0016 0.0008 0.0004 0.0002 0.0001
3.1.4.1. Histogram rozkładu wektora pseudolosowego:
3.1.4.2. Test autokorelacji:
3.1.5. Generatory mieszany i addytywny (funkcje):
Funkcja uran1 - generator mieszany
%URAN Generator mieszany,
% x=a*x+b(mod m)
function[x]=uran1(x,a,b,m);
x=rem(a*x+b,m);
Funkcja uran4 - generator addytywny
%URAN4 Generator addytywny,
function[x]=uran4(b,a,m,N);
x(1)=b;
x(2)=a;
for j=1:N,
x(j+2)=rem(x(j+1)+x(j),m);
end;
dla generatora mieszanego:
m=10; x=1; a=11; b=7;
x = 8 5 2 9 6 3 0 7 4 1 8 5 ...
dla generatora addytywnego:
m=24; b=1; a=2; N=10;
x = 1 2 3 5 8 13 21 10 7 17 0 17
3.1.5.1. Wektory pseudolosowe o rozkładzie równomiernym na przedziale (0,1)
wygenerowane przez generatory mieszany i addytywny:
dla mieszanego a=13; b=7; x=1; m=32; N=100; wektor wynosi:
0.6250 0.3438 0.6875 0.1563 0.2500 0.4688 0.3125
0.2813 0.8750 0.5938 0.9375 0.4063 0.5000 0.7188
0.5625 0.5313 0.1250 0.8438 0.1875 0.6563 0.7500
0.9688 0.8125 0.7813 0.3750 0.0938 0.4375 0.9063
0 0.2188 0.0625 0.0313 0.6250 0.3438 0.6875
0.1563 0.2500 0.4688 0.3125 0.2813 0.8750 0.5938
0.9375 0.4063 0.5000 0.7188 0.5625 0.5313 0.1250
0.8438 0.1875 0.6563 0.7500 0.9688 0.8125 0.7813
0.3750 0.0938 0.4375 0.9063 0 0.2188 0.0625
0.0313 0.6250 0.3438 0.6875 0.1563 0.2500 0.4688
0.3125 0.2813 0.8750 0.5938 0.9375 0.4063 0.5000
0.7188 0.5625 0.5313 0.1250 0.8438 0.1875 0.6563
0.7500 0.9688 0.8125 0.7813 0.3750 0.0938 0.4375
0.9063 0 0.2188 0.0625 0.0313 0.6250 0.3438
0.6875 0.1563
dla addytywnego a=1; b=1; x=1; m=32; N=100; wektor wynosi:
0.0313 0.0313 0.0625 0.0938 0.1563 0.2500 0.4063
0.6563 0.0625 0.7188 0.7813 0.5000 0.2813 0.7813
0.0625 0.8438 0.9063 0.7500 0.6563 0.4063 0.0625
0.4688 0.5313 0 0.5313 0.5313 0.0625 0.5938
0.6563 0.2500 0.9063 0.1563 0.0625 0.2188 0.2813
0.5000 0.7813 0.2813 0.0625 0.3438 0.4063 0.7500
0.1563 0.9063 0.0625 0.9688 0.0313 0 0.0313
0.0313 0.0625 0.0938 0.1563 0.2500 0.4063 0.6563
0.0625 0.7188 0.7813 0.5000 0.2813 0.7813 0.0625
0.8438 0.9063 0.7500 0.6563 0.4063 0.0625 0.4688
0.5313 0 0.5313 0.5313 0.0625 0.5938 0.6563
0.2500 0.9063 0.1563 0.0625 0.2188 0.2813 0.5000
0.7813 0.2813 0.0625 0.3438 0.4063 0.7500 0.1563
0.9063 0.0625 0.9688 0.0313 0 0.0313 0.0313
0.0625 0.0938
3.1.5.2. Histogramy rozkładu:
dla mieszanego:
dla addytywnego:
3.1.5.3. Testy autokorelacji:
dla mieszanego:
dla addytywnego:
3.1.6.2. Generowanie liczb pseudolosowych za pomocą generatora kwadratowego.
a) dla parametrów: m = 100; x = 7; ciąg wygląda następująco:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...itd.
b) dla parametrów: m = 400; x = 23; ciąg wygląda następująco:
241 81 161 321 241 81 161 321 ...itd.
c) dla parametrów: m = 500; x = 49; ciąg wygląda następująco:
301 101 201 401 301 101 201 ...itd.
3.1.6.3. Wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1) o zadanej
długości M.
dla parametrów: m = 300; x = 11; M = 50; wektor ten ma postać:
0.4033 0.8033 0.6033 0.2033 0.4033 0.8033 0.6033
0.2033 0.4033 0.8033 0.6033 0.2033 0.4033 0.8033
0.6033 0.2033 0.4033 0.8033 0.6033 0.2033 0.4033
0.8033 0.6033 0.2033 0.4033 0.8033 0.6033 0.2033
0.4033 0.8033 0.6033 0.2033 0.4033 0.8033 0.6033
0.2033 0.4033 0.8033 0.6033 0.2033 0.4033 0.8033
0.6033 0.2033 0.4033 0.8033 0.6033 0.2033 0.4033
0.8033
3.1.6.4. Histogram rozkładu wektora pseudolosowego o rozkładzie równomiernym na
przedziale (0,1) i zadanej długości M.
3.1.6.5. Autokorelacja:
3.1.7.1. Wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1),
wygenerowany za pomocą generatora rand:
0.5009 0.3304 0.2305 0.6049 0.0473 0.7365 0.4877
0.9858 0.9785 0.1423 0.9290 0.0158 0.7277 0.7338
0.0679 0.7975 0.4533 0.2107 0.7353 0.5774 0.7895
0.0827 0.3758 0.2010 0.6457 0.1239 0.5075 0.1056
0.0291 0.0507 0.1827 0.5097 0.6476 0.5096 0.5992
0.3364 0.7235 0.1181 0.5198 0.9952 0.3133 0.5058
0.8198 0.2987 0.7086 0.8695 0.6565 0.8622 0.9266
0.9387 0.6657 0.5977 0.4045 0.1340 0.3020 0.4603
0.5033 0.7629 0.9443 0.6498 0.9464 0.4637 0.2712
0.0694 0.1874 0.3490 0.9143 0.0138 0.9875 0.1740
0.4030 0.3993 0.7857 0.5059 0.5624 0.7012 0.2854
0.9866 0.2243 0.5010 0.4299 0.5160 0.0469 0.9647
0.0658 0.5100 0.7054 0.6249 0.2275 0.6307 0.1532
0.3108 0.6493 0.8356 0.0177 0.4044 0.7995 0.1596
0.3124 0.6311
3.1.7.2. Histogram rozkładu wektora:
3.1.7.3. Test autokorelacji:
4. Wnioski.
dla generatora multiplikatywnego test autokorelacji nie wypada pomyślnie - może dobranie jedynie 10 punktów akurat nie obrazuje tego problemu zbyt dobrze, jednak przy większej liczbie punktów jest to lepiej widoczne (sprawdzone doświadczalnie);
liczby w wektorze liczb losowych dla przykładu z 10 punktami są kolejnymi potęgami 0.05, co dla pewnych przedziałów jest swego rodzaju korelacją, ale jednak całość testu wypadła bardzo źle (większość liczb nie mieściła się w przedziale korelacyjnym) - co dowodzi, iż nie każdy generator musi spełniać każdy test;
generator mieszany okazał się jednym z najbardziej skorelowanych generatorów - rozkład jego jest bardzo równomierny (jedynie cztery punkty znajdowały się poza przedziałem korelacji - nie licząc początkowego);
podobnie w testach wypadł generator addytywny, co dobrze można zauważyć na wykresach - raczej nie można mieć zastrzeżeń co do otrzymanych wyników;
niestety nie udało mi się dobrać eksperymentalnie wartości x i m aby otrzymać ciągi o określonej długości (nie udało mi się znaleźć zależności) - ciągi zachowywały się bardzo różnie;
wektor pseudolosowy o rozkładzie równomiernym na przedziale (0,1) okazał się skorelowany ale tylko wyrywkowo - to znaczy na pewnych zakresach - dopiero taki sam wektor wygenerowany za pomocą generatora rand okazał się być bardzo dobrze skorelowanym (jedynie trzy punkty ze stu znajdowały się poza przedziałem korelacji);
wszystkie generatory oprócz multiplikatywnego wykazywały się dobrym rozkładem i przede wszystkim skorelowaniem - jednak wszystko to zależało od doboru zarówno zmiennych, jak i czasami nawet stałych;