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

lab1

.docx
Скачиваний:
1
Добавлен:
27.08.2024
Размер:
1.12 Mб
Скачать

  1. Цель работы

Изучение метода Монте-Карло, определение точности вычисления определенных интегралов методом Монте-Карло.

Вариант 17

  1. Ход работы

Функция была записана в математическом виде

Для решения была разработана программа, которая вычисляет, строит график результирующей функции. Функция изображена на графике, показанном на рисунке 1.

Рисунок 1 – График функции F(t)

Определенный интеграл был вычислен аналитически с помощью функции analitic_integral. Результат представлен на рисунке 2.

Рисунок 2 – Аналитический расчет интеграла

Была реализована программа, вычисляющая величину F простейшим методом Монте-Карло при N=2i экспериментах, где i=0,…,14. На рисунке 3 показано табличное представление результатов моделирования.

Рисунок 3 – Полученные значения интеграла при методе Монте-Карло

Полученные значения строятся на графике для сравнения со значениями, полученными в ходе аналитического расчёта. График представлен на рисунке 4.

Рисунок 4 – Сравнение функций F(t) и F^(N)

По построенному графику функций наглядно видно, что с увеличением количества экспериментов при вычислении интеграла при расчёте по методу Монте-Карло, погрешность вычисления площади становится ниже. Это доказывает работу приведенного метода.

Код всей программы для вычисления и построения графиков представлен в Приложении.

  1. Вывод

В ходе данной лабораторной работы были изучены методы разные реализации метода Монте-Карло. Кроме того, для одной из них была разработана программа, осуществляющая оценку определённого интеграла данным методом. Также была выявлена закономерность уменьшения погрешности от увеличения объема выборки.

В ходе работы проблем не возникло.

Приложение

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()

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