Добавил:
SuperciliousMe
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба 1 / 17_var
.pyimport 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()