Вы находитесь на странице: 1из 8

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Факультет прикладной математики и информатики

Кафедра математического моделирования и анализа данных

ШАГУН РОМАН ЭДУАРДОВИЧ

Отчет по компьютерному практикуму


( “Имитационное и статистическое моделирование”)
студента 4 курса 9 группы

Преподаватель
Лобач Виктор Иванович
доцент кафедры ММАД,
кандидат физ.-мат. наук

Минск 2020
Задание 1

1. Постановка задачи

Вариант 11:
Осуществить моделирование n=1000 реализаций БСВ с помощью
мультипликативного конгруэнтного метода (МКМ-датчика) при следующих значениях
параметров датчика:
β=a 0=32771 , M =231

2. Теоретическое обоснование

2.1 Мультипликативный конгруэнтный метод

Согласно этому методу псевдослучайная последовательность реализаций  1 ,...,  n


БСВ  определяется по рекуррентным формулам:

 t  t* / M ,  t* { t* 1 } mod M (t 1,2,...),

где  , M , 0* – параметры датчика (натуральные числа):  – множитель (  <M), M –


модуль,  0*  {1,..., M  1} – стартовое значение (нечётное число).
Операция y {z} mod M означает вычет числа z по модулю М:

y  z  M [ z / M ],

где [ x ] – целая часть числа x .


Период датчика Т M  1 ; коэффициент использования БСВ k =1. значения
параметров  ,  0* определяются из условия максимума периода Т. Значение М зависит от
способа представления целых чисел в ЭВМ. Типовые значения параметров:

M 2 31 2147483648,  0*   65539.

3. Реализация моделирования на Python


import random
from collections import Counter
from math import sqrt
from fractions import gcd
TWO = 2**31
CELL_SIZE = 20

def rng(x):
return (32771 * x) % TWO

def lcm(a, b):


return abs(a*b) // gcd(a, b)

def chi_square(random_values):
values_amount = dict(zip(Counter(random_values).keys(),
Counter(random_values).values()))

2
cells = {}
for i in range(0, CELL_SIZE):
cells[i] = 0

for rnd in values_amount.keys():


for i in range(0, CELL_SIZE):
if rnd < (i+1)/CELL_SIZE and rnd > i/CELL_SIZE:
cells[i] += values_amount[rnd]

expected_frequency = len(random_values)/CELL_SIZE
chi = 0
for frequency in cells.values():
chi += (frequency - expected_frequency)**2 / expected_frequency
return chi

def ks_test(random_values):
N = len(random_values)
D_plus =[]
D_minus =[]

random_values.sort()

for i in range(1, N + 1):


x = i / N - random_values[i-1]
D_plus.append(x)

for i in range(1, N + 1):


y =(i-1)/N
y =random_values[i-1]-y
D_minus.append(y)

D_plus = [sqrt(N) * num for num in D_plus]


D_minus = [sqrt(N) * num for num in D_minus]
return max(max(D_plus, D_minus))

4. Результат работы программы

Критерий согласия Пирсона выполняется:


Delta: 30.1435 χ 2 =25.7532<30 .1435=Δ
Xi2: 25.75324

Критерий согласия Колмогорова выполняется:


Delta: 1.63 √ n Dn= 1 . 232<1 . 63= Δ
Stat: 1.232

3
Задание 2

1. Постановка задачи
Вариант 11. К = 128
Осуществить моделирование n = 1000 реализаций БСВ с помощью метода
Макларена-Марсальи (один датчик должен быть мультипликативно
конгруентный (п.1), второй – на выбор).
K – объем вспомогательной таблицы.

2. Теоретическое обоснование

Метод основан на комбинировании двух простейших программных


датчиков БСВ (например, мультипликативных конгруэнтных).
Пусть псевдослучайные последовательности, {βt}, {ct} – порождаемые
независимо работающими датчиками; { αt } - результирующая псевдослучайная
последовательность реализаций БСВ; V = { V(0), V(1),...,V (K − 1)} --
вспомогательная таблица K чисел.
Процесс вычисления { αt } включает следующие этапы :
• первоначальное заполнение таблицы V :
V ( i ) = bi , i = 0,…,K − 1 ;
• случайный выбор из таблицы :
αt = V (s), s = [ct ⋅ K]; K];
• обновление табличных значений :
V(s) = bt + K , t = 0, 1, 2,... .
Данный метод позволяет ослабить зависимость между членами
псевдослучайной последовательности { αt } и получить сколь угодно большие
значения её периода Т при условии, что периоды Т1, Т2 исходных датчиков
являются взаимно простыми числами. Коэффициент использования БСВ для
данного датчика k =1/2 (за исключением первой реализации, для
моделирования которой используется K + 1 реализация).

3. Реализация моделирования на Python


import random
from collections import Counter
from math import sqrt
from fractions import gcd
TWO = 2**31
CELL_SIZE = 20

def rng(x):
return (32771 * x) % TWO

def lcm(a, b):

4
return abs(a*b) // gcd(a, b)

def chi_square(random_values):
values_amount = dict(zip(Counter(random_values).keys(),
Counter(random_values).values()))
cells = {}
for i in range(0, CELL_SIZE):
cells[i] = 0

for rnd in values_amount.keys():


for i in range(0, CELL_SIZE):
if rnd < (i+1)/CELL_SIZE and rnd > i/CELL_SIZE:
cells[i] += values_amount[rnd]

