Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сафоненко Практикум по интерфейсам последователной передачи 2012

.pdf
Скачиваний:
7
Добавлен:
12.11.2022
Размер:
4.56 Mб
Скачать

В качестве множителя a рекомендуется принимать первообразный корень по модулю M. Приведем следующее классическое определение.

Первообразный корень по модулю M – натуральное число g, такое, что наименьшее положительное число k, для которого разность gk 1 делится на M (без остатка), совпадает с φ (M), где φ (M) – число натуральных чисел, меньших M и взаимно простых с M.

Например, при M = 7 первообразным корнем по модулю 7 является число 3. Действительно, φ(M) = 6, т. е. количеству чисел ряда 1, 2, 3, 4, 5, 6, каждое из которых взаимно просто с числом 7.

Два числа называются взаимно простыми, если в качестве об-

щего делителя они имеют только единицу.

Числа 31 – 1 = 2, 32 – 1 = 8, 33 – 1 = 26, 34 – 1 = 80, 35 – 1 = 242 не делятся на 7 без остатка, и лишь 36 – 1 = 728 делится на 7 (частное от деления равно 104).

Всистеме MATLAB формирование простых чисел производится

спомощью функции primes. Для проверки, являются ли два числа взаимно простыми, можно применить функцию gcd, которая определяет наибольший общий делитель для двух чисел.

Всамом простом случае принимается, что c = 0. При этом можно использовать следующие рекомендации по выбору параметров генератора:

1. Начальное значение R0 может быть произвольно. Выбор a должен удовлетворять трем требованиям:

a mod 8 = 5,

M/100 < a < M M,

двоичные знаки a не должны иметь очевидного шаблона. 2. В качестве a следует выбирать нечетное число, такое, что

a/M ≈ 1/2 36 = 0.211324865405187.

Пример формирования модуля M в командном окне MATLAB:

N = 7*10^6; m = primes(N); M = m(end) M =

6999997

81

Модели дискретных случайных величин с произвольными законами распределения

Метод ступенчатой аппроксимации

Реализуем закон распределения непрерывной случайной величины в дискретной форме. Рассмотрим непрерывную случайную величину X c плотностью распределения вероятности f (x) (рис. 11). Обозначим: hi – значение f (x) для аргумента Xi. Преобразуем непрерывную случайную величину X в дискретный ансамбль {Xn} с вероятностями p1, p2,…, pn, которые соответствуют дискретным значениям hi плотности распределения f (x). С помощью операции нормировки все значения hi переводим в единицы вероятности попадания значений X в интервал xi< x ≤ xi+1:

pi = hi /(h1 + h2 +…+ hi +…+ hn), ∑ pi = 1.

Построим последовательность дискретных случайных величин с вероятностями p1, p2,.., pn. Пусть дискретная случайная величина ξ принимает n значений ξ1, ξ2,…, ξn с вероятностями p1, p2,.., pn. Отрезок [0,1] разобьем на n последовательных отрезков 1,…, n, длины которых равны, соответственно, вероятностям p1, p2,.., pn. Разыгрывается значение величины γ, равномерно распределенной на отрезке [0;1]. Далее принимаем ξ = ξk, если γ принадлежит k. Полученные числа ξ в точности обладают заданными вероятностями p1, p2,…, pn.

Рис. 11. Метод ступенчатой аппроксимации

82

Иллюстрация перехода от произвольного непрерывного закона распределения к дискретному закону приведена на рис. 11. Генератор случайных чисел (ГСЧ) формирует число, распределенное равномерно на интервале [0,1]. Искомое число Хi равно координате начала соответствующего интервала Pi. Дискретность разбиений n выбирают из условий точности представления, так как переход от непрерывного закона распределения к дискретному аналогу создает погрешность представления числа.

Рассмотрим пример реализации этого метода в MATLAB. Для этого получим набор нормально распределенных случайных чисел и сравним функцию распределения с теоретической:

function method_1 %тело скрипта global p t eps max ds D;

p=0;t=0; %обнуление массивов p и t

eps=100; %количество генерируемых чисел %чем больше, тем точнее получится %результат

max=50; %максимальное значение (определяет интервал) ds=2*max/eps; %расстояние между числами (точность) D=200; %дисперсия

approx=100; %точность генерации

