
lab1
.docx
Цель работы
Изучение метода Монте-Карло, определение точности вычисления определенных интегралов методом Монте-Карло.
Вариант 17
Ход работы
Функция была записана в математическом виде
Для решения была разработана программа, которая вычисляет, строит график результирующей функции. Функция изображена на графике, показанном на рисунке 1.
Рисунок 1 – График функции F(t)
Определенный
интеграл
был
вычислен аналитически с помощью функции
analitic_integral.
Результат представлен на рисунке 2.
Рисунок 2 – Аналитический расчет интеграла
Была реализована программа, вычисляющая величину F простейшим методом Монте-Карло при N=2i экспериментах, где i=0,…,14. На рисунке 3 показано табличное представление результатов моделирования.
Рисунок 3 – Полученные значения интеграла при методе Монте-Карло
Полученные значения строятся на графике для сравнения со значениями, полученными в ходе аналитического расчёта. График представлен на рисунке 4.
Рисунок 4 – Сравнение функций F(t) и F^(N)
По построенному графику функций наглядно видно, что с увеличением количества экспериментов при вычислении интеграла при расчёте по методу Монте-Карло, погрешность вычисления площади становится ниже. Это доказывает работу приведенного метода.
Код всей программы для вычисления и построения графиков представлен в Приложении.
Вывод
В ходе данной лабораторной работы были изучены методы разные реализации метода Монте-Карло. Кроме того, для одной из них была разработана программа, осуществляющая оценку определённого интеграла данным методом. Также была выявлена закономерность уменьшения погрешности от увеличения объема выборки.
В ходе работы проблем не возникло.
Приложение
import matplotlib.pyplot as plt
import math
import random as rd
from scipy.integrate import quad
import pandas as pd
def plot_ft():
"""Построение графика функции F(t)"""
x=[0]
y=[]
while max(x)<=3:
if(max(x)<1):
y.append(round(16/(max(x)+1),2))
elif((max(x)>=1)and(max(x)<=2)):
y.append(round(8*math.sin(2*math.pi*(max(x)-1))+8,2))
elif(max(x)>2):
y.append(round(8-32*((max(x)-2)**2),2))
x.append(round(max(x)+0.1,2))
del x[-1]
plt.plot(x,y)
plt.title('Функция F(t)')
plt.xlabel('t')
plt.ylabel('F(t)')
plt.grid()
plt.show()
def analitic_integral():
"""Вычисление площади по интегралу аналитически"""
def integral1(t):
return 16/(t+1)
def integral2(t):
return 8*math.sin(2*math.pi*(t-1))+8
def integral3(t):
return 8-32*((t-2)**2)
return quad(integral1, 0, 1)[0] + quad(integral2, 1, 2)[0] + quad(integral3, 2, 3)[0]
def monte_karlo():
"""Вычисление площади по интегралу методом Монте-Карло"""
x_min=0
x_max=3
i_max=14
F=[]
# Итерация по i
for i in range(i_max+1):
N=2**i
a=0
# Итерация по количеству экспериментов
for _ in range(N-1):
rand_x=rd.uniform(x_min,x_max)
if rand_x<1:
a+=round(16/(rand_x+1),2)
elif rand_x>=1 and rand_x<=2:
a+=round(8*math.sin(2*math.pi*(rand_x-1))+8,2)
elif rand_x>2:
a+=round(8-32*((rand_x-2)**2),2)
# Запись результатов интегрирования
F.append((x_max-x_min)/N*a)
x=[]
y=[]
res_func = analitic_integral()
for i in range (i_max+1):
x.append(2**i)
y.append(res_func)
# Вывод результатов экспериментального моделирования
print(pd.DataFrame({'i для 2**i': list(range(0,i_max+1)), 'Оценка интеграла': F}))
# График, показывающий эффективность метода Монте-Карло по мере увеличения количества экспериментов
f, ax = plt.subplots(1)
ax.set_xscale('log', base=2)
ax.plot(x,F, label='Интеграл по Монте-Карло')
ax.plot(x,y, label='Интеграл аналитически')
ax.legend()
plt.title('Сравнение графиков F(t) и F^(N)')
plt.show()
plot_ft()
print('Аналитическое значение рез функции: ', analitic_integral())
monte_karlo()