% Математичні та програмні засоби моделювання ІВС % Лабораторна робота № 2 % Програмні генератори випадкових впливів на складну динамічну систему % Генерування некорельованих випадкових впливів з рівномірним та нормальним розподілом % - - - Стандартні методи rand, randi, randn, % метод на основі залишку від операції множення, псевдовипадкова бінарна послідовність - - - % --- Початкові дані --- clear variables; % Кількість відліків у реалізації випадкового впливу N=1024; % Діапазон значень амплітуди випадкових впливів (для рівномірного розподілу) A_random=1; % Середньоквадратичне значення амплітуди випадкових впливів (для нормального розподілу) STD_random=1; % Рівномірний розподіл/цілі числа з рівномірним розподілом/нормальний розподіл =uniform/int/normal Type_distributed='normal'; % Тип генератора випадкових чисел в Матлаб % 'twister' - MATLAB: rand, randi, randn - Mersenne Twister % 'simdTwister' - MATLAB: rand, randi, randn - SIMD-oriented Fast Mersenne Twister % 'combRecursive' - MATLAB: rand, randi, randn - Combined Multiple Recursive % 'multFibonacci' - MATLAB: rand, randi, randn - Multiplicative Lagged Fibonacci % 'modn' - залишок від ділення за модулем N % 'pvbp1' - псевдовипадкова бінарна послідовність (нуль-послідовність максимальної довжини) % 'pvbp2' - псевдовипадкова бінарна послідовність (квадратична залишкова послідовність) Type_generator='pvbp1'; % Період псевдовипадкової бінарної послідовності 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047 Type_PSBP=127; % Кількість інтервалів на гістограмі N_bins=10; % --- Моделювання --- switch lower(Type_generator) case {'twister','simdtwister','combrecursive','multfibonacci'} rng(0,Type_generator); if strcmp(Type_distributed,'uniform')==1 X_random=A_random*rand(N,1); elseif strcmp(Type_distributed,'int')==1 X_random=randi(A_random,N,1); else % 'normal' при інших значеннях Type_distributed X_random=STD_random*randn(N,1); end; case 'modn' X_random=zeros(N,1); A_mod=7^9; X_random(1)=1; N_mod=10^10; for i=2:N X_random(i)=mod(A_mod*X_random(i-1),N_mod); end; if strcmp(Type_distributed,'uniform')==1 X_random=A_random.*(X_random./N_mod); elseif strcmp(Type_distributed,'int')==1 X_random=round(A_random.*(X_random./N_mod)); else % 'normal' при інших значеннях Type_distributed X_random3=zeros(3*N,1); X_random3(1)=1; for i=2:(3*N) X_random3(i)=mod(A_mod*X_random3(i-1),N_mod); end; for i=1:N X_random(i)=(X_random3(i)./N_mod-0.5).*(X_random3(i+N)./N_mod-0.5).*(X_random3(i+2*N)./N_mod-0.5); end; X_random=3*2^3*STD_random*X_random; end; case 'pvbp1' X_random=zeros(N,1); x101=ones(1,13); for i=1:N if Type_PSBP==3 rx101=xor(x101(2), x101(1)); x101max=2; elseif Type_PSBP==7 rx101=xor(x101(3), x101(1)); x101max=3; elseif Type_PSBP==15 rx101=xor(x101(4), x101(3)); x101max=4; elseif Type_PSBP==31 rx101=xor(x101(5), x101(3)); x101max=5; elseif Type_PSBP==63 rx101=xor(x101(6), x101(5)); x101max=6; elseif Type_PSBP==127 rx101=xor(x101(7), x101(4)); x101max=7; elseif Type_PSBP==255 rx101=xor(xor(x101(8), x101(4)),xor(x101(3), x101(2))); x101max=8; elseif Type_PSBP==511 rx101=xor(x101(9), x101(5)); x101max=9; elseif Type_PSBP==1023 rx101=xor(x101(10), x101(7)); x101max=10; elseif Type_PSBP==2047 rx101=xor(x101(11), x101(9)); x101max=11; else % 127 при інших значеннях Type_PSBP rx101=xor(x101(7), x101(4)); x101max=7; end; for j=x101max:(-1):2 x101(j)=x101(j-1); end; x101(1)=rx101; if rx101==1 X_random(i)=1; else X_random(i)=-1; end; end; case 'pvbp2' X_random=zeros(N,1); xqN=-ones(1,Type_PSBP); for i=1:round((Type_PSBP-1)/2) xqN(mod(i^2-1,Type_PSBP)+1)=1; end; for i=1:N X_random(i)=xqN(mod((i-1),Type_PSBP)+1); end; end; % Гістограма випадкових впливів figure; [N_hist, Bin_hist]=hist(X_random,N_bins); hist(X_random,N_bins); grid on; xlabel('Амплітуда випадкових впливів, дискр.рівнів'); ylabel('Кільк. відліків в інтервалі значень ампл.'); title('Гістограма розподілу значень випадкових чисел'); figure; histogram(X_random,'Normalization','pdf'); grid on; xlabel('Амплітуда випадкових впливів, дискр.рівнів'); ylabel('Відносна кільк. відліків в інтервалі'); title('Нормалізована гістограма випадкових чисел'); if strcmp(Type_distributed,'normal')==1 PDF_Arg=-3*STD_random:0.01:3*STD_random; PDF_Theory = pdf('normal',PDF_Arg,0,STD_random); hold on; plot(PDF_Arg,PDF_Theory,'r-','LineWidth',2); hold off; else PDF_Arg=0:0.1:A_random; PDF_Theory = pdf('uniform',PDF_Arg,0,A_random); hold on; plot(PDF_Arg,PDF_Theory,'r-','LineWidth',2); hold off; end; % Автокореляційна функція випадкових впливів % Розрахунок на основі функції MATLAB xkorr Autocorr1 = xcorr(X_random)./N; figure; plot(0:(N-1),Autocorr1(N:end),'LineWidth',2); grid on; xlabel('Номер відліку випадкових чисел'); ylabel('Автокореляційна функція, дискр.рівнів^2'); title('Автокор. функція вип. посл. чисел - функція MATLAB xkorr'); % Розрахунок суми на основі визначення корреляційної функції X_random2=[X_random; X_random]; Autocorr2 = zeros(N,1); for j=1:N kor_sum=0; for i=1:N kor_sum=kor_sum+X_random2(i+j-1)*X_random2(i)/N; end; Autocorr2(j)=kor_sum; end; figure; plot(0:(N-1),Autocorr2,'LineWidth',2); grid on; xlabel('Номер відліку випадкових чисел'); ylabel('Автокореляційна функція, дискр.рівнів^2'); title('Автокор. функція вип. посл. чисел - сума'); % Розрахунок на основі перетворення Фур'є S_random=abs(fft(X_random)); Autocorr3=abs(ifft(S_random)); figure; plot(0:(N-1),Autocorr3,'LineWidth',2); grid on; xlabel('Номер відліку випадкових чисел'); ylabel('Автокореляційна функція, дискр.рівнів^2'); title('Автокор. функція вип. посл. чисел - перетворення Фур''є'); % - - - Чисельні параметри розподілу випадкових чисел % Середне значення X_mean=mean(X_random); % Середньоквадратичне значення X_STD=std(X_random); % Максимальне значення X_max=max(X_random); % Мінімальне значення X_min=min(X_random); % Асиметрія X_skewness=skewness(X_random,0); % Ексцес X_kurtosis=kurtosis(X_random,0)-3; % --- Виведення результатів моделювання --- fprintf(1,'Лабораторна робота № 2\n'); fprintf(1,'Програмні генератори випадкових впливів на складну динамічну систему\n'); fprintf(1,'Генерування некорельованих випадкових впливів з рівномірним та нормальним розподілом\n'); fprintf(1,'Стандартні методи MATLAB rand, randi, randn\n'); fprintf(1,'Метод на основі залишку від операції множення, псевдовипадкова бінарна послідовність\n'); fprintf(1,'Кількість відліків у реалізації випадкового впливу %d\n', N); fprintf(1,'Діапазон значень ампл. вип. впливів (для рівн. розподілу) %7.3f\n', A_random); fprintf(1,'Середньокв. значення ампл. вип. впливів (для норм. розподілу) %7.3f\n', STD_random); fprintf(1,'Рівн. розподіл/цілі числа з рівн. розподілом/норм. розподіл %s\n', Type_distributed); fprintf(1,'Тип генератора випадкових чисел %s\n', Type_generator); fprintf(1,'Період псевдовипадкової бінарної послідовності %d\n', Type_PSBP); fprintf(1,'Кількість інтервалів на гістограмі %d\n', N_bins); fprintf(1,'- - - Чисельні параметри розподілу випадкових чисел\n'); fprintf(1,'Середне значення та Середньокв. зн. %7.3f %7.3f\n', X_mean, X_STD); fprintf(1,'Макс. значення та Мін. значення %7.3f %7.3f\n', X_max, X_min); fprintf(1,'Асиметрія та Ексцес %7.3f %7.3f\n', X_skewness, X_kurtosis); fprintf(1,'Гістограма: значення вип. чисел; кількість вип. чисел на інт.\n'); for i=1:size(N_hist,2) fprintf(1,'%7.3f %7.3f\n', Bin_hist(i), N_hist(i)); end; fprintf(1,'\n');