create_matrix; %создание матрицы p(t) – функция %распределения

for i=1:eps %генерация случайных чисел x(i)=(ceil(rand(1)*approx))/approx; %генерация

%равномерно распределенных чисел rnd(i)=find(x(i)); %нахождение соответствия x(i)

%и rnd(i) – нормально распределенных %случайныхчисел

end

f=create_distribution_known_interval(rnd,max,1/ds); %построение матрицы с функцией распределения

83

plot(t,p,'–k',t,f,'k'); %рисуем график

title('Функция распределения'); %названиеграфика xlabel('x'); %названиеабсциссы

ylabel('F_x'); %название ординаты

hleg=legend('Ожидаемый результат','Результат эксперимента'); %включаем...

set(hleg,'Location','NorthWest'); %...легенду grid on; %включаемсетку

function create_matrix %функция, создающая матрицу

%с дискретными значениями %функциииp(t) – функция распределения

global p t eps max ds D; sum=0; %обнуление for i=1:eps

t(i)=-max+ds*i; %задание абсциссы sum=sum+1/sqrt(2*3.1415*D)*exp(-t(i)^2/(2*D))*ds;

%нахождение распределения p(i)=sum;

end

function f=find(tmp) %функция, которая возвращает %нормально распределенную случайную %величину через известную равномерно %распределенную величину

global p t;

for i=1:numel(p) %для всех чиселиз матрицы p...

if tmp<=p(i) %если входная величина превышает

%p(i), ...

break; %... то ответ найден end

end

f=t(i); %ответ

function f=create_distribution_known_interval (rnd,

84

offset, approx) %функция, которая создает матрицу %распределения. Принимает значения: %случайныечисла, распределение %которых необходимо найти; смещение %началаотносительно нуля; обратная %величина точности чисел матрицы rnd

global j cnt;

cnt=0; %обнуление массива cnt для возможности %повторного запуска

