В практике моделирования и особенно в практике статистических испытаний приходится использовать случайные последовательности или просто случайные числа. При моделировании систем на ЭВМ программная имитация случайных воздействий любой сложности сводится к генерированию некоторых стандартных (базовых) процессов и к их последующему функциональному преобразованию. Получение случайных чисел с требуемым законом распределения обычно выполняется в два этапа:
В связи с этим особое значение приобретают случайные числа, равномерно распределенные в интервале $$[0; 1]$$. Например, генерирование экспоненциально распределенных случайных чисел $$t_{i}$$ может быть выполнено по формуле
$$t_i=-\frac{1}{\lambda}\ln(R_i),$$где:
$$\lambda$$ — параметр экспоненциального закона;
$$R_{i}$$ — равномерно распределенное случайное число из интервала $$(0; 1)$$.
Существуют физические и программные датчики (генераторы) случайных чисел. Программные датчики случайных чисел фактически генерируют
Полученные с помощью программных методов случайные последовательности в идеале должны состоять из:
Известно, что при равномерном законе распределения случайной непрерывной величины в интервале $$[0; 1]$$ соответствующее математическое ожидание $$(m)$$, дисперсия $$(s^{2})$$ и
Критерий заключается в сравнении теоретических параметров равномерного распределения с
В системе MATLAB всех версий используется функция $$rand$$, реализующая равномерно распределенные числа в интервале $$[0; 1]$$.
Среднее значение массива чисел определяется функцией $$mean$$, дисперсия — функцией $$var$$, среднее квадратическое отклонение (стандартное отклонение) — функцией $$std$$ (см. $$help\mbox{ }mean,\mbox{ }help\mbox{ }var,\mbox{ }help\mbox{ }std$$ ).
Программный код анализа случайных чисел:
clear, clc
%% Генерирование выборки 500 случайных чисел
x = rand(500, 1);
%% Вычисление среднего значения выборки
m1 = mean(x)
%% Вычисление дисперсии данной выборки
s2 = var(x)
%% Вычисление среднего квадратического отклонения
s = std(x)
%% Расчет относительных погрешностей в процентах
%% по математическому ожиданию
m = 0.5;
Dm = abs((mean(x)- m)/m)*100;
fprintf('\n Относительная погрешность по математическому ожиданию: %g%%\n', Dm);
%% по дисперсии
d = 1/12;
Dd = abs((var(x)- d)/d)*100;
fprintf(' Относительная погрешность по дисперсии: %g%%\n', Dd);
%% по среднему квадратическому отклонению
sd = sqrt(d);
Ds = abs((std(x)- sqrt(1/12))/sqrt(1/12))*100;
fprintf(' Относительная погрешность по стандартному отклонению: %g%%\n', Ds);
%% Генерирование дополнительной выборки
y = rand(500, 1);
%% Диаграмма оценки равномерности случайных чисел
fig1 = figure(1);
set(fig1, 'name', 'Случайные числа функции rand')
plot(x,y,'o', 'markersize', 4);
str = '\bf\fontsize{11}\fontname{times}Проверка на равномерность случайных чисел';
title(str)
xlabel('\bf\fontsize{11}\fontname{times} Random numbers')
ylabel('\bf\fontsize{11}\fontname{times} Random numbers')
В программе выполняется построение диаграммы визуальной оценки равномерности случайных чисел. Числа-кружочки на диаграмме должны равномерно заполнить квадрат со стороной, равной единице. На рис. 5.1 приведен пример проверки случайной последовательности на равномерность распределения в интервале $$(0; 1)$$.
(рис 5.1) Проверка равномерности случайных чисел для функции rand Задание 1
Проведите в зависимости от номера компьютера статистическое исследование функции $$rand$$ при различных объемах выборки: малых $$n < 25$$ ; средних $$n \approx 150$$ ; больших $$n > 500$$. Результаты испытаний усредните.
Компьютер № 1: 11 испытаний (n: 24, 142, 600); Компьютер № 2: 12 испытаний (n: 22, 144, 650); Компьютер № 3: 13 испытаний (n: 20, 146, 700); Компьютер № 4: 14 испытаний (n: 18, 148, 750); Компьютер № 5: 15 испытаний (n: 16, 150, 800); Компьютер № 6: 16 испытаний (n: 14, 152, 850); Компьютер № 7: 17 испытаний (n: 12, 154, 900); Компьютер № 8: 18 испытаний (n: 10, 156, 950); Компьютер № 9: 19 испытаний (n: 19, 149,1000). Компьютер № 10: 20 испытаний (n: 20, 150, 1010).
Примечание. В системе
1. Для фиксации случайных чисел в
Генератор случайных чисел, использующий
$$X_{n+1} = (X_{n} + X_{n–1}) mod(M)$$,
где:
$$X_{n+1}, X_{n}, X_{n–1}$$ — целые числа, лежащие между нулем и некоторым большим числом $$М$$, который называется модулем;
$$n$$ — порядковый номер числа [9].
Для получения случайных чисел $$R_{n}$$ из интервала $$[0; 1]$$ следует вычислить дробь
$$R_n=\frac{X_n}{M}$$Программный код формирования случайных чисел по
clear,clc,close all
N = 500; %% количество генерируемых чисел
M = 2^30; %% модуль
%% 1-я последовательность случайных чисел
X0 = 12345; %% 1-е произвольное число
X1 = 67890; %% 2-е произвольное число
for n = 1 : N
X = mod( X1 + X0, M); %% следующее число
X0 = X1;
X1 = X;
Zx(n,1) = X;
end
Rx = Zx/M;
mf = mean(Rx);
fprintf('\n Среднее выборочное для метода Фибоначчи: %g%%\n', mf);
sf2 = var(Rx);
fprintf(' Выборочная дисперсия для метода Фибоначчи: %g%%\n', sf2);
sf = std(Rx);
fprintf(' Выборочное стандартное отклонение: %g%%\n', sf);
%% Расчет относительных погрешностей в процентах
m = 0.5;
fprintf('\n Относительная погрешность по математическому ожиданию: %g%%\n', abs((mf - m)/m)*100);
d = 1/12;
fprintf(' Относительная погрешность по дисперсии: %g%%\n', abs((sf2 - d)/d)*100);
%% по среднему квадратическому отклонению
sd = sqrt(d);
fprintf(' Относительная погрешность по стандартному отклонению: %g%%\n', abs((sf - sd)/sd)*100);
%% 2-я последовательность случайных чисел
Y0 = 333; %% 1-е произвольное число
Y1 = 123; %% 1-е произвольное число
for n = 1 : N
Y = mod( Y1 + Y0, M); %% следующее число
Y0 = Y1;
Y1 = Y;
Zy(n,1) = Y;
end
Ry = Zy/M;
%% Диаграмма оценки равномерности случайных чисел
fig2 = figure(2);
set(fig2, 'name', 'Случайные числа Фибоначчи')
plot(Rx,Ry,'o', 'markersize', 4);
str = '\bf\fontsize{11}\fontname{times}Проверка на равномерность случайных чисел';
title(str)
xlabel('\bf\fontsize{11}\fontname{times} Random numbers')
ylabel('\bf\fontsize{11}\fontname{times} Random numbers')
Пример выполнения программы (без диаграммы)
Среднее выборочное для метода Фибоначчи: 0.49687% Выборочная дисперсия для метода Фибоначчи: 0.0861675% Выборочное стандартное отклонение: 0.293543% Относительная погрешность по математическому ожиданию: 0.626048% Относительная погрешность по дисперсии: 3.40103% Относительная погрешность по стандартному отклонению: 1.6863%
Задание 2
Метод срединных квадратов был предложен Нейманом [19] и заключается в следующем: выбирается число, меньшее 1, разрядностью $$2n$$. Оно возводится в квадрат. Из полученного результата (разрядность которого должна быть $$2*(2n)$$, если нет, то добавляются нули справа от полученного числа) выбираются $$2n$$ чисел из середины полученного после возведения в квадрат числа. Число записывается после десятичной точки. Далее все повторяется.
Для примера выберем 4-разрядное ( $$2n = 4$$ ) число $$а0 = 0.1234$$. После возведения в квадрат получим число, равное 0.01522756. Из него выбираем четыре срединные цифры, т. е. 5227. Получаем новое случайное (
и так далее.
Задание 3
| Варианты заданий для метода срединных квадратов | |
| № 1 | $$№ 1 = 0.1234$$ ; $$№ 2 = 0.2234$$ ; $$№ 3 = 0.3234$$ ; $$№ 4 = 0.4234$$ ; $$№ 5 = 0.5234$$ ; $$№ 6 = 0.6234$$ ; $$№ 7 = 0.7234$$ ; $$№ 8 = 0.8234$$ ; $$№ 9 = 0.9234$$ ; $$№ 10 = 0.9934$$ |
| № 2 | $$№ 1 = 0.123456$$ ; $$№ 2 = 0.223456$$ ; $$№ 3 = 0.323456$$ ; $$№ 4 = 0.423456$$ ; $$№ 5 = 0.523456$$ ; $$№ 6 = 0.623456$$ ; $$№ 7 = 0.723456$$ ; $$№ 8 = 0.823456$$ ; $$№ 9 = 0.923456$$ ; $$№ 10 = 0.993456$$ |
| № 3 | $$№ 1 = 0.12345678$$ ; $$№ 2 = 0.22345678$$ ; $$№ 3 = 0.32345678$$ ; $$№ 4 = 0.42345678$$ ; $$№ 5 = 0.52345678$$ ; $$№ 6 = 0.62345678$$ ; $$№ 7 = 0.72345678$$ ; $$№ 8 = 0.82345678$$ ; $$№ 9 = 0.92345678$$ ; $$№ 10 = 0.99345678$$ |
| № 4 | $$№ 1 = 0.12345678$$ ; $$№ 2 = 0.22345678$$ ; $$№ 3 = 0.32345678$$ ; $$№ 4 = 0.42345678$$ ; $$№ 5 = 0.52345678$$ ; $$№ 6 = 0.62345678$$ ; $$№ 7 = 0.72345678$$ ; $$№ 8 = 0.82345678$$ ; $$№ 9 = 0.92345678$$ ; $$№ 10 = 0.99345678$$ |
Примечание. Для проверки периодичности (непериодичности) формируемой случайной последовательности можно применить, например, функцию $$unique$$ (см. $$help\mbox{ }unique$$ ).
Компьютер № 1: (объем выборки: 24, 142, 600); Компьютер № 2: (объем выборки: 22, 144, 650); Компьютер № 3: (объем выборки: 20, 146, 700); Компьютер № 4: (объем выборки: 18, 148, 750); Компьютер № 5: (объем выборки: 16, 150, 800); Компьютер № 6: (объем выборки: 14, 152, 850); Компьютер № 7: (объем выборки: 12, 154, 900); Компьютер № 8: (объем выборки: 10, 156, 950); Компьютер № 9: (объем выборки: 17, 157, 999); Компьютер № 10: (объем выборки: 19, 158, 1010).
Формирование случайных (псевдослучайных) чисел по линейному конгруэнтному методу основывается на следующем
где:
$$R_{k+1}$$ — вновь формируемое число;
$$a$$ — множитель (мультипликативная константа);
$$R_{k}$$ — предыдущее число ( $$R_{0}$$ — назначаемое число);
$$c$$ — приращение (инкремент);
$$mod$$ — модуль, бинарная операция для обозначения остатка от деления двух чисел;
$$M$$ — целочисленная константа [19]. Для $$n$$ -разрядных целых чисел $$M=2^{n}$$. В самом простом случае принимается, что $$c=0$$ Массив случайных чисел $${x_{i}}$$ из интервала $$(0,1)$$ будет формироваться следующим образом:
$$\{x_i\}=\{R_i\}/M,$$где $$R_{i}$$ — числа, определяемые по формуле (5.1).
В стандартной процедуре реализации линейного конгруэнтного метода (5.1) принимается, что $$a,c,M$$ — целые положительные числа. Приведем определение конгруэнтности двух чисел $$X$$ и $$Y$$: два числа $$Y$$ и $$Х$$
При выборе чисел $$a,c,M$$ придерживаются следующих правил:
В качестве множителя $$a$$ рекомендуется принимать
Например, при $$М = 7$$ первообразным корнем по модулю 7 является число 3. Действительно, $$\varphi(M)=6$$, т. е. количеству чисел ряда $$1, 2, 3, 4, 5, 6$$, каждое из которых взаимно просто с числом 7.
Числа $$3^{1} – 1 = 2,\mbox{ }3^{2} – 1 = 8,\mbox{ }3^{3} – 1 = 26,\mbox{ }3^{4} – 1 = 80,\mbox{ }3^{5} – 1 = 242$$ не делятся на 7 без остатка, и лишь $$3^{6} – 1 = 728$$ делится на 7 (частное от деления равно 104).
В системе MATLAB формирование простых чисел производится с помощью функции $$primes$$ (см. $$help\mbox{ }primes$$ ). Для проверки, являются ли два числа взаимно простыми, можно применить функцию $$gcd$$, которая определяет наибольший общий делитель для двух чисел.
В самом простом случае принимается, что $$c=0$$ При этом можно использовать следующие рекомендации по выбору параметров генератора:
Пример формирования модуля $$M$$ в командном окне MATLAB:
>> N = 7*10^6;
>> m = primes(N);
>> M = m(end)
M =
6999997
Задание 4
| № 1 | № 1: $$N = 7*106;$$ № 2: $$N = 7.5*106$$ ; № 3: $$N = 8*106$$ ; № 4: $$N = 8.5*106$$ ; № 5: $$N = 9*106$$ ; № 6: $$N = 9.5*106$$ ; № 7: $$N = 10*106$$ ; № 8: $$N = 10.5*106$$ ; № 9: $$N = 10.6*106$$ |
| № 2 | № 1: $$N = 7.2*106$$ ; № 2: $$N = 7.52*106$$ ; № 3: $$N = 8.3*106$$ ; № 4: $$N = 8.54*106$$ ; № 5: $$N = 9.55*106$$ ; № 6: $$N = 9.66*106$$ ; № 7: $$N = 10.7*106$$ ; № 8: $$N = 10.8*106$$ ; № 9: $$N = 10.9*106$$ |
| № 3 | № 1: $$N = 7.11*106$$ ; № 2: $$N = 7.22*106$$ ; № 3: $$N = 8.33*106$$ ; № 4: $$N = 8.44*106$$ ; № 5: $$N = 9.55*106$$ ; № 6: $$N = 9.66*106$$ ; № 7: $$N = 10.77*106$$ ; № 8: $$N = 10.88*106$$ ; № 9: $$N = 10.99*106$$ |
| № 4 | >№ 1: $$N = 5.11*106$$ ; № 2: $$N = 5.22*106$$ ; № 3: $$N = 6.33*106$$ ; № 4: $$N = 5.44*106$$ ; № 5: $$N = 6.55*106$$ ; № 6: $$N = 6.66*106$$ ; № 7: $$N = 6.77*106$$ ; № 8: $$N = 6.88*106$$ ; № 9: $$N = 6.99*106$$ |
| № 1 | № 1: $$m(11)$$, № 2: $$m(12)$$, № 3: $$m(13)$$, № 4: $$m(14)$$, № 5: $$m(15)$$, № 6: $$m(16)$$, № 7: $$m(17)$$, № 8: $$m(18)$$, № 9: $$m(18)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 2 | № 1: $$m(21)$$, № 2: $$m(22)$$, № 3: $$m(23)$$, № 4: $$m(24)$$, № 5: $$m(25)$$, № 6: $$m(26)$$, № 7: $$m(27)$$, № 8: $$m(28)$$, № 9: $$m(29)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 3 | № 1: $$m(31)$$, № 2: $$m(32)$$, № 3: $$m(33)$$, № 4: $$m(34)$$, № 5: $$m(35)$$, № 6: $$m(36)$$, № 7: $$m(37)$$, № 8: $$m(38)$$, № 9: $$m(38)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 4 | № 1: $$m(41)$$, № 2: $$m(42)$$, № 3: $$m(43)$$, № 4: $$m(44)$$, № 5: $$m(45)$$, № 6: $$m(46)$$, № 7: $$m(47)$$, № 8: $$m(48)$$, № 9: $$m(49)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$m = primes(N)$$ |
По критерию Колмогорова–Смирнова (КС-критерию) осуществляется проверка простой статистической гипотезы $$Н_{0}$$ (нулевой гипотезы) о том, что функция распределения $$F(x)$$ случайной величины $$Х$$ совпадает с некоторой известной функцией $$F_{0}(x)$$ при некотором уровне значимости $$\alpha$$. КС-критерием можно пользоваться уже при объеме выборки $$n \ge 20$$.
В системе MATLAB КС-критерий реализован функцией $$kstest$$.
Рассмотрим пример использования функции $$kstest$$ для проверки гипотезы о том, что функция распределения $$(F)$$ выборки, сформированной с помощью функции $$rand$$, соответствует функции распределения $$(F0)$$ экспоненциального закона с параметром 1 той же самой выборки.
Программное решение примера в командном окне MATLAB:
>> x = rand(25,1); F0 = expcdf(x,1);
>> H = kstest(x,[x,F0])
H =
1
Полученный результат $$Н = 1$$ означает, что нулевая гипотеза отвергается, т. е. выборочная функция равномерного распределения $$(F)$$ в интервале $$[0; 1]$$ имеет значительные расхождения с предполагаемой функцией экспоненциального распределения $$(F0)$$ с уровнем значимости $$\alpha$$ = 0.05 (по умолчанию). Если закладывается другой уровень значимости, отличный от 0.05, то тогда он должен быть введен в функцию $$kstest$$. На том же примере это будет выглядеть так (с уровнем значимости 0.012):
>> x = rand(25,1); F0 = expcdf(x,1);
>> H = kstest(x,[x,F0],0.012)
H =
1
По-прежнему нулевая гипотеза отвергается.
Рассмотрим пример использования функции $$kstest$$ для проверки гипотезы о том, что функция распределения выборки, сформированной с помощью $$rand$$, соответствует функции распределения равномерного закона из интервала $$[0; 1]$$ той же самой выборки.
Решение примера в командном окне MATLAB:
>> x = rand(25,1); F0 = unifcdf(x,0,1);
>> H = kstest(x,[x,F0])
H =
0
Нулевая гипотеза о равномерном распределении выборки принимается.
Задание 5
Корреляционная функция называется автокорреляционной, если производится статистический анализ одного случайного процесса (или одной выборки случайных чисел).
Для нахождения значений нормированной корреляционной функции необходимо предварительно центрировать значения случайного процесса или значения отсчетов случайной величины, т.е. выполнить операцию
$$n_{1} – m$$,
где:
$$n_{1}$$ — случайное число;
$$m = 0.5$$ — теоретическое математическое ожидание равномерного распределения.
Для определения корреляционной функции по результатам опыта выбирается достаточно большой объем выборки, чтобы можно было в широком диапазоне формировать разницу между двумя соседними значениями случайных чисел. Эту разницу для непрерывного времени обычно обозначают через $$\tau$$ и тогда корреляционная функция обозначается как $$R(\tau)$$. Если объем выборки составляет N, то диапазон вычисления корреляционной функции будет определяться как $$N – \tau$$. Величина $$\tau$$ задает область определения корреляционной функции. Например, $$\tau$$ может меняться от 0 до 6-8. При этом $$N$$ должно быть много больше 6 или 8. Область суммирования принимает значения от 1 (первое случайное число выборки) до $$N – \tau$$.
После этого корреляционная функция вычисляется по следующей экспериментальной формуле:
$$R(\tau)=\frac{1}{N-\tau}\sum\limits_{j=1}^{N-\tau} n_j n_{j+\tau},$$где $$n_{j}$$ — случайное число из заданной выборки случайных чисел.
Расчет по приведенной формуле: если взято какое-либо случайное число, то другое случайное число отстоит от первого на величину $$\tau$$.
Обозначим
где $$s$$ — дисперсия данной выборки случайных чисел.
Вычисление $$R^{\circ}$$ можно выполнять по приведенной экспериментальной формуле (5.3), если в ней применяются центрированные случайные числа.
ГСЧ считается хорошим, если при $$\tau$$, не равным нулю, модуль нормированной корреляционной функции меньше 0.1, т. е. $$|\widetilde{R}|< 0.1$$.
Приведем пример программного анализа независимости последовательности случайных чисел, формируемых функцией $$rand$$, с помощью автокорреляционной функции.
Программный код решения примера:
clear,clc
%% Ввод параметров в интерактивном режиме
V1 = inputdlg({'Введите число больше 10.......................................',...
'Сдвиг больше 1'},'Корреляционная функция',1,{'800','6'});
%% Преобразование к числам с плавающей точкой
V2 = str2num(char(V1));
% Гарантированное выделение целой части
V = fix(V2(1));
z = fix(V2(2));
% Формирование выборки случайных чисел
N = rand(V,1);
%% Центрирование выборки случайных чисел относительно математического ожидания
Nc = N - 0.5;
%% Расчет автокорреляционной функции
sum1 = Nc(1:(V-z));
sum2 = Nc((1+z):V);
Rc = sum(sum1.*sum2)/(V-z);
s = var(N);
Rn = (Rc/s);
%% Проверка качества случайных чисел
if abs(Rn) < 0.1
fprintf('\n\t ГСЧ выcокого качеcтва\n')
else
fprintf('\n\t ГСЧ низкого качеcтва\n')
end
%% Интерактивное сообщение
helpdlg('Смотрите результаты в командном окне','Корреляционная функция')
В программе по умолчанию исследуется объем выборки величиной 800 со сдвигом между числами, равным 6.
Задание 6
Компьютер № 1: N = 410; Компьютер № 2: N = 520; Компьютер № 3: N = 630; Компьютер № 4: N = 740; Компьютер № 5: N = 850; Компьютер № 6: N = 960; Компьютер № 7: N = 1070; Компьютер № 8: N = 1180; Компьютер № 9: N = 1190; Компьютер № 10: N = 1210.
В практике моделирования и особенно в практике статистических испытаний приходится использовать случайные последовательности или просто случайные числа. При моделировании систем на ЭВМ программная имитация случайных воздействий любой сложности сводится к генерированию некоторых стандартных (базовых) процессов и к их последующему функциональному преобразованию. Получение случайных чисел с требуемым законом распределения обычно выполняется в два этапа:
В связи с этим особое значение приобретают случайные числа, равномерно распределенные в интервале $$[0; 1]$$. Например, генерирование экспоненциально распределенных случайных чисел $$t_{i}$$ может быть выполнено по формуле
$$t_i=-\frac{1}{\lambda}\ln(R_i),$$где:
$$\lambda$$ — параметр экспоненциального закона;
$$R_{i}$$ — равномерно распределенное случайное число из интервала $$(0; 1)$$.
Существуют физические и программные датчики (генераторы) случайных чисел. Программные датчики случайных чисел фактически генерируют
Полученные с помощью программных методов случайные последовательности в идеале должны состоять из:
Известно, что при равномерном законе распределения случайной непрерывной величины в интервале $$[0; 1]$$ соответствующее математическое ожидание $$(m)$$, дисперсия $$(s^{2})$$ и
Критерий заключается в сравнении теоретических параметров равномерного распределения с
В системе MATLAB всех версий используется функция $$rand$$, реализующая равномерно распределенные числа в интервале $$[0; 1]$$.
Среднее значение массива чисел определяется функцией $$mean$$, дисперсия — функцией $$var$$, среднее квадратическое отклонение (стандартное отклонение) — функцией $$std$$ (см. $$help\mbox{ }mean,\mbox{ }help\mbox{ }var,\mbox{ }help\mbox{ }std$$ ).
Программный код анализа случайных чисел:
clear, clc
%% Генерирование выборки 500 случайных чисел
x = rand(500, 1);
%% Вычисление среднего значения выборки
m1 = mean(x)
%% Вычисление дисперсии данной выборки
s2 = var(x)
%% Вычисление среднего квадратического отклонения
s = std(x)
%% Расчет относительных погрешностей в процентах
%% по математическому ожиданию
m = 0.5;
Dm = abs((mean(x)- m)/m)*100;
fprintf('\n Относительная погрешность по математическому ожиданию: %g%%\n', Dm);
%% по дисперсии
d = 1/12;
Dd = abs((var(x)- d)/d)*100;
fprintf(' Относительная погрешность по дисперсии: %g%%\n', Dd);
%% по среднему квадратическому отклонению
sd = sqrt(d);
Ds = abs((std(x)- sqrt(1/12))/sqrt(1/12))*100;
fprintf(' Относительная погрешность по стандартному отклонению: %g%%\n', Ds);
%% Генерирование дополнительной выборки
y = rand(500, 1);
%% Диаграмма оценки равномерности случайных чисел
fig1 = figure(1);
set(fig1, 'name', 'Случайные числа функции rand')
plot(x,y,'o', 'markersize', 4);
str = '\bf\fontsize{11}\fontname{times}Проверка на равномерность случайных чисел';
title(str)
xlabel('\bf\fontsize{11}\fontname{times} Random numbers')
ylabel('\bf\fontsize{11}\fontname{times} Random numbers')
В программе выполняется построение диаграммы визуальной оценки равномерности случайных чисел. Числа-кружочки на диаграмме должны равномерно заполнить квадрат со стороной, равной единице. На рис. 5.1 приведен пример проверки случайной последовательности на равномерность распределения в интервале $$(0; 1)$$.
(рис 5.1) Проверка равномерности случайных чисел для функции rand Задание 1
Проведите в зависимости от номера компьютера статистическое исследование функции $$rand$$ при различных объемах выборки: малых $$n < 25$$ ; средних $$n \approx 150$$ ; больших $$n > 500$$. Результаты испытаний усредните.
Компьютер № 1: 11 испытаний (n: 24, 142, 600); Компьютер № 2: 12 испытаний (n: 22, 144, 650); Компьютер № 3: 13 испытаний (n: 20, 146, 700); Компьютер № 4: 14 испытаний (n: 18, 148, 750); Компьютер № 5: 15 испытаний (n: 16, 150, 800); Компьютер № 6: 16 испытаний (n: 14, 152, 850); Компьютер № 7: 17 испытаний (n: 12, 154, 900); Компьютер № 8: 18 испытаний (n: 10, 156, 950); Компьютер № 9: 19 испытаний (n: 19, 149,1000). Компьютер № 10: 20 испытаний (n: 20, 150, 1010).
Примечание. В системе
1. Для фиксации случайных чисел в
Генератор случайных чисел, использующий
$$X_{n+1} = (X_{n} + X_{n–1}) mod(M)$$,
где:
$$X_{n+1}, X_{n}, X_{n–1}$$ — целые числа, лежащие между нулем и некоторым большим числом $$М$$, который называется модулем;
$$n$$ — порядковый номер числа [9].
Для получения случайных чисел $$R_{n}$$ из интервала $$[0; 1]$$ следует вычислить дробь
$$R_n=\frac{X_n}{M}$$Программный код формирования случайных чисел по
clear,clc,close all
N = 500; %% количество генерируемых чисел
M = 2^30; %% модуль
%% 1-я последовательность случайных чисел
X0 = 12345; %% 1-е произвольное число
X1 = 67890; %% 2-е произвольное число
for n = 1 : N
X = mod( X1 + X0, M); %% следующее число
X0 = X1;
X1 = X;
Zx(n,1) = X;
end
Rx = Zx/M;
mf = mean(Rx);
fprintf('\n Среднее выборочное для метода Фибоначчи: %g%%\n', mf);
sf2 = var(Rx);
fprintf(' Выборочная дисперсия для метода Фибоначчи: %g%%\n', sf2);
sf = std(Rx);
fprintf(' Выборочное стандартное отклонение: %g%%\n', sf);
%% Расчет относительных погрешностей в процентах
m = 0.5;
fprintf('\n Относительная погрешность по математическому ожиданию: %g%%\n', abs((mf - m)/m)*100);
d = 1/12;
fprintf(' Относительная погрешность по дисперсии: %g%%\n', abs((sf2 - d)/d)*100);
%% по среднему квадратическому отклонению
sd = sqrt(d);
fprintf(' Относительная погрешность по стандартному отклонению: %g%%\n', abs((sf - sd)/sd)*100);
%% 2-я последовательность случайных чисел
Y0 = 333; %% 1-е произвольное число
Y1 = 123; %% 1-е произвольное число
for n = 1 : N
Y = mod( Y1 + Y0, M); %% следующее число
Y0 = Y1;
Y1 = Y;
Zy(n,1) = Y;
end
Ry = Zy/M;
%% Диаграмма оценки равномерности случайных чисел
fig2 = figure(2);
set(fig2, 'name', 'Случайные числа Фибоначчи')
plot(Rx,Ry,'o', 'markersize', 4);
str = '\bf\fontsize{11}\fontname{times}Проверка на равномерность случайных чисел';
title(str)
xlabel('\bf\fontsize{11}\fontname{times} Random numbers')
ylabel('\bf\fontsize{11}\fontname{times} Random numbers')
Пример выполнения программы (без диаграммы)
Среднее выборочное для метода Фибоначчи: 0.49687% Выборочная дисперсия для метода Фибоначчи: 0.0861675% Выборочное стандартное отклонение: 0.293543% Относительная погрешность по математическому ожиданию: 0.626048% Относительная погрешность по дисперсии: 3.40103% Относительная погрешность по стандартному отклонению: 1.6863%
Задание 2
Метод срединных квадратов был предложен Нейманом [19] и заключается в следующем: выбирается число, меньшее 1, разрядностью $$2n$$. Оно возводится в квадрат. Из полученного результата (разрядность которого должна быть $$2*(2n)$$, если нет, то добавляются нули справа от полученного числа) выбираются $$2n$$ чисел из середины полученного после возведения в квадрат числа. Число записывается после десятичной точки. Далее все повторяется.
Для примера выберем 4-разрядное ( $$2n = 4$$ ) число $$а0 = 0.1234$$. После возведения в квадрат получим число, равное 0.01522756. Из него выбираем четыре срединные цифры, т. е. 5227. Получаем новое случайное (
и так далее.
Задание 3
| Варианты заданий для метода срединных квадратов | |
| № 1 | $$№ 1 = 0.1234$$ ; $$№ 2 = 0.2234$$ ; $$№ 3 = 0.3234$$ ; $$№ 4 = 0.4234$$ ; $$№ 5 = 0.5234$$ ; $$№ 6 = 0.6234$$ ; $$№ 7 = 0.7234$$ ; $$№ 8 = 0.8234$$ ; $$№ 9 = 0.9234$$ ; $$№ 10 = 0.9934$$ |
| № 2 | $$№ 1 = 0.123456$$ ; $$№ 2 = 0.223456$$ ; $$№ 3 = 0.323456$$ ; $$№ 4 = 0.423456$$ ; $$№ 5 = 0.523456$$ ; $$№ 6 = 0.623456$$ ; $$№ 7 = 0.723456$$ ; $$№ 8 = 0.823456$$ ; $$№ 9 = 0.923456$$ ; $$№ 10 = 0.993456$$ |
| № 3 | $$№ 1 = 0.12345678$$ ; $$№ 2 = 0.22345678$$ ; $$№ 3 = 0.32345678$$ ; $$№ 4 = 0.42345678$$ ; $$№ 5 = 0.52345678$$ ; $$№ 6 = 0.62345678$$ ; $$№ 7 = 0.72345678$$ ; $$№ 8 = 0.82345678$$ ; $$№ 9 = 0.92345678$$ ; $$№ 10 = 0.99345678$$ |
| № 4 | $$№ 1 = 0.12345678$$ ; $$№ 2 = 0.22345678$$ ; $$№ 3 = 0.32345678$$ ; $$№ 4 = 0.42345678$$ ; $$№ 5 = 0.52345678$$ ; $$№ 6 = 0.62345678$$ ; $$№ 7 = 0.72345678$$ ; $$№ 8 = 0.82345678$$ ; $$№ 9 = 0.92345678$$ ; $$№ 10 = 0.99345678$$ |
Примечание. Для проверки периодичности (непериодичности) формируемой случайной последовательности можно применить, например, функцию $$unique$$ (см. $$help\mbox{ }unique$$ ).
Компьютер № 1: (объем выборки: 24, 142, 600); Компьютер № 2: (объем выборки: 22, 144, 650); Компьютер № 3: (объем выборки: 20, 146, 700); Компьютер № 4: (объем выборки: 18, 148, 750); Компьютер № 5: (объем выборки: 16, 150, 800); Компьютер № 6: (объем выборки: 14, 152, 850); Компьютер № 7: (объем выборки: 12, 154, 900); Компьютер № 8: (объем выборки: 10, 156, 950); Компьютер № 9: (объем выборки: 17, 157, 999); Компьютер № 10: (объем выборки: 19, 158, 1010).
Формирование случайных (псевдослучайных) чисел по линейному конгруэнтному методу основывается на следующем
где:
$$R_{k+1}$$ — вновь формируемое число;
$$a$$ — множитель (мультипликативная константа);
$$R_{k}$$ — предыдущее число ( $$R_{0}$$ — назначаемое число);
$$c$$ — приращение (инкремент);
$$mod$$ — модуль, бинарная операция для обозначения остатка от деления двух чисел;
$$M$$ — целочисленная константа [19]. Для $$n$$ -разрядных целых чисел $$M=2^{n}$$. В самом простом случае принимается, что $$c=0$$ Массив случайных чисел $${x_{i}}$$ из интервала $$(0,1)$$ будет формироваться следующим образом:
$$\{x_i\}=\{R_i\}/M,$$где $$R_{i}$$ — числа, определяемые по формуле (5.1).
В стандартной процедуре реализации линейного конгруэнтного метода (5.1) принимается, что $$a,c,M$$ — целые положительные числа. Приведем определение конгруэнтности двух чисел $$X$$ и $$Y$$: два числа $$Y$$ и $$Х$$
При выборе чисел $$a,c,M$$ придерживаются следующих правил:
В качестве множителя $$a$$ рекомендуется принимать
Например, при $$М = 7$$ первообразным корнем по модулю 7 является число 3. Действительно, $$\varphi(M)=6$$, т. е. количеству чисел ряда $$1, 2, 3, 4, 5, 6$$, каждое из которых взаимно просто с числом 7.
Числа $$3^{1} – 1 = 2,\mbox{ }3^{2} – 1 = 8,\mbox{ }3^{3} – 1 = 26,\mbox{ }3^{4} – 1 = 80,\mbox{ }3^{5} – 1 = 242$$ не делятся на 7 без остатка, и лишь $$3^{6} – 1 = 728$$ делится на 7 (частное от деления равно 104).
В системе MATLAB формирование простых чисел производится с помощью функции $$primes$$ (см. $$help\mbox{ }primes$$ ). Для проверки, являются ли два числа взаимно простыми, можно применить функцию $$gcd$$, которая определяет наибольший общий делитель для двух чисел.
В самом простом случае принимается, что $$c=0$$ При этом можно использовать следующие рекомендации по выбору параметров генератора:
Пример формирования модуля $$M$$ в командном окне MATLAB:
>> N = 7*10^6;
>> m = primes(N);
>> M = m(end)
M =
6999997
Задание 4
| № 1 | № 1: $$N = 7*106;$$ № 2: $$N = 7.5*106$$ ; № 3: $$N = 8*106$$ ; № 4: $$N = 8.5*106$$ ; № 5: $$N = 9*106$$ ; № 6: $$N = 9.5*106$$ ; № 7: $$N = 10*106$$ ; № 8: $$N = 10.5*106$$ ; № 9: $$N = 10.6*106$$ |
| № 2 | № 1: $$N = 7.2*106$$ ; № 2: $$N = 7.52*106$$ ; № 3: $$N = 8.3*106$$ ; № 4: $$N = 8.54*106$$ ; № 5: $$N = 9.55*106$$ ; № 6: $$N = 9.66*106$$ ; № 7: $$N = 10.7*106$$ ; № 8: $$N = 10.8*106$$ ; № 9: $$N = 10.9*106$$ |
| № 3 | № 1: $$N = 7.11*106$$ ; № 2: $$N = 7.22*106$$ ; № 3: $$N = 8.33*106$$ ; № 4: $$N = 8.44*106$$ ; № 5: $$N = 9.55*106$$ ; № 6: $$N = 9.66*106$$ ; № 7: $$N = 10.77*106$$ ; № 8: $$N = 10.88*106$$ ; № 9: $$N = 10.99*106$$ |
| № 4 | >№ 1: $$N = 5.11*106$$ ; № 2: $$N = 5.22*106$$ ; № 3: $$N = 6.33*106$$ ; № 4: $$N = 5.44*106$$ ; № 5: $$N = 6.55*106$$ ; № 6: $$N = 6.66*106$$ ; № 7: $$N = 6.77*106$$ ; № 8: $$N = 6.88*106$$ ; № 9: $$N = 6.99*106$$ |
| № 1 | № 1: $$m(11)$$, № 2: $$m(12)$$, № 3: $$m(13)$$, № 4: $$m(14)$$, № 5: $$m(15)$$, № 6: $$m(16)$$, № 7: $$m(17)$$, № 8: $$m(18)$$, № 9: $$m(18)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 2 | № 1: $$m(21)$$, № 2: $$m(22)$$, № 3: $$m(23)$$, № 4: $$m(24)$$, № 5: $$m(25)$$, № 6: $$m(26)$$, № 7: $$m(27)$$, № 8: $$m(28)$$, № 9: $$m(29)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 3 | № 1: $$m(31)$$, № 2: $$m(32)$$, № 3: $$m(33)$$, № 4: $$m(34)$$, № 5: $$m(35)$$, № 6: $$m(36)$$, № 7: $$m(37)$$, № 8: $$m(38)$$, № 9: $$m(38)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$M = primes(N)$$ |
| № 4 | № 1: $$m(41)$$, № 2: $$m(42)$$, № 3: $$m(43)$$, № 4: $$m(44)$$, № 5: $$m(45)$$, № 6: $$m(46)$$, № 7: $$m(47)$$, № 8: $$m(48)$$, № 9: $$m(49)$$, где $$m$$ — массив простых чисел, сформированный с помощью выражения $$m = primes(N)$$ |
По критерию Колмогорова–Смирнова (КС-критерию) осуществляется проверка простой статистической гипотезы $$Н_{0}$$ (нулевой гипотезы) о том, что функция распределения $$F(x)$$ случайной величины $$Х$$ совпадает с некоторой известной функцией $$F_{0}(x)$$ при некотором уровне значимости $$\alpha$$. КС-критерием можно пользоваться уже при объеме выборки $$n \ge 20$$.
В системе MATLAB КС-критерий реализован функцией $$kstest$$.
Рассмотрим пример использования функции $$kstest$$ для проверки гипотезы о том, что функция распределения $$(F)$$ выборки, сформированной с помощью функции $$rand$$, соответствует функции распределения $$(F0)$$ экспоненциального закона с параметром 1 той же самой выборки.
Программное решение примера в командном окне MATLAB:
>> x = rand(25,1); F0 = expcdf(x,1);
>> H = kstest(x,[x,F0])
H =
1
Полученный результат $$Н = 1$$ означает, что нулевая гипотеза отвергается, т. е. выборочная функция равномерного распределения $$(F)$$ в интервале $$[0; 1]$$ имеет значительные расхождения с предполагаемой функцией экспоненциального распределения $$(F0)$$ с уровнем значимости $$\alpha$$ = 0.05 (по умолчанию). Если закладывается другой уровень значимости, отличный от 0.05, то тогда он должен быть введен в функцию $$kstest$$. На том же примере это будет выглядеть так (с уровнем значимости 0.012):
>> x = rand(25,1); F0 = expcdf(x,1);
>> H = kstest(x,[x,F0],0.012)
H =
1
По-прежнему нулевая гипотеза отвергается.
Рассмотрим пример использования функции $$kstest$$ для проверки гипотезы о том, что функция распределения выборки, сформированной с помощью $$rand$$, соответствует функции распределения равномерного закона из интервала $$[0; 1]$$ той же самой выборки.
Решение примера в командном окне MATLAB:
>> x = rand(25,1); F0 = unifcdf(x,0,1);
>> H = kstest(x,[x,F0])
H =
0
Нулевая гипотеза о равномерном распределении выборки принимается.
Задание 5
Корреляционная функция называется автокорреляционной, если производится статистический анализ одного случайного процесса (или одной выборки случайных чисел).
Для нахождения значений нормированной корреляционной функции необходимо предварительно центрировать значения случайного процесса или значения отсчетов случайной величины, т.е. выполнить операцию
$$n_{1} – m$$,
где:
$$n_{1}$$ — случайное число;
$$m = 0.5$$ — теоретическое математическое ожидание равномерного распределения.
Для определения корреляционной функции по результатам опыта выбирается достаточно большой объем выборки, чтобы можно было в широком диапазоне формировать разницу между двумя соседними значениями случайных чисел. Эту разницу для непрерывного времени обычно обозначают через $$\tau$$ и тогда корреляционная функция обозначается как $$R(\tau)$$. Если объем выборки составляет N, то диапазон вычисления корреляционной функции будет определяться как $$N – \tau$$. Величина $$\tau$$ задает область определения корреляционной функции. Например, $$\tau$$ может меняться от 0 до 6-8. При этом $$N$$ должно быть много больше 6 или 8. Область суммирования принимает значения от 1 (первое случайное число выборки) до $$N – \tau$$.
После этого корреляционная функция вычисляется по следующей экспериментальной формуле:
$$R(\tau)=\frac{1}{N-\tau}\sum\limits_{j=1}^{N-\tau} n_j n_{j+\tau},$$где $$n_{j}$$ — случайное число из заданной выборки случайных чисел.
Расчет по приведенной формуле: если взято какое-либо случайное число, то другое случайное число отстоит от первого на величину $$\tau$$.
Обозначим
где $$s$$ — дисперсия данной выборки случайных чисел.
Вычисление $$R^{\circ}$$ можно выполнять по приведенной экспериментальной формуле (5.3), если в ней применяются центрированные случайные числа.
ГСЧ считается хорошим, если при $$\tau$$, не равным нулю, модуль нормированной корреляционной функции меньше 0.1, т. е. $$|\widetilde{R}|< 0.1$$.
Приведем пример программного анализа независимости последовательности случайных чисел, формируемых функцией $$rand$$, с помощью автокорреляционной функции.
Программный код решения примера:
clear,clc
%% Ввод параметров в интерактивном режиме
V1 = inputdlg({'Введите число больше 10.......................................',...
'Сдвиг больше 1'},'Корреляционная функция',1,{'800','6'});
%% Преобразование к числам с плавающей точкой
V2 = str2num(char(V1));
% Гарантированное выделение целой части
V = fix(V2(1));
z = fix(V2(2));
% Формирование выборки случайных чисел
N = rand(V,1);
%% Центрирование выборки случайных чисел относительно математического ожидания
Nc = N - 0.5;
%% Расчет автокорреляционной функции
sum1 = Nc(1:(V-z));
sum2 = Nc((1+z):V);
Rc = sum(sum1.*sum2)/(V-z);
s = var(N);
Rn = (Rc/s);
%% Проверка качества случайных чисел
if abs(Rn) < 0.1
fprintf('\n\t ГСЧ выcокого качеcтва\n')
else
fprintf('\n\t ГСЧ низкого качеcтва\n')
end
%% Интерактивное сообщение
helpdlg('Смотрите результаты в командном окне','Корреляционная функция')
В программе по умолчанию исследуется объем выборки величиной 800 со сдвигом между числами, равным 6.
Задание 6
Компьютер № 1: N = 410; Компьютер № 2: N = 520; Компьютер № 3: N = 630; Компьютер № 4: N = 740; Компьютер № 5: N = 850; Компьютер № 6: N = 960; Компьютер № 7: N = 1070; Компьютер № 8: N = 1180; Компьютер № 9: N = 1190; Компьютер № 10: N = 1210.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.