ГУАП
КАФЕДРА №41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
М.Н. Шелест |
|
|
|
|
|
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №1
ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ МЕТОДОМ МОНТЕ-КАРЛО
по курсу: Имитационное моделирование
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. №
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель работы
Изучение метода Монте-Карло, определение точности вычисления определенных
интегралов методом Монте-Карло.
Индивидуальный вариант
Индивидуальный вариант номер 10 в соответствии с таблицей 1.
Таблица 1 – Индивидуальный вариант задания
№ варианта |
a1 |
f1(t) |
a2 |
f2(t) |
a3 |
f3(t) |
|
|
|
|
|
|
|
10 |
7 |
1 |
-7 |
3 |
-21 |
1 |
|
|
|
|
|
|
|
Формула для результирующей функции индивидуального варианта ( = 1):
1 1( ) |
при |
< |
рез( ) = { 2 2( − ) |
при |
≤ ≤ 2 |
3 3( − 2 ) |
при |
> 2 |
Запишем математически анализируемую функцию, полученную из трех данных в индивидуальном варианте функций:
Константы:
1 = 7; 2 = −7; 3 = −21;
Функции:
1( ) = sin(2 ) + 12( − 1) = 4( − 1)2 − 1
3( − 2) = sin(2 ( − 2)) + 1
Результирующая функция: |
|
|
|
|
7 (sin(2 ) + 1) |
при |
< 1 |
рез = { |
−7 (4( − 1)2 − 1) |
при 1 ≤ ≤ 2 |
|
|
−21 (sin(2 ( − 2)) + 1) |
при |
> 2 |
2
Ход работы
1.Построили график функции fрез(t).
Для этого написали функцию ploting_rez_fun(), принимающую на вход 3 лямбда функции описывающие кусочки, из которых состоит результирующая функция и строит по ним . Код в соответствии с листингом 1. График результирующей функции в соответствии с рисунком 1. Полный код программы в соответствии с Приложением А.
Листинг 1 – Функция построения графика fрез(t)
def ploting_rez_fun(f1, f2, f3):
'''Построение графика результирующей функции'''
# Генерация последовательности для x1, x2, x3 t1 = np.arange(0,1,0.001)
t2 = np.arange(1,2,0.001)
t3 = np.arange(2,3,0.001)
plt.plot(t1,f1(t1),label='f1(t1)=7*(np.sin(2*np.pi*t)+1)') plt.plot(t2,f2(t2),label='f2(t2)=-7*(4*(t-1)**2-1)') plt.plot(t3,f3(t3) \
,label='f3(t3)=-21*(np.sin(2*np.pi*(t-2))+1)') plt.title("График результирующей функции") plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
Рисунок 1 – График результирующей функции
3
2.Аналитический расчет величины F.
3 |
1 |
2 |
∫ рез( ) = ∫ 7 (sin(2 ) + 1) + ∫ −7 (4( − 1)2 − 1)
0 |
0 |
1 |
3
7
+ ∫ −21 (sin(2 ( − 2)) + 1) = 7 − 3 − 21 = −16, (3)
2
3. Описание разработанной программы для вычисления определенного интеграла методом Монте-Карло (функция monte_carlo_integrate()).
Список использованных переменных функции monte_carlo_integrate() в
соответствии с таблицей 2.
Таблица 2 – Список используемых переменных функции monte_carlo_integrate()
Название |
Тип |
Описание |
переменной |
|
|
f1 |
Лямбда ф-ция |
Лямбда ф-ция описывающая fрез(t) на отрезке (-∞, 1) |
f1 |
Лямбда ф-ция |
Лямбда ф-ция описывающая fрез(t) на отрезке [1, 2] |
f1 |
Лямбда ф-ция |
Лямбда ф-ция описывающая fрез(t) на отрезке (2, +∞) |
rating |
Список чисел с |
Список результатов вычисления определенного |
|
плавающей |
интеграла методом Монте-Карло для разного кол-ва |
|
запятой |
экспериментов |
i |
Целое |
Итератор по степеням (2^i) кол-ва экспериментов |
frez |
Список чисел с |
Список значений функции fрез(t) при случайных |
|
плавающей |
значениях t |
|
запятой |
|
j |
Целое |
Итератор по номерам экспериментов |
x |
Число с |
Случайное значение переменной для функции fрез(t) |
|
плавающей |
|
|
точкой |
|
4
Блок-схема функции monte_carlo_integrate() в соответствии с рисунком 2.
Рисунок 2 – Блок-схема программы
5
Код программы в соответствии с листингом 2.
Листинг 2 – Функция вычисление величины F методом Монте-Карло
def monte_carlo_integrate(f1, f2, f3):
'''Вычисление величины F методом Монте-Карло'''
# Оценка интеграла при N=2^i экспериментах, где i = (0,14) rating = []
for i in range(0,15): frez = []
for j in range(2**i):
# Задание x рандомнного значения от 0 до 3 x = np.random.uniform(0,3)
if x < 1:
# Передаем x лямбда функции f1 frez.append(f1(x))
elif 1 <= x <= 2:
# Передаем x лямбда функции f2 frez.append(f2(x))
else:
# Передаем x лямбда функции f3 frez.append(f3(x))
# Формула оценки определенного интеграла rating.append(3 *sum(frez)/2**i)
for i in range(len(rating)):
print('2^', i, 'экспериментов\t-', rating[i]) return rating
4. |
Табличное представление результатов моделирования ̂( ) в соответствии с |
|
таблицей 3. |
|
|
|
Таблица 2 – Табличное представление результатов моделирования ̂( ) |
|
Количество экспериментов |
Значение определённого интеграла |
|
|
2^0 |
2.1699221512571873 |
|
2^1 |
6.0956847729296415 |
|
2^2 |
-13.910954150705507 |
|
2^3 |
-42.059936860691096 |
|
2^4 |
-7.306415171032224 |
|
2^5 |
-7.841852882742634 |
|
2^6 |
-19.593756524249276 |
|
2^7 |
-17.53332679591124 |
|
2^8 |
-15.432724307424184 |
|
2^9 |
-16.01359673319123 |
|
2^10 |
-15.693417236481626 |
|
2^11 |
-15.706073331959601 |
|
2^12 |
-14.509122547733494 |
|
2^13 |
-15.883139063649601 |
|
2^14 |
-16.16088621380723 |
6
5. График по рассчитанной таблице в соответствии с рисунком 3. Ось абсцисс представлена в логарифмическом масштабе по основанию 2. На графике отметили уровнем величину F.
Рисунок 3 – График зависимости оценки интеграла от количества экспериментов
7
Вывод
Входе данной лабораторной работы мы изучили метод Монте-Карло в приложении
квычислению определенного интеграла, для этого была разработана программа позволяющая произвести оценку определенного интеграла. Разработанная программ позволили эмпирически доказать, что с увеличением количества экспериментов точность метода Монте-Карло вырастает.
8
ПРИЛОЖЕНИЕ А. Код программы
from matplotlib import pyplot as plt from scipy import integrate
import numpy as np
def ploting_rez_fun(f1, f2, f3):
'''Построение графика результирующей функции'''
# Генерация последовательности для x1, x2, x3 t1 = np.arange(0,1,0.001)
t2 = np.arange(1,2,0.001)
t3 = np.arange(2,3,0.001)
plt.plot(t1,f1(t1),label='f1(t1)=7*(np.sin(2*np.pi*t)+1)') plt.plot(t2,f2(t2),label='f2(t2)=-7*(4*(t-1)**2-1)') plt.plot(t3,f3(t3) \
,label='f3(t3)=-21*(np.sin(2*np.pi*(t-2))+1)') plt.title("График результирующей функции") plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.show()
def integrete_fun(f1, f2, f3):
'''Вычисление интеграла от результирующей функции'''
fr = integrate.quad(f1, 0, 1)[0] |
\ |
|
+ integrate.quad(f2, |
1, 2)[0] |
\ |
+ integrate.quad(f3, |
2, 3)[0] |
|
print('Значение интеграла от результирующей функции:', fr) return fr
def monte_carlo_integrate(f1, f2, f3):
'''Вычисление величины F методом Монте-Карло'''
# Оценка интеграла при N=2^i экспериментах, где i = (0,14) rating = []
for i in range(0,15): frez = []
for j in range(2**i):
# Задание x рандомнного значения от 0 до 3 x = np.random.uniform(0,3)
if x < 1:
# Передаем x лямбда функции f1 frez.append(f1(x))
elif 1<=x<2:
# Передаем x лямбда функции f2 frez.append(f2(x))
else:
# Передаем x лямбда функции f3 frez.append(f3(x))
# Формула оценки определенного интеграла
9
rating.append(3 *sum(frez)/2**i)
for i in range(len(rating)):
print('2^', i, 'экспериментов\t-', rating[i]) return rating
def ploting_score_graph(rating, fr):
'''Построение графика зависимости оценки интеграла от количества экспериментов'''
plt.plot(range(len(rating)),rating,label='Оценка интегралла') plt.plot(range(len(rating)), [fr]*len(rating) \
,color='green',label='Значение результирующей функции') plt.title("График зависимости оценки интеграла от количества
экспериментов") plt.xlabel("i") plt.ylabel("f(x)") plt.legend() plt.show()
def main():
#Создание лямбда функции для f1(x), f2(x) и f3(x): f1 = lambda t: 7 *( np.sin( 2*np.pi*t )+ 1 )
f2 = lambda t: -7 *( 4*(t-1)**2 - 1 )
f3 = lambda t: -21 *( np.sin( 2*np.pi*(t-2) )+ 1 )
#Построение графика результирующей функции
ploting_rez_fun(f1, f2, f3)
#Вычисление интеграла от результирующей функции fr = integrete_fun(f1, f2, f3)
#Оценка интеграла при N=2^i экспериментах, где i = (0,14) rating = monte_carlo_integrate(f1, f2, f3)
#Построение графика зависимости оценки интеграла от количества экспериментов
ploting_score_graph(rating, fr)
if __name__ == "__main__": main()
10