expected_frequency = len(random_values)/CELL_SIZE
chi = 0
for frequency in cells.values():
chi += (frequency - expected_frequency)**2 / expected_frequency
return chi

def ks_test(random_values):
N = len(random_values)
D_plus =[]
D_minus =[]

# Rank the N random numbers


random_values.sort()

# Calculate max(i/N-Ri)
for i in range(1, N + 1):
x = i / N - random_values[i-1]
D_plus.append(x)

# Calculate max(Ri-((i-1)/N))
for i in range(1, N + 1):
y =(i-1)/N
y =random_values[i-1]-y
D_minus.append(y)

# Calculate max(D+, D-)


D_plus = [sqrt(N) * num for num in D_plus]
D_minus = [sqrt(N) * num for num in D_minus]
return max(max(D_plus, D_minus))

def mclar(k):
V = []
b = []
c = [32771,]
result = []
for i in range(0, 1000):
c.append(rng(random_values[i]))
b.append(random.random())
c = [n / TWO for n in random_values]
for i in range(k):
V.append(b[i])
for i in range(k):
result.append(V[int(c[i]*k)])
V[int(c[i]*k)] = b[i+k]
return result
print(chi_square(mclar(128)))
print(ks_test(mclar(128)))

5
4. Результат работы программы
Критерий согласия Колмогорова выполняется:
Delta: 1.63 n Dn 0.316228  1.63  
Stati: 0.8263

Критерий согласия Пирсона выполняется:


Delta: 30.1435 χ 2 =13.875<30 .1435=Δ
Xi2: 13.875

Задание 3

1. Постановка задачи
Проверить точность моделирования обоих датчиков (п. 1 и п. 2) с помощью
критерия согласия Колмогорова и χ2-критерия Пирсона с уровнем
значимости ε = 0.05.

2. Теоретическое обоснование

2.2  2 - критерий согласия Пирсона

Пусть вычислены частоты { k } (k 1, K ) попадания выборочных значений


{xi } (i 1, n) в K ячеек гистограммы. Гипотетические вероятности попадания
значений  в ячейки гистограммы при истинной гипотезе H 0 и полностью
заданной функции F0 ( x) равны:
pk P{  xk  1 , xk )} F0 ( xk )  F0 ( xk  1 ), k 1, K ,
где {xl }(l 0, K ) - границы ячеек гистограммы.
Статистика критерия проверки гипотез H 0 : F ( x) F0 ( x), H1 H 0 :
F ( x) F0 ( x) имеет вид:
K
( k  n pk ) 2
 2  0
k 1 n pk
и характеризует взвешенную сумму квадратов уклонений частот { k } от
гипотетических значений {n pk } . Чем больше  2 , тем “сильнее” выборка X не
согласуется с H 0 .
Статистика имеет, в предположении, что гипотеза H 0 верна,  2 -
распределение с K  1 степенями свободы.
 2 - критерий Пирсона имеет вид:
 H 0 , если  2  ,
принимается гипотеза  2
 H1 , если  ,

6
где порог критерия  находится из ограничения на ошибку первого рода:
P{H1 | H 0 }  и имеет вид:  G  1 (1   ) , здесь G () - функция распределения
статистики.

2.3 Критерий согласия Колмогорова

Эмпирическая функция распределения по случайной выборке


X {x1 , x2 ,..., xn } реализаций СВ  определяется по формуле:
1 n
Fˆ ( x)   I[  , x ] ( xi ), x  R1 .
n i 1
Введём статистику
Dn sup | Fˆ ( x)  F0 ( x) | [0,1],
xR1

называемую расстоянием Колмогорова между Fˆ () и F0 () .


Известно, что гипотеза H 0 верна и n   (практически n  20 ), то
статистика nDn имеет распределение Колмогорова с функцией распределения
K ( y ) вида:

K ( y ) 1  2 ( 1) j  1 exp( 2 j 2 y 2 ), y 0 .
j 1

Критерий согласия Колмогорова представляет собой следующее


решающее правило:
 H 0 , если nDn  ,
принимается гипотеза 
 H1 , если nDn ,
Порог  K  1 (1   ) - квантиль уровня (1   ) распределения Колмогорова,
 - задаваемый пользователем уровень значимости.

3. Реализация на Python
def ks_test(random_values):
N = len(random_values)
D_plus =[]
D_minus =[]

# Rank the N random numbers


random_values.sort()

# Calculate max(i/N-Ri)
for i in range(1, N + 1):
x = i / N - random_values[i-1]
D_plus.append(x)

# Calculate max(Ri-((i-1)/N))
for i in range(1, N + 1):
y =(i-1)/N
y =random_values[i-1]-y
D_minus.append(y)

# Calculate max(D+, D-)


D_plus = [sqrt(N) * num for num in D_plus]
D_minus = [sqrt(N) * num for num in D_minus]

7
return max(max(D_plus, D_minus))

def mclar(k):
V = []
b = []
c = [32771,]
result = []
for i in range(0, 1000):
c.append(rng(random_values[i]))
b.append(random.random())
c = [n / TWO for n in random_values]
for i in range(k):
V.append(b[i])
for i in range(k):
result.append(V[int(c[i]*k)])
V[int(c[i]*k)] = b[i+k]
return result

Оценить