Скачиваний:
5
Добавлен:
05.01.2024
Размер:
2.54 Кб
Скачать
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.integrate import quad

# Функции для создания графика
def f1(t):
    return 8*(2/(t+1))
def f2(t):
    return 8*(np.sin(2*np.pi*(t-1))+1)
def f3(t):
    return -8*(4*((t-2)**2)-1)

# Функция алгоритма Монте-Карло
def monteCarlo(N):
    random_nums = np.random.uniform(0, 3, int(N))
    y = []
    for num in random_nums:
        if num < 1:
            y.append(f1(num))
        elif 1 <= num < 2:
            y.append(f2(num))
        else:
            y.append(f3(num))
    pred_F = (3 / N) * np.sum(y)
    return pred_F


# Базовые параметры
t = np.arange(0, 3, 0.01)   # Переменная T
y1, y2, y3 = [], [], []     # Переменная Y
for t_i in t:
    if t_i < 1:
        y1.append(f1(t_i))
        y2.append(np.nan)
        y3.append(np.nan)
    elif 1 <= t_i <= 2:
        y1.append(np.nan)
        y2.append(f2(t_i))
        y3.append(np.nan)
    else:
        y1.append(np.nan)
        y2.append(np.nan)
        y3.append(f3(t_i))

# Построение базовой функции
fig = plt.figure(1)
ax = fig.add_subplot(1, 1, 1)
ax.plot(t, y1)
ax.plot(t, y2)
ax.plot(t, y3)
ax.set_title('Исходная функция')

# Аналитическое вычисление интеграла
F = quad(f1, 0, 1)[0]  + quad(f2, 1, 2)[0] + quad(f3, 2, 3)[0]
print(f'\nАналитическое значение интеграла: {F}')

# Разработка и проверка программы примерного вычисления интеграла
size = 2**14
pred_F = monteCarlo(N=size)
print(f'Приблизительное значение интеграла: {pred_F}')

# Табличное представление данных
min, max = 1, 15
x = np.logspace(min, max, base=2, num=15)
y = [monteCarlo(num) for num in x]
df = pd.DataFrame({'x': x, 'y': y})

print(f'\n{df}')

# Графическое представление результатов моделирования
plt.figure(2)
plt.plot(df.x, df.y, label='Монте-Карло')
plt.semilogx(base=2)
plt.plot(df.x, [F]*len(df.y), label='Истинное значение')
plt.legend()
plt.xlabel('Количество случайных чисел')
plt.ylabel('Значение интеграла')
plt.title('Сравнение результатов моделирования')

plt.show()
Соседние файлы в папке Лаба 1