
3
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Проф., д.-р физ.-мат. наук |
|
|
|
Ю. В. Рождественский |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №3
Метод Монте-Карло
по курсу: Имитационное моделирование
СТУДЕНТКА ГР. № |
Z0411 |
|
03.02.25 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2025
Цель работы: вычисление числа пи методом Монте-Карло, использовать базовый генератор случайных чисел или собственный генератор из работы 2.
Ход работы:
В данной работе для вычисления числа π методом Монте-Карло будет использоваться собственный генератор случайных чисел, разработанный в предыдущей работе. Его результаты оказались вполне удовлетворительными, демонстрируя равномерное распределение и достаточную случайность значений, что позволяет применять его для поставленной задачи.
Метод Монте-Карло основан на использовании случайных чисел для приближенного решения математических и физических задач. В данном случае π вычисляется путем моделирования случайных точек в квадрате, содержащем четверть круга, и определения доли точек, попавших внутрь круга, относительно общего числа сгенерированных точек.
Этот метод эффективен для вычисления приближенных значений, особенно когда аналитическое решение затруднительно. С увеличением количества испытаний точность приближения улучшается, что делает метод Монте-Карло мощным инструментом в численных вычислениях.
Программный код вычисления числа Пи используя генератор случайных чисел из лабораторной работы 2 представлен в Листинге 1.
Листинг 1.
import numpy as np import matplotlib.pyplot as plt import seaborn as sns class UniformRandomNumberGenerator: def __init__(self, seed=None): if seed is not None: np.random.seed(seed) def generate_uniform_random(self, size=1): """Генерация случайных чисел с равномерным распределением на отрезке [0, 1]""" samples = [] for i in range(size): number = np.random.uniform(0, 1) # Нормализация значений samples.append(np.clip(number, 0, 1)) # Каждые 1000 значений, сглаживание 10% из них if (i + 1) % 1000 == 0: adjust_count = int(0.1 * 1000) # 10% из 1000 for j in range(adjust_count): samples[-(adjust_count - j)] *= 0.9 # Сглаживание, уменьшение на 10% samples[-(adjust_count - j)] = np.clip(samples[-(adjust_count - j)], 0, 1) return samples def estimate_pi(num_samples): """Оценка числа π методом Монте-Карло""" rng = UniformRandomNumberGenerator(seed=42) x_samples = np.array(rng.generate_uniform_random(num_samples)) y_samples = np.array(rng.generate_uniform_random(num_samples)) # Проверка, попадает ли точка внутрь круга inside_circle = (x_samples ** 2 + y_samples ** 2) <= 1 count_inside = np.count_nonzero(inside_circle) # Оценка π pi_estimate = 4 * count_inside / num_samples return pi_estimate, x_samples, y_samples, inside_circle def plot_monte_carlo_result(x_samples, y_samples, inside_circle): """Визуализация результатов метода Монте-Карло с контуром и цветом точек""" plt.figure(figsize=(8, 8)) # Нарисование точек с использованием прозрачности plt.scatter(x_samples[inside_circle], y_samples[inside_circle], color='green', s=10, alpha=0.6, label='Точки внутри круга') plt.scatter(x_samples[~inside_circle], y_samples[~inside_circle], color='red', s=10, alpha=0.6, label='Точки вне круга') # Добавление контура круговой области circle = plt.Circle((0, 0), 1, color='blue', fill=False, lw=2) plt.gca().add_artist(circle) plt.title('Метод Монте-Карло для оценки числа π') plt.xlabel('x') plt.ylabel('y') plt.gca().set_aspect('equal', adjustable='box') # Сохраняем соотношение сторон plt.grid() plt.axhline(0, color='black', lw=1, ls='--') plt.axvline(0, color='black', lw=1, ls='--') plt.legend() plt.show() def main(): num_samples = 10000 pi_estimate, x_samples, y_samples, inside_circle = estimate_pi(num_samples) print(f"Оценка числа π: {pi_estimate}") # Визуализация результатов plot_monte_carlo_result(x_samples, y_samples, inside_circle) if __name__ == "__main__": main()
Результат работы программы представлен на Рисунке 1.
Рисунок 1 - Результат вычислений
Вывод
В ходе выполнения работы было успешно реализовано вычисление числа π с использованием метода Монте-Карло на основе собственного генератора случайных чисел. Проведенный эксперимент продемонстрировал, что генератор обеспечивает достаточно равномерное распределение точек, что позволило получить приближенное значение π с приемлемой точностью.
Результаты вычислений подтвердили эффективность метода Монте-Карло: с увеличением числа испытаний точность приближения увеличивалась, всё ближе подходя к теоретическому значению π. Это свидетельствует о надежности как метода, так и разработанного генератора случайных чисел.
Таким образом, поставленная задача была успешно решена, а полученные данные соответствуют ожидаемым результатам, что подтверждает правильность реализации алгоритма.