Общего между фракталами и голографией

Продолжим тему бильярдных фракталов.

jbkindqzsklr0ly3xblx8lkrgfc.png

В статье присутствуют Gif (трафик!) и контрастные картинки. У эпилептиков может случиться эпилептический припадок.

Предыдущие части: 0, 1, 2.

Для начала вспомним, что за «бильярдные фракталы».

Бильярдные фракталы.

Есть у нас некоторая прямоугольная область («бильярд»), в которой движется бильярдный шар (или луч света).

jvjfwhbyinonpkoh0orhozxc-_k.png

Шар упруго отражается от стенок по законам оптики (угол отражения равен углу падения). При этом шар бесконечно мал (абстрактная «материальная точка» из физики) и при движении и отражении скорости не меняет (скорость нас вообще не интересует).

Когда шар касается одной из выбранных стенок (не важно, какую стенку выбирать, но для примера выберем верхнюю) — фиксируем, в какую сторону движется шар — в левую или в правую:

7f5ufotnextd8w4gxo-8gsflmfc.png

gsmr3ld3pj8ids2poajw8xlewi8.png

Для бильряда, соотношение сторон которого — иррациональное число, последовательность отражений — фрактальная (насколько этот термин применим к двоичным последовательностям). Или фракталообразующая. Если визуализировать такую последовательность с помощью черепашьей графики, мы получим фрактал.

В качестве примера можем использовать последовательность для бильярда, соотношение сторон которого равно $\sqrt {2}$.

Строить такие последовательность очень легко:

$Q_x=\lfloor x\sqrt {2} \rfloor \; (\textrm{mod} \; 2); \quad x=0,1,2,…$

Берем поочередно каждое целое число $x$, умножаем на $\sqrt {2}$, отбрасываем дробную часть и отмечаем четные целые части единицами, а нечетные — нулями.

JavaScript
let a=[];
for(let x=0;x<100;x++) a[x]=Math.floor(x*Math.sqrt(2))%2;
console.log(a.join(''));

Первые 100 элементов этой последовательности:

0100110110010011001001101100110110010011011001101100100110010011011001001100100110110011011001001100

Визуализация этой последовательности с помощью черепашьей графики дает нам следующую фигуру:

kan-l4lbqdwkd0eqibmgcfcvydu.png

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

В реальном мире.

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

Пример 1. Есть у нас два человека. Один побольше, второй — поменьше:

sfj7cnpwsfr4qih-kucjbgk5g88.jpeg

Эти два человека идут по улице. У высокого шире шаг, чем у низкого. Чтобы успевать за высоким, низкому приходится быстрее ногами двигать и больше шагов делать. В каждый момент времени, когда низкий ставит правую ногу на асфальт, фиксируем какая нога высокого находится в воздухе — левая или правая. Если частоты шагов низкого и высокого несинхронизированные — получим фрактальную последовательность.

Пример 2. Вокруг некоторой планеты вращается спутник:

brsstkwrsvqssdohsfvrgfmymwm.jpeg

Выбираем временной интервал $t$ произвольной длинны. Фиксируем в каком полушарии находится спутник в момент времени $t, 2t, 3t, ...$ — в южном или северном. Последовательность этих положений будет фрактальной, если соотношение длинны выбранного интервала с длинной интервала, за который спутник совершает полный оборот вокруг оси — иррациональное число.

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

Дискретизация линейной функции.

p6jsqtpd_jtmuwkbum24g5gm7i8.png

Для бильярда, соотношение сторон которого равно $k$, строим график функции $y=kx$. Целые числа, отмеченные на оси $y$, делят плоскость на чередующиеся полосы (поочередно помечаем полосы единицами и нулями). Целыми числами на оси $x$ отмечаем, через какую полосу проходит график функции — через полосу помеченную единицей или нулем.

Фактически, все что мы сделали, чтобы получить фрактальную последовательность — дискретизировали линейную функцию с иррациональным коэффициентом $k$. Если фрактальную последовательность можно получить дискретизацией линейной функции, первым делом напрашивается вопрос —, а какую последовательность можно получить дискретизацией нелинейной функции?

