
lab1
.pdf

1)Цель работы
Изучение метода Монте-Карло, определение точности вычисления определенных интегралов методом Монте-Карло.
Вариант 17
2)Ход работы
Функция была записана в математическом виде
( ) |
( |
( |
)) |
|
|||
|
{ |
( |
) |
|
|
|
Для решения была разработана программа, которая вычисляет, строит график результирующей функции. Функция изображена на графике, показанном на рисунке 1.
Рисунок 1 – График функции F(t)
2

Определенный интеграл ∫ ( ) был вычислен аналитически с
помощью функции analitic_integral. Результат представлен на рисунке 2.
Рисунок 2 – Аналитический расчет интеграла
Была реализована программа, вычисляющая величину F простейшим методом Монте-Карло при N=2i экспериментах, где i=0,…,14. На рисунке 3
показано табличное представление результатов моделирования.
Рисунок 3 – Полученные значения интеграла при методе Монте-Карло
Полученные значения строятся на графике для сравнения со значениями, полученными в ходе аналитического расчѐта. График представлен на рисунке 4.
3

Рисунок 4 – Сравнение функций F(t) и F^(N)
По построенному графику функций наглядно видно, что с увеличением количества экспериментов при вычислении интеграла при расчѐте по методу Монте-Карло, погрешность вычисления площади становится ниже. Это доказывает работу приведенного метода.
Код всей программы для вычисления и построения графиков представлен в Приложении.
3)Вывод
Входе данной лабораторной работы были изучены методы разные реализации метода Монте-Карло. Кроме того, для одной из них была разработана программа, осуществляющая оценку определѐнного интеграла данным методом. Также была выявлена закономерность уменьшения погрешности от увеличения объема выборки.
Входе работы проблем не возникло.
4

Приложение
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():
5

"""Вычисление площади по интегралу методом Монте-Карло"""
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()
6