ЛР1_ИМ
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
КАФЕДРА № 41
ЛАБОРАТОРНАЯ РАБОТА
ЗАЩИЩЕНА С ОЦЕНКОЙ
РУКОВОДИТЕЛЬ
ассистент |
|
|
|
М.Н. Шелест |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №1 |
ВЫЧИСЛЕНИЕ ОПРЕДЕЛЁННЫХ ИНТЕГРАЛОВ МЕТОДОМ МОНТЕ-КАРЛО |
по курсу: ИМИТАЦИОННОЕ МОДЕЛИРОВАНИЕ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4616 |
|
|
|
А.В. Павлов |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2019
Цель работы.
Изучение метода Монте-Карло. Определение точности вычисления определённых интегралов методом Монте-Карло.
Вариант задания.
Вариант №7.
Рисунок 1 – график функции fрез
Список использованных переменных:
Наименование переменной |
Тип данных |
Назначение |
real |
массив |
Хранение истинного значения интеграла |
emp |
массив |
Список интегралов полученных методом монте карло |
rnd_number |
массив |
Список случайных чисел |
x |
массив |
Список векторов 0.14 |
Листинг 1 – Код программы
import matplotlib.pyplot as plt import numpy as np import scipy.stats as st
#Функция f1 из задания def func1(t): return 10 * (2 / (t+1)) #Функция f2 из задания def func2(t): return 5 * (2 / t) #Функция f3 из задания def func3(t): return 2.5 * (2 / (t-1)) def main(): real =[] #Реальное подсчитанное значения интеграла emp = [] #Значения подсчитанные с помощью метода монте карло
for n in range(0,15): #Генерация рандомного списка rnd_number = st.uniform.rvs(loc=0, scale=3, size=2 ** n) for number in range(len(rnd_number)): if rnd_number[number] < 1 : #Проверка на условия из задания rnd_number[number] = func1(rnd_number[number]) #Меняем текущие значение из списка на подсчитанное с помощью функции elif 1<= rnd_number[number] <= 2: rnd_number[number] = func2(rnd_number[number]) else: rnd_number[number] = func3(rnd_number[number]) emp.append((3 / len(rnd_number)) * sum(rnd_number)) #Добавлением значение подсчитанное с помощью формулы монте карло real.append(24.26) #Добавленим реальное значение print_result(n,emp)
plot(emp,real) #Рисуем графики
def print_result(n,emp): result = 'Степень = {}, интеграл = {}' print(result.format(str(n),str(emp[n]))) # Вывод результата
def plot(emp,real): #Вывод графика Сравнение метода монте Карло и аналического расчета plt.figure(1) x = [i for i in range(0,15)] plt.plot(x, emp, label="Метод Монте-Карло") plt.plot(x, real,label="Аналитичиский расчет", lw = 4, color = 'red', alpha = 0.5 ) plt.title("Сравнение метода Монте-Карло с аналитичиским расчетом") plt.xlabel("Степень") plt.ylabel("Значение интеграла") plt.legend() plt.grid() #Рисуем график результирующий функции plt.figure(2) plt.fill_between(np.arange(0, 1, 0.001), [func1(x) for x in np.arange(0, 1, 0.001)], color = 'red') plt.fill_between(np.arange(1, 2.001, 0.001), [func2(x) for x in np.arange(1, 2.001, 0.001)], color = 'black') plt.fill_between(np.arange(2.001, 3.001, 0.001), [func3(x) for x in np.arange(2.001, 3.001, 0.001)], color = 'blue') plt.title("fрез") plt.grid() plt.show() main() |
|
Табличное представление результатов моделирования .
Количество экспериментов (Степень 2) |
Оценка интеграла |
0 |
32.88754291353669 |
1 |
13.727042337139656 |
2 |
29.52085937885841 |
3 |
31.039690389433837 |
4 |
23.58571286804264 |
5 |
24.66931992546377 |
6 |
21.467347708347884 |
7 |
24.301870818726254 |
8 |
25.131353567113408 |
9 |
23.9945143564691 |
10 |
25.37271127143026 |
11 |
24.478426627576326 |
12 |
24.15894018701584 |
13 |
24.350384743602454 |
14 |
24.323825239568144 |
График по рассчитанной таблице.
Рисунок 1 – График зависимости.
Выводы.
В ходе данной лабораторной работы мы изучили принципы реализации метода Монте-Карло, а так же написали программу в которой сравнили рассчитанные нами аналитическим путем данные с тем, что мы получили в результате работы нашей программы. Числа сошлись при увеличении выборки, что говорит нам о правильности работы нашей программы