rnd_sort=sortrows(rnd'); %сортировка значений...

rnd_sort=rnd_sort'; %...матрицы по возрастанию for i=1:numel(rnd_sort)*approx %обнуление...

cnt(i)=0; %...массива cnt

end

j=1; %счетчик

rnd_sort=[rnd_sort 0]; %добавление крайнего элемента %необходимого для обработки

for i=2:numel(rnd_sort)

if rnd_sort(i) == rnd_sort(i-1) && i < numel(rnd_sort) %так как числа

%сортированные, то когда %последовательно идущие числа равны...

j=j+1; %... то увеличиваем счетчик else %иначе...

cnt(floor((rnd_sort(i- 1)+offset)*approx+1))=j/numel(rnd_sort); %...находим

%вероятность выпадения текущего числа j=1; %«сбрасываем» счетчик

end

end

sum=0; %устанавливаемначальное значение

for i=1:numel(rnd_sort)-1 %находим распределение

85

sum=sum+cnt(i);

f(i)=sum; %f(x) равноевероятности того, %что x<i.

End

Рис. 12. Результаты моделирования функции распределения по методу ступенчатой аппроксимации

В результате работы М-файла построен график, изображенный на рис. 12. Погрешность форм функции распределения эксперимента и её теоретического значения не превышает 0.1.

Метод обращения

Обратимся к теореме о функции случайной величины. Пусть X : Ω → Rn – действительная случайная величина, и g : Rn → Rn – монотонная непрерывно дифференцируемая функция такая, что Jg (x) 0, x → Rn, где Jg (x) – якобиан функции g в точке x. Тогда случайная функция Y = g(X) также абсолютно непрерывна, и её плотность имеет вид:

fY (y) = fX (g1(y))*|Jg1(y)|.

(1)

В одномерном случае:

 

fY (y) = fX (g1(y))*|d(g1(y))/dy|.

(2)

86

Рассмотрим обратную задачу. Пусть случайная величина Y имеет плотность вероятности fy (y), случайная величина ξ распределена

Y

равномерно на отрезке [0,1]. Составим уравнение ξ = f (y)dy =

0

= Fy (Y ). Области изменения величин ξ и F совпадают. Если суще-

ствует монотонная функция y = G(ξ) связи величины ξ и y, то приведенное уравнение однозначно определяет вид отображения, обратного к G(Y). Следовательно, искомое отображение G(ξ)=Fy1(Y). На рис. 13 приведена графическая интерпретация метода обращения.

Рис. 13. Метод обращения

На основании этой теоремы получим совокупность чисел {Yi}, которые обладают плотностью вероятности f (y). Для этого разрешим относительно Yi уравнение

87

Y

 

ξi = f (y)dy,

(3)

0

 

в котором величина ξi равномерно распределена на отрезке [0,1]. Пример 1. Пусть требуется получить случайные числа yi, с за-

коном распределения вида:

f ( y)=

1

, 0 < a ≤ y ≤ b < ∞.

(lnb lna) y

Решение: В силу соотношения (3) имеем:

 

yi

1

 

lnyi lna

 

xi =

dy =

,

(lna lnb) y

ln b lna

 

0

 

 

 

 

yi = exi(ln bln a)+ln a,

где случайная величина x распределена равномерно на отрезке

[0,1].

Пример 2. Рассмотрим экспоненциальный закон распределения вероятности случайных событий с плотностью f (x) e−λy. Тогда интегральный закон распределения вероятности имеет вид: F(y) =1e−λy. Составим уравнение: r =1e−λy. Выражая искомую

величину y из этого выражения, получаем: yi = 1λln (1r) . В

статиcтическом смысле (1 – r) и r распределены равномерно на ин-

тервале [0;1], следовательно

y =

1 ln r

определяет функциональ-

 

 

λ

 

ное отображение величин r и y с заданными статистическими свойствами. Следует отметить, что разрешить соотношение (3) относительно y в явном виде удается для ограниченного перечня случаев.

Рассмотрим реализацию данного примера в MATLAB: function method_2 %тело скрипта.

global p t eps max ds L aprox;

p=0;t=0;x=0;rnd=0; %обнулениемассивов p, t и rnd

eps=500; %количество генерируемых чисел

%чем больше, тем точнее получится %результат

88

max=10; %максимальное значение (определяет интервал) ds=max/eps; %расстояниемежду числами (точность) L=0.5; %коэффициент в распределении

aprox=50; %точностьгенерации

create_matrix; %создание матрицы p(t) – функция %распределения

for i=1:eps %генерация случайных чисел x(i)=(ceil(rand(1)*aprox))/aprox; %генерация

%равномерно распределенных чисел rnd(i)=-log(x(i))/L; %нахождение соответствия

%x(i) и rnd(i) – нормально

%распределенных случайных чисел

end

f=create_distribution_known_interval(rnd,0,1/ds);

plot(t,p,'--k',t,f,'k'); %рисуем график

title('Функция распределения'); %названиеграфика xlabel('x'); %названиеабсциссы

ylabel('F_x'); %название ординаты

hleg=legend('Ожидаемый результат','Результат эксперимента'); %включаем...

set(hleg,'Location','SouthEast'); %...легенду grid on; %включаемсетку

function create_matrix %функция, создающая матрицу

%с функцией p(t) – функция %распределения

global p t eps ds L;

for i=1:eps

t(i)=ds*i; %задание абсциссы p(i)=1-exp(-L*t(i)); %нахождение распределения

end

89

function f=create_distribution_known_interval (rnd, offset, approx) %функция, которая создает матрицу

%распределения. Принимает значения: %случайныечисла, распределение %которых будет искаться, смещение %началаотносительно нуля, обратная %величина точности чисел матрицы rnd

global j cnt;

cnt=0; %обнуление массива cnt для возможности %повторного запуска

rnd_sort=sortrows(rnd'); %сортировка значений...

rnd_sort=rnd_sort'; %...матрицы по возрастанию

for i=1:numel(rnd_sort)*approx %обнуление...

cnt(i)=0; %...массива cnt

end

j=1; %счетчик

rnd_sort=[rnd_sort 0]; %добавление крайнего элемента %необходимого для обработки

for i=2:numel(rnd_sort)

if rnd_sort(i) == rnd_sort(i-1) && i < numel(rnd_sort) %так как

числа

%сортированные, то когда %последовательно идущие числа равны...

j=j+1; %... то увеличиваем счетчик else %иначе...

cnt(floor((rnd_sort(i- 1)+offset)*approx+1))=j/numel(rnd_sort); %...находим

%вероятностьвыпадения текущего числа j=1; %«сбрасываем» счетчик

end end

90

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]