Добавил:
Периодически делаю учебные работы по предметам ЛЭТИ и выгружаю их сюда для пополнения базы, с которой можно будет свериться. Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
11.01.2026
Размер:
2 Кб
Скачать
import matplotlib.pyplot as plt
import numpy as np


class QCG:
    def __init__(self, k1, k2, a0, a1, m, c):
        self.k1 = k1
        self.k2 = k2
        self.Aprev = a0
        self.Ai = a1
        self.m = m
        self.c = c

    def next(self):
        t = self.Ai
        self.Ai = (self.k2 * t * t + self.k2 * self.Aprev + self.c) % self.m
        self.Aprev = t
        return self.Ai / self.m

    def check_first_repeat(self):
        seen = {self.Aprev: 0, self.Ai: 1}
        x = self.next()
        period = 2
        while x not in seen:
            seen[x] = period
            x = self.next()
            period += 1
        return period


class A:
    def __init__(self, xj, pj):
        self.z = QCG(4782, 3, 31, 67, 2**16, 2**11+1)
        self.xj = xj
        self.pj = pj
        self.Pj = [sum(pj[:i+1]) for i in range(len(pj))]

    def next(self):
        z = self.z.next()
        for p in range(len(self.Pj)):
            if z <= self.Pj[p]:
                return self.xj[p]


x = np.array([-87.8, -86.6, -15.7, 4.1, 22.1, 71.4, 98.8])
p = [0.044, 0.017, 0.140, 0.162, 0.153, 0.246, 0.238]
a = A(x, p)

X = []
N = 500
for i in range(N):
    X.append(a.next())

for i in range(30):
    print(X[i])

M = sum(X) / N
D = sum([x ** 2 for x in X]) / N - M ** 2
print(f"Эмпирические: M = {M:.2f}, D = {D:.2f}")

M_expected = sum([p[j] * x[j] for j in range(len(p))])
D_expected = sum([p[j] * x[j] ** 2 for j in range(len(p))]) - M_expected ** 2
print(f"Теоретические: M = {M_expected:.2f}, D = {D_expected:.2f}")


edges = (x[:-1] + x[1:]) / 2

bins = np.concatenate(
    ([x[0] - (edges[0] - x[0])], edges, [x[-1] + (x[-1] - edges[-1])]))

plt.hist([X, x], bins=bins,
         weights=[np.ones_like(X) / len(X), np.ones_like(x) * p],
         label=['Эмпирическое', 'Теоретическое'])
plt.legend(loc='upper left')
plt.savefig("ms2.svg")
plt.show()
Соседние файлы в папке Вариант 13