Добавил:
SuperciliousMe
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба 1 / 21_var
.pyimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.integrate import quad
# Функции для создания графика
f1 = lambda x: 10*(4*(x)**2 - 1)
f2 = lambda x: 15*(2/((x-1) + 1))
f3 = lambda x: -15*(2*(x-2) - 1)
# Функция создания исходного графика
def create_graph(x, y, fig):
fig = plt.figure(fig)
plt.plot(x, y, color='black')
plt.xlabel('Ось X')
plt.ylabel('Ось Y')
plt.title('График исходной функции')
plt.grid()
# Функция алгоритма Монте-Карло
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
# Функция графического представления результатов
def create_results(df, fig):
plt.figure(fig)
plt.plot(df.x, df.y, label='Монте-Карло', color='b')
plt.semilogx(base=2)
plt.plot(df.x, [F]*len(df.y), label='Теоретическое значение', color='r')
plt.legend()
plt.xlabel('Количество случайных чисел')
plt.ylabel('Значение интеграла')
plt.title('Сравнение результатов моделирования')
plt.grid()
if __name__ == '__main__':
# Базовые параметры
minimum, maximum, step, tau, size = 0, 3, 0.01, 1, 2**14
# Определение X и Y исходной функции
x = np.arange(minimum, maximum, step)
y = f1(np.arange(minimum, tau, step)).tolist()
y.extend(f2(np.arange(tau, 2*tau, step)))
y.extend(f3(np.arange(2*tau, maximum, step)))
# График исходной функции
create_graph(x, y, 1)
# Теоретическое значение величины интеграла
F = quad(f1, 0, 1)[0] + quad(f2, 1, 2)[0] + quad(f3, 2, 3)[0]
print(f'Теоретическое значение интеграла: {F}')
# Разработка и проверка программы примерного вычисления интеграла
pred_F = monteCarlo(N=size)
print(f'Приблизительное значение интеграла: {pred_F}')
# Табличное представление данных
min, max = 1, 15
x = np.logspace(min, max, base=2, num=14)
y = [monteCarlo(num) for num in x]
df = pd.DataFrame({'x': x, 'y': y})
print(f'\n{df}')
# Графическое представление результатов моделирования
create_results(df, 2)
plt.show()