Добавил:
yurochka
Периодически делаю учебные работы по предметам ЛЭТИ и выгружаю их сюда для пополнения базы, с которой можно будет свериться.
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная 3 / Вариант_Распределение Вейбулла / Lab3 (1)
.pyimport math
import matplotlib.pyplot as plt
import numpy as np
import random
import time
class RandomFibon:
def __init__(self, k, m, debug=False):
self.k = k
self.m = m
if debug:
random.seed(0)
self.A = [random.randint(0, 2**m) for _ in range(17)]
else:
random.seed(time.time())
self.A = [random.randint(0, 2**m) for _ in range(17)]
if (k > 16 or m % 2 == 1):
raise Exception
def next(self):
x = (self.A[-1] + self.A[-self.k-1]) % 2 ** self.m
self.A.pop(0)
self.A.append(x)
return x / 2 ** self.m
r = RandomFibon(10, 32)
N = 10000
X = []
# Exponential
print("Exponential")
lambda_exp = 2
X.clear()
for i in range(N):
z = r.next()
X.append(-1 / lambda_exp * math.log(z))
M_expected = 1 / lambda_exp
D_expected = 1 / (lambda_exp ** 2)
M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
M_delta = abs((M - M_expected) / M_expected) * 100
D_delta = abs((D - D_expected) / D_expected) * 100
print(f"Эмпирические: {M = :.3f}, {D = :.3f}")
print(f"Теоретические: M = {M_expected:.3f}, D = {D_expected:.3f}")
print(f"Относительные погрешности: δM = {M_delta:.2f} %, δD = {D_delta:.2f} %")
plt.hist(X, bins=30, weights=np.ones_like(X) / len(X))
plt.subplots_adjust(top=0.99, bottom=0.08, left=0.08, right=0.92)
plt.savefig("ms3.exponential.svg")
plt.show()
# Uniform
print("\nUniform")
r = RandomFibon(10, 32)
A_uni = 4
B_uni = 5
X.clear()
for i in range(N):
z = r.next()
X.append(A_uni + (B_uni - A_uni) * z)
M_expected = A_uni + (B_uni - A_uni) / 2
D_expected = (B_uni - A_uni) ** 2 / 12
M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
M_delta = abs((M - M_expected) / M_expected) * 100
D_delta = abs((D - D_expected) / D_expected) * 100
print(f"Эмпирические: {M = :.3f}, {D = :.3f}")
print(f"Теоретические: M = {M_expected:.3f}, D = {D_expected:.3f}")
print(f"Относительные погрешности: δM = {M_delta:.2f} %, δD = {D_delta:.2f} %")
plt.hist(X, bins=B_uni*8, weights=np.ones_like(X) / len(X))
plt.savefig("ms3.uniform.svg")
plt.show()
# Erlang
print("\nErlang")
r = RandomFibon(10, 32)
k_erl = 3
lambda_erl = 2
X.clear()
for i in range(N):
X.append(-1 / lambda_erl * math.log(math.prod(r.next()
for j in range(k_erl))))
M_expected = k_erl / lambda_erl
D_expected = k_erl / (lambda_erl ** 2)
M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
M_delta = abs((M - M_expected) / M_expected) * 100
D_delta = abs((D - D_expected) / D_expected) * 100
print(f"Эмпирические: {M = :.3f}, {D = :.3f}")
print(f"Теоретические: M = {M_expected:.3f}, D = {D_expected:.3f}")
print(f"Относительные погрешности: δM = {M_delta:.2f} %, δD = {D_delta:.2f} %")
plt.hist(X, bins=30, weights=np.ones_like(X) / len(X))
plt.savefig("ms3.erlang.svg")
plt.show()
# Standard Normal
print("\nStandard Normal")
r = RandomFibon(10, 32)
X.clear()
for i in range(N // 2):
z1 = r.next()
z2 = r.next()
X.append(math.sqrt(-2 * math.log(z1)) * math.cos(2 * math.pi * z2))
X.append(math.sqrt(-2 * math.log(z1)) * math.sin(2 * math.pi * z2))
M_expected = 0
D_expected = 1
M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
D_delta = abs((D - D_expected) / D_expected) * 100
print(f"Эмпирические: {M = :.3f}, {D = :.3f}")
print(f"Теоретические: M = {M_expected:.3f}, D = {D_expected:.3f}")
print(f"Относительные погрешности: δD = {D_delta:.2f} %")
plt.hist(X, bins=40, weights=np.ones_like(X) / len(X))
plt.savefig("ms3.normal.svg")
plt.show()
# Weibull
print("\nWeibull")
r = RandomFibon(10, 32)
lambda_weib = 5
k_weib = 1.5
X.clear()
for _ in range(N):
X.append(lambda_weib * ((- math.log(1 - r.next())) ** (1 / k_weib)))
M_expected = lambda_weib * math.gamma(1 + 1 / k_weib)
D_expected = lambda_weib ** 2 * \
(math.gamma(1 + 2 / k_weib) - (math.gamma(1 + 1 / k_weib)) ** 2)
M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
M_delta = abs((M - M_expected) / M_expected) * 100
D_delta = abs((D - D_expected) / D_expected) * 100
print(f"Эмпирические: {M = :.3f}, {D = :.3f}")
print(f"Теоретические: M = {M_expected:.3f}, D = {D_expected:.3f}")
print(f"Относительные погрешности: δM = {M_delta:.2f} %, δD = {D_delta:.2f} %")
plt.hist(X, bins=40, weights=np.ones_like(X) / len(X))
plt.savefig("ms3.Weibull.svg")
plt.show()
Соседние файлы в папке Вариант_Распределение Вейбулла
