Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab1

.pdf
Скачиваний:
0
Добавлен:
27.08.2024
Размер:
770.1 Кб
Скачать

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

Соседние файлы в предмете Имитационное моделирование