Но прежде, чем переходить к нелинейным функциям, хотелось бы упомянуть об одном интересном наблюдении, сделанном в процессе написания статьи.

Об одном интересном наблюдении.

Дабы не нарушать структуру статьи…
Черепашья графика — не единственный способ визуализации двоичных последовательностей. Существует еще один способ, которому посвящена отдельная статья Фракталы в иррациональных числах. Часть 2. Вспомним этот способ.

Возьмем нашу последовательность:

$Q_x=\lfloor x\sqrt {2} \rfloor \; (\textrm{mod} \; 2); \quad x=0,1,2,…$

И построим из нее другую последовательность:

$a_x=\begin{cases}a_{x-1}+1, & \text{for } Q_x=1;\\a_{x-1}-1, & \text{for } Q_x=0;\end{cases}\; \quad x=0,1,2,…$

Первый элемент последовательности — произвольное число. Каждый следующий элемент — увеличиваем предыдущий элемент на 1, если соответствующий элемент первой последовательности ($Q$) равен 1, или уменьшаем на 1 — если соответствующий элемент равен 0.

JavaScript
	let a=[50];
	for(let x=1;x

После чего можем построить фрактальную кривую, отметив на графике точки с координатами $(x, a_x)$:

JavaScript
	for(let x=0;x

ywca3fptp_twj3mnj8licu06rma.png

Из этой же кривой можем получить фрактальную поверхность. Для каждой точки $(x, y)$ считаем $z=a_x+a_y$.

Дальше можем сделать срез плоскости по оси $z$:

hklgtfrha_g6f32flh3hrz8jqhi.gif

Или отметить такие точки, для которых $z(\textrm{mod} \; 4)=0;$ или $z(\textrm{mod} \; 4)=1;$

ohii4hsutvssloqblbvswdqjxly.png

Следующая картинка — чем больше $z$, тем ярче пиксель:

jjc1farjzke02ooyxkyjv2x4ros.png

Можем немного изменить последовательность:

$a_x=\begin{cases}a_{x-1}+\{x\sqrt {2}\}, & \text{for } Q_x=1;\\a_{x-1}-(1-\{x\sqrt {2} \}), & \text{for } Q_x=0;\end{cases}\; \quad x=0,1,2,…$

Раскрыв скобки, получим:

$a_x=\begin{cases}a_{x-1}+\{x\sqrt {2}\}, & \text{for } Q_x=1;\\a_{x-1}+\{x\sqrt {2} \}-1, & \text{for } Q_x=0;\end{cases}\; \quad x=0,1,2,…$

Здесь $\{x\sqrt {2}\}$ — дробная часть, которую мы ранее отбрасывали.

Как это выглядит в бильярдной модели? Мы увеличиваем предыдущий элемент последовательности на расстояние (по оси $x$) между правой границей и точкой касания шара верхней границы, если шар двигался влево. Или же уменьшаем на расстояние между левой границей и точкой касания шара верхней границы, если шар двигался вправо:

xfeikada1ssvsqkeu9ksi_twnts.png

l1p6cdzksajczyviclzq6zkxg1e.png

JavaScript
	let c, arr=[0];
	for(let i=1;i

После раскрытия скобок:
	let c, arr=[0];
	for(let i=1;i
На самом деле…
Достаточно:
	let c, arr=[0];
	for(let i=1;i

В этом случае поверхность получится гладкой, а не фрактальной.

Делаем визуализацию тем же способом, который использовали выше. Для каждой точки $(x, y)$ считаем $z=a_x+a_y$. Получили поверхность. Раскрашиваем. Чем больше $z$, тем ярче пиксель:

i0a-hbahpsxy0lcjnlhcasolkes.png

До того, как мы изменили последовательность, все $z$ были целыми числами. Теперь — иррациональные. Сделать $z(\textrm{mod} \; 4)$ не получится. Но можем найти некоторую плоскость, которая находится на одинаковом расстоянии от максимальной и миниальной $z$ и посмотреть на точки, которые лежат ниже и выше этой плоскости:

ew6i1xsfz6itokwbbn264ma3bnk.png

Самое интересное получится, если мы отметим пиксели, для которых $\lfloor zk \rfloor \; (\textrm{mod} \; 2) =1;$. Другими словами, отмасштабируем $z$, умножив на некоторое число $k$, после чего отбросим дробную часть и проверим четность целой части. Для некоторых $k$:

478:
lswjzxuhbgr8irovy6urvj236tm.png

338:
slvah7ejjitbr9xllgh2qin7jxw.png

Получаем замечательные круги. Примечательно, что круги получаем для $k$ равных числителю или знаменателю дроби, дающей приближенное значение $\sqrt{2}$

$\frac{478}{338}\approx\sqrt{2}$

Для других $k$:

144:
jadijema4eklj9igfetdmcnxzvs.png

354:
t-yjdf908qlosm8n2ogauj696sa.png

Замечательные круги не получаем.

Здесь можно посмотреть в динамике, поводив мышкой по экрану.

Вернемся к дискретизации нелинейных функций.

Дискретизация нелинейной функции.

Например $y=kx^b$, где $b$ — действительное число. Самый простой пример — парабола ($y=kx^2$).

m034tdqelex3xu8ha4hznxr8m1k.png

Строим последовательность:

$Q_x=\lfloor x^{2}\sqrt {2} \rfloor \; (\textrm{mod} \; 2); \quad x=0,1,2,…$

JavaScript
let a=[];
for(let x=0;x<100;x++) a[x]=Math.floor(x*x*Math.sqrt(2))%2;
console.log(a.join(''));

Для целых аргументов $x$, записываем четность целой части (отбросив дробную) значения функции.

Первые 100 элементов этой последовательности:

0110010100111110000011000100010100000001010011010110001100101001010011111000000000100110111111111000

Визуализация этой последовательности с помощью черепашьей графики дает такую кривую:

vjjdalrj7iml-e3nxtcqdxsu-qo.png

Эта последовательность выглядит немного более хаотичной, чем последовательность, полученная дискретизацией линейной функции. Но это не так. Если где-то не видим закономерность — значит плохо смотрим. Можем сделать очень простую визуализацию. Запишем первые 1000 элементов последовательности в блокнот, включим перенос строк.

vnx4azmmgyxnb1strxlvb9tweju.png

Можно разглядеть паттерн.

Для того, чтобы лучше разглядеть, единички заменяем на █, нолики — на ░:

g9drgn2ablachxbtmylt8tkvkrg.png

Построим двухмерный график этой последовательности. На каждой следующей строчке $y$ последовательность сдвигается на $ky$ (где $k$ — целое число, константа) позиций влево. Перепишем $x^2$ как $(x+ky)^2$.

Для некоторых $ky$:

35:
vt_y_hrv8xldcv-hm__e0uwo2cu.png

661:
p4m_vvpzn6dwyu3m6pjugss984s.png

Для $(x+ky)^2$ можем раскрыть скобки, получим $x^2+2kxy+(ky)^2$. Получили уравнение поверхности.

Дискретизация поверхностей с ненулевой кривизной.

Для дальнейших экспериментов запишем уравнение в более общем виде:

$z=a(x^2+bxy+cy^2)^d$

Точно так же, как мы дискретизировали линейную функцию, мы можем дискретизировать поверхности второго порядка. Для этого считаем $z$ для каждого $x$ и $y$, после чего умножаем $z$ на иррациональное число, отбрасываем дробную часть, проверяем четность целой части — $\lfloor z\sqrt {2} \rfloor \; (\textrm{mod} \; 2)$

Для $b=0, c=1, d=1$ наше уравнение принимает вид:

$z=a(x^2+y^2)$

Это уравнение элиптического параболоида. Коэффициент $a$ определяет, насколько параболоид вытянут по оси $z$. Для $a=1$:

joksvtycb32dkqjrtnbyk2tklwq.png

JavaScript
for(var x=0;x

Для $a=1/512$ получаем такой паттерн:

jmi0padbl06lf5ahitbepkcfxqa.png

Можем этот же паттерн нарисовать недискретным. Вместо $\lfloor z\sqrt {2} \rfloor \; (\textrm{mod} \; 2)$ считаем $\sin(z\pi \sqrt {2})$. Значение функции масштабируем (прибавляем 1, умножаем на 128) и используем в качестве яркости пикселя:

hzirjkt-geoqk3urwrnq2gyknfo.png

Для $a=1/128$, дискретный и недискретный варианты:

i5-fclddtotjsdm-udsaadhgos8.png

rlvuxyp6iiexnmcwqui2wdv3eow.png

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

1xio43ptkrwdgggnmpgrwyrf_fs.gif

Коэффициент $c$ сжимает или растягивает паттерн по оси $y$. Для $c=2$ и $c=0.2$:

kjz0goeeo-kizinm5enjy98usi0.png

maf2kwt3dayiojxqds6xxbo60jw.png

Коэффициент $b$ сжимает или растягивает паттерн по диагонали. Для $b=1.5$ и $b=-1.5$:

htk92k5t1bcmbvtzkbnwcb0lh7y.png

jj9jtxuyevzvx6ftla7bd7csb-m.png

Дальше. Для $b=0, c=-1, d=1$ наше уравнение принимает вид:

$z=a(x^2-y^2)$

Это гиперболический параболоид — поверхность с отрицательной гауссовой кривизной:

lc1wafq1kvkiqf9ogmouu43xjc4.png

Для $a=1/512$:

a6dw4yxhwytim-mhlglkqfx7h1k.png

Для $a=1/128$:

yv6s33hromo-s9sofaactuupbv8.png

Попробуем поменять степень $d$. Для $b=0, c=1, d=1/2$ наше уравнение принимает вид:

$z=a\sqrt{x^2+y^2}$

y6bewzb8iupq0hodpeaio3ujjau.png

Для $a=1/4$:

_eg3buq3ymow1tgku4aujaekfzq.png

Для $a=2$:

lijarzcrszc9e1ygx9abchv-1yu.png

Для $b=0, c=1, d=1/5$ наше уравнение принимает вид:

$z=a(x^2+y^2)^{1/5}$

1yzcbyyhtvgimwvl-5kn7zmuz8a.png

Для $a=10$:

xouufw4x1mjnf0_n5b1uxu0y1-y.png

Для $a=100$:

vvgkp4alriamy8tmpuc3faukgou.png

Для $a=1000$:

p6u9pglwjf586jgxs0ziihumkd8.png

Самые интересные паттерны получаются, если взять такое $d$, которое незначительно отличается от 1. Например для $b=0, c=1, d=1.01$:

Для $a=1/512$ паттерн похож на тот, что мы видели для элиптического параболоида:

ixparjbm2b0cqpcfyqom75e7oda.png

Для $a=511/323$:

ti_uoiibivfre1omif4zcsh-g4g.png

Еще несколько примеров:

$b=0, c=1, d=1.01, a=508/325$:

2afag_bjjhcsxjkap6s9-57mgok.png

$b=0, c=1, d=1.01, a=389/489$:

ebmsmy5rkoqaokgpf1w2fpmocjq.png

$b=0, c=1, d=0.999, a=500/357$:

bwr3mrla3kdd3erpqbum9bmcini.png

$b=0.01, c=1.01, d=1.01, a=159/202$:

yefgcxsih7k7zmh-wlcnpaquzpu.png

$b=1.01, c=1.01, d=1.01, a=511/328$:

qkesux00vnzezdjpjboqeleqk2g.png

$b=1, c=1, d=1.01, a=459/291$:

77dhsuipghdtajyqjyyfthhqhfe.png

Поиграться
В динамике — дискретные паттерны. Двигаем мышкой по экрану. Параметры $b, c, d$ вводим вручную. Параметр $a=x/y$ вычисляется из координат мышки.
В статике — можем посмотреть дискретный и недискретный паттерны.

Подводя итоги…

Мы попробовали дискретизировать линейную функцию и получили фрактал. Если сделать срез трехмерной плоской волны поверхностью с ненулевой кривизной — получим голографический паттерн. Интересно, что мы получим, если сделаем срез четырехмерной плоской волны пространством с ненулевой кривизной? Об этом поговорим в другой раз.

© Habrahabr.ru