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

ЛР / ЛР1 / ИМ ЛР1

.pdf
Скачиваний:
12
Добавлен:
25.06.2023
Размер:
425.08 Кб
Скачать

ГУАП

КАФЕДРА №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

Соседние файлы в папке ЛР1