Упражнение на моделирование - Игла Бюффона на Python

Упражнение на моделирование — Игла Бюффона на Python

Приветствую, дорогие читатели! Сегодня мы поговорим о необычном и интересном эксперименте, который удивляет своей простотой и элегантностью. Знакомы ли вы с классическим примером вероятностного моделирования — задачей об Игле Бюффона? Если нет, то не переживайте. Мы разберем все детали этого эксперимента и покажем, как его можно реализовать на языке программирования Python. Вы увидите, как теория пересекается с практикой, и сможете сами провести этот эксперимент на своем компьютере.

Что такое Игла Бюффона?

Исторический контекст

Давайте начнем с небольшой истории. Задача об Игле Бюффона была предложена французским математиком Жоржем-Луи Леклерком де Бюффоном в 1777 году. Идея эксперимента проста: если вы бросаете иглу на пол, покрытый параллельными линиями, какова вероятность того, что игла пересечет одну из линий?

Основная идея

Итак, представьте себе пол, на котором нанесены параллельные линии с одинаковым интервалом. Бросаем на этот пол иглу длиной L. Задача заключается в том, чтобы выяснить вероятность того, что игла пересечет одну из этих линий. Это упражнение не только помогает лучше понять вероятностные процессы, но и дает возможность оценить значение числа π экспериментальным путем.

Математическая основа

Перед тем как перейти к программированию, важно понять математическую основу задачи. Давайте рассмотрим формулы, которые лежат в основе эксперимента.

Вывод формулы

Если d — расстояние между параллельными линиями, а L — длина иглы, то вероятность P пересечения иглой линии выражается формулой:

P = 2L / πd

При этом важно учитывать два случая:

  1. Ld
  2. L > d

Мы будем рассматривать первый случай, так как он более прост и распространен.

Реализация на Python

Теперь, когда у нас есть теоретическая база, давайте перейдем к практике и напишем код на Python.

Пишем код

Давайте шаг за шагом создадим программу, которая будет симулировать бросание иглы и вычислять вероятность пересечения линии.

import random
import math

def simulate_buffon_needle(num_trials, needle_length, line_distance):
    intersections = 0

    for _ in range(num_trials):
        # Центр иглы
        mid_point = random.uniform(0, line_distance / 2)
        # Угол падения иглы
        angle = random.uniform(0, math.pi / 2)
        # Половина длины иглы проецируемая на ось y
        y_proj = (needle_length / 2) * math.sin(angle)

        # Если половина длины иглы больше или равна расстоянию до ближайшей линии
        if y_proj >= mid_point:
            intersections += 1

    return (2 * needle_length * num_trials) / (line_distance * intersections) if intersections > 0 else 0

# Настройки эксперимента
num_trials = 1000000
needle_length = 1.0
line_distance = 2.0

# Запуск симуляции
estimated_pi = simulate_buffon_needle(num_trials, needle_length, line_distance)
print(f"Оценка числа π: {estimated_pi}")

Разбор кода

Давайте разберем, что делает каждая часть этого кода:

  1. Импорт библиотек: Мы импортируем random для генерации случайных чисел и math для математических функций.
  2. Функция simulate_buffon_needle: Эта функция выполняет основную работу по симуляции эксперимента.
  • Переменная intersections: Считает количество пересечений иглы с линиями.
  • Цикл for: Выполняет заданное количество бросков иглы.
  • Генерация mid_point и angle: Определяет случайную позицию центра иглы и угол падения.
  • Расчет y_proj: Вычисляет проекцию половины длины иглы на ось y.
  • Проверка пересечения: Увеличивает счетчик пересечений, если игла пересекла линию.
  1. Основной код: Определяет параметры эксперимента, запускает симуляцию и выводит результат.

Оптимизация и расширение

Улучшение точности

Как и в любом вероятностном эксперименте, чем больше бросков, тем точнее результат. Вы можете увеличить num_trials для повышения точности оценки числа π.

Визуализация

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

import matplotlib.pyplot as plt

def simulate_and_plot_buffon_needle(num_trials, needle_length, line_distance):
    intersections = 0
    x_data = []
    y_data = []

    for _ in range(num_trials):
        mid_point = random.uniform(0, line_distance / 2)
        angle = random.uniform(0, math.pi / 2)
        y_proj = (needle_length / 2) * math.sin(angle)

        if y_proj >= mid_point:
            intersections += 1
            x_data.append(mid_point)
            y_data.append(y_proj)

    estimated_pi = (2 * needle_length * num_trials) / (line_distance * intersections) if intersections > 0 else 0

    # Визуализация
    plt.figure(figsize=(10, 6))
    plt.scatter(x_data, y_data, alpha=0.5, s=0.5)
    plt.xlabel('Положение центра иглы')
    plt.ylabel('Проекция длины иглы')
    plt.title(f'Оценка числа π: {estimated_pi}')
    plt.grid(True)
    plt.show()

    return estimated_pi

# Запуск симуляции с визуализацией
estimated_pi_with_plot = simulate_and_plot_buffon_needle(num_trials, needle_length, line_distance)
print(f"Оценка числа π с визуализацией: {estimated_pi_with_plot}")

Разбор визуализации

Здесь мы добавили новые элементы:

  • Библиотека matplotlib: Импортирована для создания графиков.
  • Списки x_data и y_data: Сохраняют данные для графика.
  • Функция simulate_and_plot_buffon_needle: Дополнена визуализацией результатов.
  • Метод plt.scatter: Создает точечный график для визуализации бросков иглы.

Эксперимент с Иглой Бюффона — это не только увлекательный способ изучения вероятности, но и отличный пример того, как можно использовать программирование для решения математических задач. Мы рассмотрели историю, математическую основу и практическую реализацию этого эксперимента на языке Python. Теперь вы можете провести этот эксперимент самостоятельно, улучшить точность расчетов и даже визуализировать результаты.

Попробуйте поэкспериментировать с различными параметрами: измените количество бросков, длину иглы или расстояние между линиями. Это поможет вам лучше понять, как эти параметры влияют на результаты и, возможно, откроет новые интересные аспекты этой классической задачи.


Карпов Ярослав

Автор статьи:

Обновлено:

24.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *