В детстве мне крупно повезло. Когда я учился в восьмом классе, в нашем доме появился всамделишный компьютер ZX Spectrum 128, который подключался к нашему домашнему телевизору и позволял почувствовать себя программистом. После школы, кое-как разобравшись с уроками, я крепко залипал перед экраном и старался успеть до прихода родителей с работы (телевизор-то на всех один), сотворить что-нибудь сногсшибательное. Творил я тогда на неотъемлемом от компьютера, и даже от его клавиатуры, языке BASIC, а источником вдохновения служили журналы «Наука и жизнь», «Техника молодёжи» и «В мире науки» (перевод «Scientific American»), в которых к концу 80-х начали появляться регулярные рубрики для любителей ЭВМ. В результате многочасового сидения перед телевизором я ожидаемо приобрёл близорукость, однако вместе с очками пришла убеждённость в том, что математика, даже школьная, может быть безумно красивой и интересной!
В ноябрьском номере журнала «В мире науки» за 1986 год появилась статья, в которой рассказывалось, как с помощью очень простых вычислений можно генерировать на экране необычные, сложные и на удивление красивые картины. Речь в ней идёт о функциях на модулярных арифметиках, о динамических системах и клеточных автоматах. Среди прочих приводилась очень простая итерационная схема некоего Барри Мартина, опубликованная им ранее в статье «Graphic Potential of Recursive Functions»:
При многократном применении (итерациях) это преобразование из точки на плоскости порождает множество, обладающее причудливой и гармоничной структурой. Разнообразные картины можно получать, изменяя три параметра ,
и
, начальную точку и масштаб изображения. Цвет точек определяется шагом итерации. Алгоритм предельно прост:
x = 0, y = 0
a = 1, b = 3, c = 0
col = 0
while true
(x, y) = (y - sign(x)*sqrt(abs(b*x + c)), a - x)
col = col + 1
if col > 10000
поменять цвет точки
col = 0
end
нарисовать точку с координатами (x, y)
end
![Тот самый номер журнала до сих пор хранится в домашней библиотеке. В детстве мне крупно повезло.-2](https://habrastorage.org/getpro/habr/upload_files/97f/a04/211/97fa042116ce485e4c9cdccb463bc0c8.jpeg)
![В детстве мне крупно повезло.-2-2](https://habrastorage.org/getpro/habr/upload_files/2e7/886/90e/2e788690ea849f1e384eb6450690febb.jpeg)
![В детстве мне крупно повезло.-2-3](https://habrastorage.org/getpro/habr/upload_files/bf0/fbf/f4b/bf0fbff4bbd4b1d973a00a10969925d0.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/fa0/a2f/d63/fa0a2fd63b1079715c55edd01dd72289.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/27e/b66/604/27eb66604085856a8953cb3b8695e4e4.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/c23/96d/806/c2396d8060f980a01f655de1d639576e.png)
Этот способ генерации сложных картин настолько прост, что я смог реализовать его даже на мучительно медленном Спектруме, получая обалденные изображения, которые называл «салфетками». Ну, а сейчас я за часик набросал для вас интерактивный рисователь «салфеток Мартина», с которым вы можете поиграть сами. А вот тут реализован эффектный «полёт» сквозь это множество.
Я очень рекомендую этот способ генерации изображений тем, кто хочет заинтересовать детей программированием и математикой. Он очень легко кодируется на чём угодно и производит впечатление на зрителей.
Круто, а почему так?
Но что же такого таится в мартиновской формуле, что способно порождать эту красоту? Можно ли как-то объяснить все эти пузыри, ритмичные мотивы, перетекающие друг в друга симметрии? Как вообще анализируют подобные системы?
Занимается этим раздел математики, который называется теорией динамических систем, граничащий с теорией хаоса. Я не буду здесь глубоко влезать в теорию, сосредоточившись на объяснении основных структур, а больше даже — на красивых картинках.
Изобилие параметров в формуле Мартина излишне. Чтобы проявить все существенные свойства этого отображения, достаточно коэффициента , при фиксированных значениях
и
. Таким образом, мы рассмотрим упрощённое преобразование, которое обозначим как
:
Его, в свою очередь, можно представить композицией двух простых преобразований — нелинейного искажения , которое, не меняя координат
, сдвигает точки вдоль
, как показано на картинке ниже, и поворота на 90° против часовой стрелки
:
![Нелинейная трансформация и поворот, образующие преобразование . Нелинейная трансформация и поворот, образующие преобразование M.](https://habrastorage.org/getpro/habr/upload_files/a7d/3be/e65/a7d3bee656166e44007754bfc8dff18d.gif)
Коэффициент приобретает теперь вполне определённый смысл: он отвечает за масштаб нелинейного сдвига. Важной особенностью обоих этих преобразований является то, что они сохраняют площади, а значит и преобразование
, искажая пространство, не сжимает или растягивает его, а только сдвигает и поворачивает. Таким образом, при многократном применении преобразования, точки пространства перемешиваются, не стягиваясь в точку и не разбегаясь на бесконечность.
![Преобразования для Преобразования для b = 1](https://habrastorage.org/getpro/habr/upload_files/045/9eb/7da/0459eb7da4aa0c42e5fd6e5f9e1153ef.gif)
Перемешивание качественно объясняет появление хаотичных областей, в которых не угадывается какой-либо структуры. Однако куда больше хаоса наш глаз привлекают организованные структуры. Обратите внимание на то, как при перемешивании постепенно выявляются три каплеобразные области, которые переходят друг в друга не сильно изменяясь. Они называются резонансами и соответствуют точкам, которые циклично переходят друг в друга под действием нашего преобразования. Вокруг резонансных точек вместо перемешивания происходит только вращение пространства.
Резонансы возникают между поворотом , который имеет период 4 (через четыре поворота на 90 ° всё точки возвращаются на место) и смещениями нелинейного преобразования
. Из-за этого точки в разной степени недоворачиваются на положенные 90°, а поскольку смещение гладко и неравномерно, то большая часть точек никогда не вернётся на место, сколько их ни крути. Однако, каким-то точкам, всё-таки повезёт, и смещение с последующим поворотом сможет вернуть их через 2, 3, 5, 7 и более итераций. Это явление порождает точки, неподвижные для многократно применяемых преобразований, таких как
и так далее.
Теперь мы можем детально разобрать происхождение основных элементов «салфетки Мартина», рождающихся из различных начальных точек.
![Семейство траекторий для . Семейство траекторий для b = 1.](https://habrastorage.org/getpro/habr/upload_files/36e/499/7e9/36e4997e9203e66b667ace8db99e1008.png)
Хаотические облака происходят в результате перемешивания пространства, а внутри них располагаются «пузыри», окружающие резонансы различного порядка. Эти пустоты на самом деле не пусты, они заполнены кольцевыми орбитами, демонстрирующими не перемешивание, а вращение пространства. Поскольку смещение гладко, то соседи резонансных точек немного недоворачиваются на каждом цикле, и по мере накопления, результаты итераций заполняют замкнутую орбиту. Это недоворачивание окрестностей резонанса тоже может оказаться в резонансе с периодом преобразования
. В таком случае мы увидим, как овальная орбита сама распадается на цепочку полюсов более высокого порядка. Так на предыдущей картинке образовались симпатичные оранжевые колечки, четвёрками окружающие синие точки резонанса с периодом 17.
Между резонансами и хаотическими областями есть тесная связь. Резонансы порождаются так называемыми эллиптическими неподвижными точками преобразования , или полюсами, именно они окружены овальными траекториями. Но полюсы не могут появляться сами по себе: окружающие их овальные орбиты неизбежно пересекутся, образуя неподвижные точки другого типа — седловые точки. Эти точки неустойчивы, и соседние с ними точки под действием отображения
экспоненциально разбегаются от седловых точек в разные стороны. Именно это разбегание и порождает хаотические области, которые заполняют пространство между упорядоченными областями, окружающими полюсы. Дело в том, что постоянно разбегаясь от седловых точек, их окресности обречены всё время оказываться замкнутыми в пределах одной сложной структуры: странного аттрактора. Подробнее об этом я рассказывал в серии статей, посвящённых динамическому хаосу.
Седловые точки соединяются особыми орбитами — инвариантными гетероклиническими многообразиями. Звучит, может быть, непонятно, но, согласитесь, красиво. А выглядят эти многообразия ещё красивее!
При любом значении параметра преобразование
оставляет на месте линию
. Именно она и является инвариантным многообразием этого преобразования. После поворота, она превращается в линию
, и её отображение преобразованием
выявляет множество всех седловых точек и гетероклинических орбит, которые их соединяют. Смотрите, как красиво они выявляют тонкие структуры хаотических областей для различных значений параметра
:
![В детстве мне крупно повезло.-8](https://habrastorage.org/getpro/habr/upload_files/5e5/e5f/4fe/5e5e5f4fe8f73c8ac5105f94b600de65.png)
![В детстве мне крупно повезло.-8-2](https://habrastorage.org/getpro/habr/upload_files/7c1/54b/3f4/7c154b3f47f036d83013c496fce27ead.png)
![В детстве мне крупно повезло.-8-3](https://habrastorage.org/getpro/habr/upload_files/102/9f1/94b/1029f194bdb1d8ec2d2e70d412d00c2b.png)
![](https://habrastorage.org/getpro/habr/upload_files/e30/b01/eb5/e30b01eb5a89b088f8ed10508f9ea72a.png)
![](https://habrastorage.org/getpro/habr/upload_files/73e/564/eb5/73e564eb5d8b00fd4c97dbcb1d4486e6.png)
Наконец, к картине инвариантных многообразий можно добавить красок. Для этого наложим их на карту скоростей с которой каждая точка пространства удаляется от своих соседей под действием преобразования :
![](https://habrastorage.org/getpro/habr/upload_files/64f/31e/3ad/64f31e3adfbebe9cad697c8a46ffb49f.png)
![](https://habrastorage.org/getpro/habr/upload_files/d47/4ab/3af/d474ab3af9c97bec8f69fcf1aa24cb54.png)
![](https://habrastorage.org/getpro/habr/upload_files/212/158/197/212158197d67b9b3170901f5ce3ccdd8.png)
![](https://habrastorage.org/getpro/habr/upload_files/e18/734/1d6/e187341d6995a4bb34d8d46cf2212734.png)
![](https://habrastorage.org/getpro/habr/upload_files/27b/006/e10/27b006e10628a6d57ef51f383cfd66bd.png)
![](https://habrastorage.org/getpro/habr/upload_files/659/355/120/659355120439941cd02d8b81879ee23e.png)
![](https://habrastorage.org/getpro/habr/upload_files/dbd/ade/56f/dbdade56fcedb373986dfbae8a63dcde.png)
Для полноты картины здесь можно полюбоваться тем, что происходит с этой красотой при плавном изменении параметра (осторожно, тяжёлый GIF).
Ещё со времени моих экспериментов на Спектруме меня не переставало удивлять, как сухая математика позволяет получать элегантные и гармоничные картины, сравнимые по «креативности» с человеческой фантазией или творениями живой природы. Благодаря этому удивлению я и стал профессионально заниматься теорией динамического хаоса, которая помогает наслаждаться красотой не только внешней, но и внутренней — в логике и неожиданных взаимосвязях между разными объектами и концепциями.