- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл 339
продумаем стратегию решения задачи. Результат покажет, что даже простейшая модель может позволить глубоко заглянуть в природу нашего бытия.
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
Возможность симулировать реальность представляет собой не такую уж отдаленную мечту. Физики использовали мощнейшие в мире суперкомпьютеры для реализации такого замысла, смоделировав поведение субатомной частицы в масштабе нескольких фемтометров (10–15 м). Несмотря на то что эта симуляция — попытка представить всего лишь малую толику мироздания, ее невозможно отличить от реальности — как мы эту реальность понимаем.
Сразу хочу вас успокоить: супермощный компьютер или научная степень в физике для решения следующей задачи вам не потребуются. Все, что нужно, — это модуль turtle, программа рисования, созданная специально для детей. Мы уже использовали turtle для симуляции миссии «Аполлон-8» в главе 6. Здесь же с ее помощью попытаемся понять основные особенности компьютерных моделей. А затем разработаем стратегию, аналогичную той, которую физики планируют применить для проверки гипотезы симуляции.
ЗАДАЧА
Определитьособенностикомпьютернойсимуляции,которыемогутбытьобнаружены теми, кто в ней участвует.
Код симуляции пруда
Код pond_sim.py создает на основе turtle симуляцию пруда, в котором есть островок, дрейфующее бревно и плавающая туда-сюда черепаха по имени Йертл. Черепаха будет периодически плавать к бревну и обратно. Код можно скачать с сайта книги по адресу https://nostarch.com/real-world-python/.
Модуль turtle включен в Python, так что устанавливать его не придется. Более подробную информацию об этом модуле вы найдете в разделе «Использование модуля turtle» на с. 171.
Импортируем turtle, настраиваем экран и рисуем остров
Код листинга 12.1 импортирует turtle, настраивает объект screen на использование в качестве пруда и рисует островок, откуда Йертл будет обозревать свои владения.
340 Глава 12. Находимся ли мы в компьютерной симуляции?
Листинг 12.1. Импорт модуля turtle, отрисовка пруда и островка pond_sim.py, часть 1
import turtle
pond = turtle.Screen() pond.setup(600, 400) pond.bgcolor('light blue') pond.title("Yertle's Pond")
mud = turtle.Turtle('circle') mud.shapesize(stretch_wid=5, stretch_len=5, outline=None) mud.pencolor('tan')
mud.fillcolor('tan')
После импорта модуля turtle присваиваем объект screen переменной pond. С помощью метода turtle setup() настраиваем размер экрана в пикселях, после чего устанавливаем цвет фона light blue. Таблицы цветов turtle и их названия можно найти на разных сайтах, например здесь: https://trinket.io/docs/colors. Присваиваем экрану название, чтобы завершить создание пруда.
Далее создаем круглый островок, на котором будет загорать Йертл. С помощью класса Turtle() инстанцируем объект turtle под названием mud. Несмотря на то что в turtle есть метод для рисования кругов, проще передать конструктору аргумент 'circle', который создаст круг в turtle. Однако он слишком мал для островка, поэтому с помощью метода shapesize() мы его растягиваем. Завершаем создание острова, определяя его контуры и устанавливая цвета заполнения как 'tan'.
Рисуем бревно, отверстия от сучка и черепаху Йертл
Листинг 12.2 рисует бревно с отверстием от сучка и черепаху Йертл, после чего перемещает Йертл так, чтобы та плыла от островка к бревну.
Листинг 12.2. Отрисовка бревна и черепахи с последующим ее перемещением pond_sim.py, part 2
SIDE = 80
ANGLE = 90
log = turtle.Turtle() log.hideturtle() log.pencolor('peru') log.fillcolor('peru') log.speed(0)
log.penup() log.setpos(215, -30) log.lt(45) log.begin_fill()
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл 341
for _ in range(2): log.fd(SIDE) log.lt(ANGLE) log.fd(SIDE / 4) log.lt(ANGLE)
log.end_fill()
knot = turtle.Turtle() knot.hideturtle() knot.speed(0) knot.penup() knot.setpos(245, 5) knot.begin_fill() knot.circle(5) knot.end_fill()
yertle = turtle.Turtle('turtle') yertle.color('green') yertle.speed(1) # Самая медленная yertle.fd(200)
yertle.lt(180)
yertle.fd(200)
yertle.rt(176)
yertle.fd(200)
Бревно мы изобразим как прямоугольник, поэтому начинаем с присваивания двух констант, SIDE и ANGLE. Первая задает длину бревна в пикселях, а вторая — угол в градусах, на который мы будем поворачивать черепаху-указатель в каждом углу прямоугольника.
По умолчанию все черепашки-указатели появляются в середине экрана в координатах (0, 0). Поскольку бревно мы помещаем в стороне, то после инстанцирования объекта log используем метод hideturtle(), чтобы сделать указатель невидимым. Таким образом, нам не придется наблюдать его передвижение по экрану в процессе рисования.
Делаем бревно коричневым, используя для цвета значение peru. Затем устанавливаем speed объекта на максимум (странно, но это 0). Так мы ускорим его отрисовку. А для того чтобы не видеть путь, который он проделывает от центра экрана к своей точке, отключаем его отрисовку методом penup() .
С помощью метода установки позиции setpos() помещаем бревно справа на экране. Затем поворачиваем объект на 45 градусов и вызываем метод begin_fill().
Можно сократить код на несколько строк, нарисовав прямоугольник с помощью цикла for . Мы сделаем два цикла, каждый рисует по две стороны фигуры. Устанавливаем для бревна ширину в 20 пикселей, поделив SIDE на 4. После цикла вызываем end_fill, закрашивая его в коричневый цвет.
342 Глава 12. Находимся ли мы в компьютерной симуляции?
Сделаем изображение бревна более реалистичным, добавив отверстие от сучка, для этого используем указатель knot. Чтобы нарисовать это отверстие, вызываем метод circle() и передаем ему значение 5, устанавливая радиус в 5 пикселей. Обратите внимание, что задавать цвет для отверстия не нужно, так как он по умолчанию будет черным.
Теперь нарисуем Йертл, владыку пруда. Йертл уже стара, поэтому установим скорость ее отрисовки на минимум, указав 1. Далее зададим ее заплыв к бревну и обратно. У Йертл старческий маразм, и она забывает, что только что делала, поэтому обратно мы отправим ее спиной вперед, только теперь сделаем уклон, чтобы она смотрела не точно на восток . Запускаем программу — у нас должен получиться результат, показанный на рис. 12.1.
Посмотрите на рисунок внимательно. Хотя эта симуляция и проста, она позволяет понять, пребываем ли мы, подобно черепахе Йертл, в компьютерной симуляции.
Рис. 12.1. Скриншот готовой симуляции
Следствия симуляции пруда
Из-за ограниченности вычислительных ресурсов всем компьютерным симуляциям требуется некий «каркас», на который они смогут «навесить» свою модель реальности. Независимо от того, назовем мы его сеткой, решеткой, матрицей или как-то иначе, он даст нам возможность распределять объекты в 2D- и 3D-пространстве и присваивать им свойства, например массу, температуру, цвет и пр.
Проект #16. Жизнь, Вселенная и пруд черепахи Йертл 343
В качестве системы координат, а также для сохранения свойств модуль turtle использует пиксели монитора. Их расположение определяет формы, например контуры бревна, а цвета пикселей позволяют отличить одну фигуру от другой.
Пиксели формируют ортогональный шаблон, подразумевающий, что строки и столбцы пикселей пересекаются под правильными углами. Несмотря на то что каждый пиксель имеет квадратную форму и очень мал, с помощью метода turtle dot() удается генерировать изображение, как в следующем сниппете:
>>>import turtle
>>>t = turtle.Turtle()
>>>t.hideturtle()
>>>t.penup()
>>>
>>>def dotfunc(x, y): t.setpos(x, y)
for _ in range(10): t.dot() t.fd(10)
>>>for i in range(0, 100, 10): dotfunc(0, -i)
Врезультате мы получим шаблон, как на рис. 12.2.
Рис. 12.2. Ортогональная сетка из черных точек, представляющих центры квадратных пикселей
В мире turtle пиксели, как и настоящие атомы, неделимы. Линия не может быть короче одного пикселя. Движение реализуется только целым числом пикселей (хотя значение с плавающей точкой ошибку не вызовет). Минимальный объект тоже представлен одним пикселем.
Следствие из этого таково: сетка в симуляции определяет наименьший признак, который мы можем наблюдать. Поскольку человечеству уже известны невероятно крохотные субатомные частицы, то сетка, если мы находимся в симуляции, должна быть чрезвычайно мелкой. Это и заставляет многих ученых сомневаться в действительности такой гипотезы, так как для реализации подобной симуляции потребовался бы чудовищный объем компьютерной памяти. И все же, кто знает, какими возможностями обладали наши далекие предки или инопланетяне?