Русский
Русский
English
Статистика
Реклама

Фракталы

Про Patterns

24.06.2020 06:06:01 | Автор: admin


Меня часто спрашивают, когда ты в первый раз познакомился с паттернами? И в очередной раз этот вопрос оставляет меня в небольшом замешательстве. Могу ли я сказать, что это был тот самый знойный июльский день, когда я ехал в маршрутке по томному пути решив взять интересную книжку по программированию в дорогу? Книжкой, кстати, оказалась та самая Gang of Four, Design Patterns. Или может это произошло немного раньше, когда я только появился на свет, и начал впитывать в себя разноцветный свет и голоса этого мира? Может еще раньше, когда, сидя в утробе матери, мой генетический алгоритм в очередной раз отрабатывал программу, которая по большому счету, уже была до меня отработана на моих родителях и прародителях множество поколений назад. Не могу сказать точно, возможно в одном из этих сюжетов. Достоверно могу сказать, что книжка эта меня чем-то зацепила. Я стал думать, что я думаю паттернами.
Disclaimer после прочтения текста под хабракатом, вам может стать скучно жить. Автор не хотел бы нести груз ответственности за ваше дальнейшее существование.


За время работы программистом я успел поработать на проектах для самых разных рынков. На каждом из них я старался увидеть те самые последовательности в доменной модели, либо в потоках данных, которые в конце концов сводятся к одной, уже давно кем-то решенной задаче с теми или иными преимуществами или недостатками. Такие места находились довольно часто, и это позволяло видеть немного дальше, чем текущие требования, быть готовым к расширяемости, или изменению функционала ранее, чем они появлялись. Bridge, Composite, Adapter и прочие, все это находило применение в той или иной ситуации. Но одна мысль все же не оставляла вашего покорного слугу, и не давала возможности спокойно насладиться текущим положением дел, а именно вопрос: а почему собственно так? Что это за магические комбинации такие, и почему они не используются повсеместно? Возможно ли это как-то применить в других отраслях или областях жизни? Всегда казалось, что здесь спрятано нечто большее
Для того, чтобы разобраться, мне пришлось отправиться на самое дно. Ну как дно, это наверное прозвучало несколько метафорично, потому что, и я надеюсь, читатель со мной согласится, никакого дна нет. Тем не менее, кривая изысканий привела меня в мир, близкий к нейробиологии. Ведь, если разобраться, все что нас окружает, тем или иным образом обрабатывается именно мозгом, и наше восприятие происходящего реализуется именно там. Конечно, на сегодняшний день, 2020-го года никто досконально не разобрался, как оно работает и по каким принципам эти 86 миллиардов нейронов пересылая друг с другу электрические сигналы формируют внутреннее представление того, что являет собой наш разум. Но это 2020-й, удивительно, как мы вообще всё еще выживаем. Ни смотря ни на что, есть позитивные сдвиги и, например, Jeff Hawkins в книге On Intelligence представил свою модель на суд зрителя еще в далеком 2004-м, которая многим пришлась по душе и которой, я хотел бы с вами поделиться.

Тут нужно сделать небольшую литературную сноску в основные определения и понятия. Итак, каждый нейрон в мозге состоит из тела и отростков (дендритов и аксонов). Те, места, где отростки 2-х нейронов соприкасаются, позволяя проходить электрическому сигналу называются синапсами. Таким образом, нейроны имеют возможность посылать сигнал, или общаться, с теми нейронами, с которыми у них есть соединение, т.е. синапс. Если по простому, если у нас есть есть физическое соединение, между нейроном, который отвечает за книгу и нейроном, который отвечает за автора, то мы знаем и то и другое, ну а если нету, то просто понятия не имеем, кто написал эту книжку.
Особый интерес для нас представляет такое понятие, как автоассоциативная память механизм, когда определенная последовательность сигналов передается от одного нейрона к другому и затем, эта же самая последовательность возвращается от нейрона получателя, к нейрону отправителю назад.
Предвосхищаю ваш вскрик негодования, Как так? Дублирование кода? Нафига!? Меня так же зацепил этот кусок функционала. Напоминает ситуацию, когда вы взяли в магазине красивые бананы, подходите на кассу, продавец спрашивает, чем вы будете оплачивать покупку? и вы не долго думая отвечаете, пожалуй, сегодня заплачу бананами!. Deal!

Тут есть одна деталь. Дело в том, что последовательность, которая подается на вход, может быть неполной, или битой, с погрешностями и неточностями. А в ответ возвращается сигнал такой, какой он должен быть в идеале (по крайней мере с точки зрения той части, которая его принимает). Т.е. вы идете в магазин со своими своими просроченными, черными бананами и платите ими за красивые, зеленые бананы, которые вам заботливо выложил в сумочку продавец. Для чего это все? Одним из ожидаемых предположений является оптимизация. Зачем каждый раз запрашивать всю информацию целиком, если по холодному, черному носу понятно, что перед нами собака? Или по характерным четырем ногам и доске сверху вполне можно определиться, что это ни что иное как обыкновенный стол.
Внимательный читатель наверное догадался, что вся эта прелюдия с паттернами была не просто так. Дело в том, что последовательность сигналов, которую передает один нейрон к другому, это и есть один из подвидов тех самых паттернов. Когда нейрон получатель распознает определенную, известную ему последовательность, он может восстановить полную картину целиком по тем неполным данным, которые поступили к нему на вход. И если я вам сейчас пропою Маленькой елочке.., ваш мозг тут же распознает этот до боли знакомый паттерн и, совершенно верно, закончит ее тем самым }{oloDn0 3NMoI. Если нам нужно задизайнить функционал, в котором определенные операции могут выполняться в виде атомарной транзакции, с возможностью отката и повторения, вы сразу же думаете про Command. Когда мы катаемся на велосипеде или читаем, мозг распознает знакомые паттерны, и в ответ включает знакомую ему программу реагирования на них, например включить определенную моторику в руках и ногах, чтобы не упасть, или распознать слово, которое будет идти следующим, пока мы до него даже не дочитали. Другими словами мозг это машина распознавания паттернов, или, если сказать простым английским языком pattern recognition machine.

Если теперь оценить масштаб фундаментальности данного механизма, те design patterns, к которым мы так привыкли, и которые выручают нас когда нужно, например, задизайнить типичный и гибкий подход к созданию объектов, являются просто каплей в океане событий, происходящих вокруг и которые основаны на этих самых паттернах. Мы почти все делаем по шаблонам, крупным и мелким, временнм и в пространстве, логическим и физическим. Иногда, жизнь представляется мне вот такой:



Т.к. живем мы в мире, на который очень сильно повлиял человеческий разум, нас окружают вещи, которые сделаны по одним и тем же паттернам. Вы ходите на работу и домой в одно время, одним и тем же путем, сериалы, которые вы смотрите написаны по одному сценарию и всегда заканчиваются одинаково, в магазине вы покупаете одни и те же продукты, нравится вам одинаковая музыка, игры в которые вы играете заставляют вас ходить по кругу снова и снова в поисках очередного модного сапога +n к здоровью и т. д. и т. п. Это не похоже на мир существ разумных, которые отвечают за свои действия, это скорее мир муравьев, у которых в бесконечном цикле запущена подпрограмма существования по пути оптимизации и наименьшего сопротивления. Осознание своих шаблонов делает мир довольно унылым и скучным, ведь все хотят быть уникальными и непредсказуемыми в своем роде, а тут такой банальный поворот. Звучит грустновато, но есть просвет. Когда мы вырастаем из одних паттернов, нас начинают увлекать другие, более высокого порядка, а это уже совсем другая история. Поэтому, все же есть надежда, что вы, дорогой читатель, на заскучаете, а найдете себе паттерн, который заменит предыдущий, если вы вдруг решите его поменять. Чтобы посмотреть на механизм паттернов в динамике, попробуйте посмотреть пару серий мультфильма про Чипа и Дейла, если он вам нравился в детстве, вы наверняка заметите подвох, если на данный момент вы уже находитесь во взрослом состоянии.

Ну и основной вопрос. Что с этим делать? Как и все вокруг нас окружающее, паттерны имеют свои плюсы и минусы. Так как жизнь, это в целом social game, люди, которые умеют видеть свойства общества, в котором мы живем, имеют больше шансов использовать их в свою выгоду и получить от жизни то, что им нужно, чем тем, которым не понятно и, из-за этого, недостижимо. Ну и конечно понимание своих собственных свойств и особенностей тоже может сильно помочь. Начиная от общих, принадлежащих виду homo sapiens в целом, и углубляясь в детали, понимание того, чем я конкретно отличаюсь от других sapiens и в каких ситуациях мои личные особенности могут играть мне на пользу, а в каких мешать. Понимание своих паттернов может помочь увидеть себя в будущем, ну или хотя бы в одной из веток квантовой вселенной. Что уже в принципе не плохо, чтобы попытаться что-то изменить, подправить свой курс и увеличить вероятности попадания туда, куда вы хотите попасть, а не туда, куда нас автоматом несет река жизни.

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

L-системы и что они себе позволяют

30.01.2021 16:19:23 | Автор: admin

Давайте начнём с азов, если брать определение из всем известной и всеми любимой Википедии, то L-система (или же система Линденмайера) это параллельная система переписывания и вид формальной грамматики.

Если говорить простым языком, то L-система состоит из алфавита символов, которые могут быть использованы для создания строк, набора порождающих правил, которые задают правила подстановки вместо каждого символа, начальной строки ( аксиомы ), с которой начинается построение, и механизм перевода образованной строки в геометрические структуры. Самым простым примером L-системы может служить задача построения дерева.

Вводные данные:

Строка (далее Аксиома): A B

Переменные (которые мы можем задействовать в построении дерева): A B C

Правило (правило по которому каждая переменная на последующие строке меняется):

  • A - > AB

  • B - > AC

  • C - > A

Получаются такие преобразования:

Поколение

Состояние

1

A B

2

AB AC

3

AB AC AB A

4

AB AC AB A AB AC AB

5

AB AC AB A AB AC AB AB AC AB A AB AC

6

и так далее

Основным направлением, в котором применяются L-системы, это моделирование процессов роста как живых организмов, так и неживых объектов (кристаллов, раковин моллюсков или пчелиных сот).

Пример:

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

Итак, приступим:

  1. Здесь мы импортируем библиотеку Turtle в наш проект:

    import turtle

  2. Далее мы подключаем все необходимые конфигурации для нашей черепашки:

    turtle.hideturtle()

    turtle.tracer(1)

    turtle.penup()

    turtle.setposition(-300,340)

    turtle.pendown()

    turtle.pensize(1)

  3. Далее мы задаём значение непосредственно самой аксиомы и сопутствующих параметров, необходимых для задания последовательности:

    axiom = "F+F+F+F"

    tempAx = ""

    itr = 3

    (itr- значения итераций цикла, оно нам понадобится в следующем шаге при написании нашей программы)

  4. В данном цикле, где как раз нам и понадобится переменная itr-, мы занимаемся обработкой и "выращиванием" непосредственно генома нашего фрактала/растения:

    for k in range(itr):

    for ch in axiom:

    if ch == "+":

    tempAx = tempAx + "+"

    elif ch == "-":

    tempAx = tempAx + "-"

    elif ch == "F": #F

    tempAx = tempAx + "F+F-f-F+F"

    else:

    tempAx = tempAx + "f"

    axiom = tempAx

    tempAx = " "

    print(axiom)

    Если мы с вами пробежимся по циклу, то сразу же в первом условии мы увидим фильтр на символ "+":

    if ch == "+":

    tempAx = tempAx + "+"

    Здесь мы ищем в аксиоме (изначальной строке) знак + и при его появлении мы добавляем символ + в последующую строчку. Так же происходит и с символом - и f, мы просто добавляем в последующую строчку символы - и f соответственно. Но при появлении в нашей аксиоме символа F, мы поступим немного иначе и добавим в последующую строчку уже последовательность символов F + F f F + F, для увеличения длины каждой последующей строки. Данное действие в принципе не принципиально, но для быстроты генерации генома, я решил поступить именно так. В конце мы обязательно приравниваем аксиому к нашему геному и обнуляем его:

    axiom = tempAx

    tempAx = " "

    Результат (значение аксиомы):

  5. Ну что, вроде по генерации генома всё понятно, давайте уже приступим непосредственно к визуализации. Для этого нам понадобиться простенький цикл, который будет переводить встречающиеся в геноме символы в движения черепашки:

    for ch in axiom:

    if ch == "+":

    turtle.right(45)

    turtle.forward(10)

    turtle.right(45)

    elif ch == "-":

    turtle.left(45)

    turtle.forward(10)

    turtle.left(45)

    else:

    turtle.forward(20)

    Сразу можно заметить, что по аналогии с предыдущим пунктом, мы детектируем символы "+", "-", "F" и "f". Только теперь в момент, когда мы встречаем символ "+":

    if ch == "+":

    turtle.right(45)

    turtle.forward(10)

    turtle.right(45)

    Мы поворачиваем сначала на право, на 45 градусов, потом проезжаем расстояние, равное 10, и потом мы снова поворачиваем на право, на 45 градусов. Когда же мы встречаем символ "-":

    elif ch == "-":

    turtle.left(45)

    turtle.forward(10)

    turtle.left(45)

    Мы делаем все те же самые действия, что и при символе "+", только на этот раз поворачиваем уже не вправо, а уже влево. Но если же мы встретим символы "F" или "f", то мы просто буем проезжать вперёд на 20 пикселей:

    else:

    turtle.forward(20)

    В итоге мы получаем вот такой фрактал-снежинку:

  6. Если же мы захотим раскрасить наш фрактал-снежинку, то нам понадобиться перед циклом из предыдущего пункта добавить строчки:

    turtle.fillcolor("#99BBFF")

    turtle.begin_fill()

    Где #99BBFF - это кодировка цвета (RGB: 153, 187, 255), а begin_fill() это начало заполнения цветом. И в конце, уже после цикла, добавить строчки:

    turtle.end_fill()

    turtle.update()

    turtle.done()

    А end_fill() означает конец заполнения. Далее мы обновляем и выключаем нашу "черепашку". И на выходе мы получаем вот такой фрактал-снежинку:

Вы так же можете посмотреть, "потыкать" код, изменяя параметры и данные в нём.

В конце, хочу также добавить, что мне очень понравилось работать и писать по данной тематике, возможно, в будущем, я напишу ещё ряд статей по теме "L-системы", но а пока, хочу представить вам результаты моего тыканья творчества:

Подробнее..

Почему множество Мандельброта устроено так, как оно устроено

03.11.2020 08:13:00 | Автор: admin
Оболочка Мандельброта


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

О чём вообще речь.


Множество Мандельброта это множество таких точек C на комплексной плоскости, для которых рекуррентное соотношение $Z_{n+1} = Z_n^2 + C$ при $Z_0=0$ задаёт ограниченную последовательность (вики).

Иными словами, на каждом шаге число возводится в квадрат и к нему добавляется константа. Начальное значение всегда (0, 0i), варьируется именно константа. Если за определенное число шагов последовательность осталась в заданных пределах, то значение константы принадлежит множеству. Выглядит это так:
image
Фиг.1 Множество Мандельброта в координатах реальная и мнимая части константы. Отсюда.

Чаще действуют по другому фиксируют радиус и для каждого значения константы подсчитывают число итераций, за которое последовательность до него добралась. Это позволяет раскрасить пограничные области множества, не принадлежащие, впрочем, самому множеству.
Вот так, например:
image
Фиг.2 Типичная цветовая схема

И откуда же всё это берется?
Нельзя просто так вот взять и ответить на этот вопрос.
Начнём с малого, изучим простую казалось бы операцию возведение в квадрат.

Основа, $ZZ^2$


Итак, что же это за возведение в квадрат комплексного числа, ведь именно оно лежит в основе наблюдаемой магии?

Комплексные числа будем рассматривать как двумерный вектор из реальной и мнимой части (что бы это ни означало) либо в полярных координатах как пару длина угол.

Формула Муавра утверждает, что возведение комплексного числа в квадрат приводит к возведению длины в квадрат, угол при этом удваивается.
image
Фиг.3 Стартуем с угла 0.001 рад

Вот первые 12 итераций возведения в квадрат комплексного числа с длиной 1 и углом 0.001 рад, где угол отсчитывается от действительной единицы против часовой стрелки. Когда угол превышает 2, используется остаток от деления. Отрицательные углы тоже в деле.

Какие особенности есть у последовательности $ZZ^2$?
  1. Поскольку значение длины на каждой итерации возводится в квадрат, любое комплексное число с длиной меньше единицы стремится в центр координат.
  2. Аналогично, любая последовательность со стартовой длиной больше единицы тут же стартует в бесконечность.
  3. Интерес представляют лишь точки, расположенные на единичной окружности.
  4. Точка (1, 0i) стационарная, угол равен 0 (или 2), с неё последовательность не может уйти.
  5. Точка (-1, 0i) соответствует углу в , на следующей итерации превращается в 2 и становится стационарной.
  6. Обобщим, точки с углом $\pi/2^n$ (n целое неотрицательной число) также рано или поздно попадают в стационарную точку. Как и точки $\pi\pi/2^n$. Для отрицательных n они уже там.
  7. Точки с углом $\pi/n$ (n целое число, не являющееся степенью 2) образуют устойчивые циклы
    image
    Фиг.4 Последовательности для начальных углов в /3, /5, /7, /11

    Забавно, циклы для /n образуются по углам правильного n-угольника с одним из углов в стационарной точке (1,0i), но этот угол не посещается. Это проистекает из того, что, например, ($2^n\mod{13} $) не может породить 0, а только лишь числа от 1 до 12.

    Но это всё простые делители. Попробуем что-нибудь непростое и нечётное.
    image
    Фиг.5 Последовательности для начальных углов в /9, /15, /21.

    Похоже, все рациональные делители образуют устойчивые циклы.
  8. Точки со стартовыми углами в /x (x иррациональное число) не образуют циклов и заметают всю окружность.
    image
    Фиг.6 Последовательность с началом в 0.001 рад

    Здесь показаны первые 500 и 5000 точек из уже знакомой последовательности, начинающейся с угла 0.001 радиана.

    Отлично видно проявившуюся кардиоидо-подобную структуру. Происхождение её очевидно, если поделить единичный круг на 8 секторов
    image
    Фиг.7 Сектора

    то в силу удвоения угла,
    точки из сектора 1 могут попасть только в сектор 2 (или остаться в 1)
    точки из сектора 2 могут попасть в сектора 3 и 4
    точки из сектора 3 могут попасть в сектора 5 и 6
    точки из сектора 4 могут попасть в сектора 7 и 8

К слову сказать, чтобы получить последовательность из 5000 адекватных значений, пришлось работать с точностью до 2000 значащих цифр. Фактически, каждая итерация последовательности приводит (грубо, за счет использования остатка от деления угла) к потере одного старшего разряда и подтягиванию одного разряда снизу, из великого ничто. Понятно, в великом ничто точность неограниченна, нам же приходится работать с конечными объемами данных.

Малые возмущения


Сейчас немного отойдём от чистого $ZZ^2$ в сторону исходной задачи. На каждой итерации станем подмешивать константу. Правда, стартовая точка будет не в начале координат, а на единичной окружности. В результате можно работать с очень маленькими константами, ведь в этом случае не требуется вытаскивать последовательность на окружность для демонстрации нетривиального поведения.

Константа это просто вектор из начала координат. В зависимости от того, где находится текущая итерация последовательности на единичной окружности, константа действует по-разному. Иные точки она задувает внутрь кратера, другие сдувает наружу. От баланса этих воздействий зависит, удержится ли последовательность в окрестностях единичной окружности или же безвозвратно уйдёт с дистанции.

Начнём со знакомой точки 0.001 радиана.
image
Фиг.8 Траектории при малых реальных отклонениях от 0.001 рад

Всего 58 итераций потребовалось, чтобы сойти с единичного круга и стремиться в бесконечность в случае константы (0, i*1e-15). При константе (0, i*-1e-15), последовательность ушла в 0 на 62 шагу.

image
Фиг.9 Окрестность 0 константы для стартовой точки 0.001 рад

Здесь показано, на какой итерации последовательность пересекла круг с радиусом 2 в зависимости от величины комплексной константы. Шаг $10^{-20}$. Отметим следующее:
  • Стартовая точка (длина 1, угол 0.001 рад) очень близка к горизонтальной оси. Соответственно, единичная окружность проходит через нее почти вертикально.
  • Первые несколько точек последовательности очень близки к стартовой, поэтому константа суммируется с ними одинаково.
  • Фактически, направление вектора константы однозначно определяет, в какую сторону соскользнёт последовательность.


image
Фиг.10 Окрестность 0 константы для стартовой точки 1 рад

Здесь показан старт последовательности с точки с углом 1, это одна из точек цикла со стартом в /3. Цикл состоит из двух точек и 1. Казалось бы, константа должна разнонаправленно действовать на эти точки, нивелируя саму себя. Но нет, никакой интриги и тут не видно. Куда направлен вектор константы по отношению к первой точке последовательности, туда и сдувает траекторию.

Пожалуй, на этом мы закончим с $ZZ^2$,
в следующий раз займёмся центральной кардиоидой.
Сегодня мы уже встречались с кардиоидой, есть ли между ними связь или просто совпадение?
А может это сигнал для тех кто понимает?

PS: на заглавной иллюстрации оболочка Мандельброта обобщение на трёхмерный случай.

PPS: для вычислений с произвольной точностью была использована библиотека MAPM.

PPPS: иллюстрации сделаны с помощью gnuplot.
Подробнее..

Как устроено множество Мандельброта. Хвост

22.12.2020 08:17:45 | Автор: admin
image
Хвостом будем считать череду структур к западу от центральной кардиоиды вдоль по отрицательной части вещественной оси. В этой области таится целая бездна деталей. А в деталях, как известно, кроется дьявол и его малютки.

Данная статья продолжает серию об устройстве множества Мандельброта.
Ранее мы изучали:
1) свойства возведения в квадрат в комплексной плоскости,
2) центральную кардиоиду.
Пришла пора продвинуться еще немного.

Большой довесок


Так будем называть круг множества Мандельброта с центром в точке (-1, i*0) и радиусом .
image
Фиг.1 большой довесок

Точка (-1, i*0) забавная, после возведения в квадрат превращается в (1, i*0), после добавления константы становится (0, i*0). На второй итерации возвращается в исходное положение.

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

image
Фиг.2 финальные точки траекторий, стартующих с периметра большого довеска

starting circle круг с центром в (-1, 0 i) и радиусом 0.2495. Честный радиус 0.25, но точки с него сходятся крайне медленно.
final по две точки на каждую стартовую. Обладают центральной симметрией относительно точки (-0.5, 0 i). Между углами в исходном круге и param разница в $\pi$.
Показана только половина соединяющих линий. Шаг полтора градуса.
param экспериментально полученная параметрическая кривая $R= \sqrt{2 \cos{2\psi}} $, сдвинутая на (-0.5, 0 i).

Вообще, кривая param имеет четыре лепестка два в вещественной области и два в мнимой. Это звучит странно т.к. мы уже находимся в комплексной плоскости.

Для начала проверим что две чисто вещественные точки переходят друг в друга.
Возьмём минимальную точку (-1, 0 i)

  • для кривой param угол $\psi = 0$
  • константа C Из $(Z^2 + C)$ равна
    $C = -1 + cos(\pi+\psi) = -1 - $
  • сама param в этой точке
    $inline$- + \sqrt{2\cos{0}} = - + \sqrt{2}$inline$
  • квадрат param
    $ + - \sqrt{2}$
  • добавляем константу
    $inline$- - \sqrt{2} => - + \sqrt {2 \cos(\pi)}$inline$
    получилось, угол 0 превратился в $\pi$,
    наоборот тоже работает

Теперь посмотрим на вещественные лепестки param.

  • разберем отрезок $\psi [0: \pi/4]$,
    в этой области $cos(2\psi)$ неотрицателен, как раз то что нужно
  • константа C Из $(Z^2 + C)$ равна
    $C = (-1 + \cos {\phi} , i \sin {\phi})$
  • угол окружности ($\phi$) и угол param ($\psi$) судя по приведенному графику связаны как $\psi = \pi - (\phi - \pi)/4$ или $\psi = (\pi - \phi)/4$
    $\phi = \pi - 4 \psi$
  • радиус param равен
    $R = \sqrt{2 \cos{2\psi}} =>\ \sqrt{2 \cos{((\pi-\phi)/2)}}$
    на интервале $\psi [0: \phi/4]$ R чисто вещественная
  • сама param в этой точке
    $(- + R \cos{\psi}, i R \sin{\psi})$
  • квадрат param
    $Re = (- + R \cos{\psi)}^2 - R(\sin{\psi})^2 \Longrightarrow $
    $ - R \cos{\psi} + R^2(\cos{\psi}^2- \sin{\psi}^2) \Longrightarrow $
    $ - R \cos{\psi} + R^2 \cos{2\psi} \Longrightarrow $
    $ - R \cos{\psi} + (\cos{2\psi})^2$

    $Im = 2 (- + R \cos{\psi}) R \sin{\psi} \Longrightarrow $
    $ -R \sin{\psi} + R^2 \cos{\psi} \sin{\psi} \Longrightarrow $
    $ R \sin{(\pi + \psi)} + \cos{2 \psi} \cos{\psi} \sin{\psi} \Longrightarrow $
    $ R \sin{(\pi + \psi)} + \sin{4 \psi}$
  • добавляем константу C
    $inline$Re = - + R \cos{(\pi + \psi)} - + \cos{\phi} + \cos{2 \psi}^2 \Longrightarrow $inline$
    $inline$ - + R \cos{(\pi + \psi)} - + \cos{\phi} + \cos{4 \psi} + \Longrightarrow $inline$
    $ - + R \cos{(\pi + \psi)} + \cos{(\pi - 4 \psi)} + \cos{4 \psi} \Longrightarrow $
    $ - + R \cos{(\pi + \psi)} $

    $Im = R \sin{(\pi + \psi)} + \sin{4 \psi} + \sin{\phi} \Longrightarrow $
    $ R \sin{(\pi + \psi)} $
  • в результате
    $(- + R \cos{\psi}, i R \sin{\psi}) => (- + R \cos{(\pi + \psi)}, i R \sin{(\pi + \psi)}) $
    что и требовалось.
  • в обратную сторону тоже работает


Теперь обратимся к мнимым лепесткам param.
В этой области $\cos{2\psi}$ отрицателен. Пусть $\Omega = \sqrt{|2 \cos{2\psi}|}$.
Тогда param:$ (i \Omega \cos{\psi} + i i \Omega \sin {\psi}) \Longrightarrow (-\Omega \sin{\psi} + i \Omega \cos{\psi})$.
Фактически, мнимые лепестки развернулись и легли поверх действительных.

Если бы не это, пришлось бы ломать голову, почему при $\phi [0:2\pi]$ мы попадаем на вещественные лепестки, а при $\phi [2\pi: 4\pi]$ нет.

Есть всё же в этом какая-то натяжка. Осталось ощущение очень мелкой возни и упущенной общей картины. Но по крайней мере теперь у нас в наличии есть оба элементарных блока из которых построено всё множество круг и кардиоида. Осталось научиться смешивать их в нужных пропорциях.

Малые довески.


Так станем называть более мелкие образования, нанизанные на отрицательную часть оси Re[C].
Минимальное значение, при котором последовательность, стартующая с оси Re[C] не расходится, это -2.
  1. -2 превращается в +4
  2. +4 при добавлении константы становится +2
  3. +2 превращается в +4
  4. ...
Всё что меньше -2 приводит к разгону последовательности.

А что происходит в интервале [-2:-1.25]?
Пройдёмся по этому отрезку и нарисуем предельные траектории, полученные с точек на нём. Поскольку мнимая часть на этом отрезке (для всех точек траектории) отсутствует, получается вполне наглядное представление стартовая точка против финальных траекторных.

Финальными траекторными будем считать точки, полученные с помощью следующей эвристики.
  • первые 9000 итераций: делаем, но никак не учитываем.
  • следующие 1000 итераций: запоминаем точки траектории с точностью до 4 знаков после запятой
  • то, что накопили в результате и есть финальные точки, их может быть от 1 до 1000.

image
Фиг.3 Бифуркационная диаграмма для отрицательной реальной части константы.

Здесь для наглядности приведена часть множества Мандельброта в том же масштабе, соответствующая рассматриваемому отрезку.

Имеем дело с бифуркационной диаграммой для последовательности $Z_{n+1}=Z_n^2+C$.
  1. на интервале -0.75...0 последовательность сходится к одной точке, это соответствует центральной кардиоиде
  2. в точке -0.75 происходит бифуркация и последовательность выходит на предельный цикл из двух точек. Это область большого довеска. С центром в точке -1, для которой предельный цикл (-1 => 0 => -1).
  3. Далее идёт цепочка бифуркаций, при этом, как и положено, бифуркационный параметр при каждой следующем удвоении периода меняется всё меньше. Предел отношения последовательных изменений бифуркационного параметра называется постоянная Фейгенбаума и примерно равен 4.669. Этот предел универсален для всех рекуррентных последовательностей 2-й степени.
  4. Промежуток между бифуркациями на множестве Мандельброта соответствует кругу диаметра, равного этому промежутку.
  5. Однако, при соотношении диаметров 1 к 4.669, последовательность кругов очень быстро сходится, примерно при значении -1,40116 наступает предел. Назовём его горизонт событий.
  6. Но жизнь продолжается и за горизонтом событий.
    image
    Фиг.4 фрагмент бифуркационной ддиаграммы

    Каждый раз, когда мы видим на диаграмме прогалину, ей соответствует не просто окружность, а миниатюрная копия множества Мандельброта, со своей кардиоидой, большим и малыми довесками
    image
    Фиг.5 фрагмент множества Мандельброта,
    центр (-1,4171..., 0), длина стороны 0.002668


Как такое возможно?
Что объединяет все такие структуры?
Чем они отличаются от довесков?

Здесь наглядности, стоит привести бифуркационный спектр зависимость длины предельного цикла от константы. Спектр получен с помощью эвристики и имеет значение только для оценки общей картины.
image
Фиг.6 бифуркационный спектр c шагом в 0.001

image
Фиг.7 спектр с разными шагами

Чем меньше шаг, тем больше выявляется циклов разной длины. Обратим внимание на характерные лесенки удвоения периодов не только в изначальном каскаде бифуркаций, но и во всех прогалинах/окнах периодичности. Глядя на них невозможно не упомянуть теорему Шарковского
image
Фиг.8 порядок Шарковского

Оператор x image y означает, что если существует цикл длины x, обязан быть и цикл длины y. Нижняя строка соответствует начальному каскаду бифуркаций.
Лесенки у окон периодичности столбцам вплоть до последней строки. С первой строкой, похоже, придётся повозиться.

Но вернёмся к бифуркационной диаграмме.
Вцелом картина неясна, поэтому зацепимся за что-нибудь, поддающееся осмыслению, потянем за эту ниточку и потихоньку распустим весь клубок.

Удачный кандидат быть такой ниточкой самое большое окно за горизонтом событий [-1.7684:-1.75] с длиной цикла 3. Взглянем поближе на все три непустых фрагмента этого окна.
image
Фиг.9 Центральная часть большого окна.

image
Фиг.10 Верхняя часть

image
Фиг.11 Нижняя часть

  • Как по команде, без перехода, в -1.75 хаос заканчивается и дальше идёт серия бифуркаций
  • Заканчивается всё собственным горизонтом событий этого окна.
  • Бифуркации во всех трёх ветках происходят синхронно.
  • Отрезок [-1.768:-1.75] соответствует местной кардиоиде, ниже идёт локальный большой довесок
  • В -1.755 (примерно) центральная часть пересекает 0 и это соответствует 0 для основной кардиоиды множества Мандельброта.
  • В -1.755 нижняя часть равна -1.755


С этого и начнём.
  • Имеем цикл длины 3.
  • Одна из точек цикла 0.
  • Из этого следует, что следующая точка цикла $0^2 + C => C$,
    в данном случае -1.755.
  • Последняя точка цикла => $1.755^2 -1.755 = 1.325$
  • Но что это за число -1.755, можно ли его получить аналитически?
  • Будем исходить из того, что в основной кардиоиде в точке ноль траектория так и оставалась в 0, никуда не мигрировала, здесь должно быть то же самое.
  • запишем переходы
    $0^2 + x => x$
    $x^2 + x => x_1$
    $x_1^2 + x => 0$
    следовательно
    $(x^2 + x)^2 + x = 0$
    $x^4 + 2x^3+ x^2 + x = 0$
  • вещественные корни уравнения очевидный 0 и
    image
    или -1.7548776662...
  • Но что за полином такой? Нарисуем.
    image
    Фиг.12 Наложение полинома на бифуркационную диаграмму

    Внезапно оказывается, что это одна из тех странных кривых, которые живут потаённой жизнью внутри бифуркационной диаграммы.
  • Мы получили этот полином, когда три раза проитерировали исходное выражение
    $F_{n+1}= F_n^2 + x$ при $F_0= 0$
    Тогда
    $F_1= х$
    $F_2= x + x^2$
    $F_3= x + (x + x^2)^2$
    ...
  • А если продолжить и наложить на диаграмму несколько следующих итераций (мод).
    image
    Фиг.13 Несколько последовательных итераций/мод поверх диаграммы.
    Да, это они.

Однако, вернёмся к циклу длины 3, посмотрим на его фазовую диаграмму зависимость текущего положения от предыдущего.
image
Фиг.14 Фазовая диаграмма траекторий циклов длины ~3, по X предыдущее значение, по Y текущее.

pp3center проходит через 0
pp3start максимальное значение диапазона, тоже длины 3,
pp3fin за пределами диапазона цикл расщепился до длины 24.
Движение везде по часовой стрелке.

Лирическое отступление. Есть такое устойчивое выражение period three implies chaos (в порядке Шарковского всё начинается именно с трёх), то что мы наблюдаем проливает свет, почему именно 3.

В самом деле, из этих трёх два являются обязательной программой 0 и начальное значение константы. Любое наблюдаемое окно периодичности содержит (центральную, основную, базовую?) траекторию, проходящую через 0. Почему, это отдельный вопрос, постараемся ответить на него позже. Но где есть 0, на траектории будет и начальная константа. А без этой парочки 3 превращается в 1, меньше которой уже и нет ничего. Т.е. есть циклы длины 1 и 2, которые мы видели и до горизонта событий в регулярной части бифуркационной диаграммы. Причем, цикл длины 2 сам является обязательной программой, а длины 1 ещё и вырожденной оной.

А как насчет циклов большей длины? Судя по бифуркационной диаграмме с наложенными модами, если требуется найти цикл длины n, стоит поискать 0 для функции $F_n$. Это довольно просто проверить, для этого
  1. в gnuplot строится график $F_n$, например
    set gridset samples 10000set xrange [-2:-1]plot x+(x+(x+(x+(x+(x+(x+x**2)**2)**2)**2)**2)**2)**2
    
  2. на графике можно с приличной точностью найти один из вещественных корней, например, -1.9893204
  3. в любом онлайн просмотре множества Мандельброта отмасштабироваться в нужную точку и voil
    image
    Фиг.15 возможный фрактал, соответствующий одному из корней моды $F_8$

    Надо еще кстати умудриться попасть в нужный фрактал, там ими всё буквально испещрено. Ведь мод бесчисленное количество и у каждой есть корни, число которых растёт по экспоненте с ростом номера моды. К счастью, размер фракталов при этом уменьшается.

И всё же, как это работает, почему когда мода пересекает 0, появляются фрактальные структуры?
  • до сих пор мы воспринимали траекторию как нечто цельное и уже полученное, на самом деле это итеративный процесс
  • т.е. сначала вычисляется $F_1$ затем $F_2$
  • Допустим, мы дошли до $F_n$ и случайно попали в стационарную точку, т.е. такую x, где $F_n(x) = x$,
    $F_n = x => $
    $x + F_{n-1}^2 = x => $
    $F_{n-1}^2 = 0 => $
    $F_{n-1} = 0. $
  • из этой точки невозможно выбраться, условно, мы уже никогда не попадём в $F_{n+1}$. Не теряя строгости можно считать, что сама $F_n$ является теперь элементарной рекуррентной функцией $\Phi_1 = F_n$, как если бы мы шагали сразу по n старых маленьких шагов.
  • стационарная точка может быть притягивающей и отталкивающей, отличаются они знаком второй производной
  • интуитивно понятно, что у притягивающей стационарной точки есть какая-то окрестность, в которой она притягивает траектории к себе как черная дыра пролетающие тела. Форма и размер этих окрестностей предмет для отдельного/дальнейшего разговора, до сих пор мы встречали два варианта кардиоиду как начало окна периодичности и круг в пределах регулярной части окна периодичности, вплоть до местного горизонта событий.
  • весь интервал [-2:0.25] заполнен бесконечным количеством окон периодичности самого разного размера, каждое из которых соответствует определенному корню какой-то моды.
  • эти окна вполне могут пересекаться, в этом случае окно моды с меньшим номером поглощает своего оппонента. Так как это происходит в точке 0, где вообще все моды имеют тривиальный корень.

Напоследок поглядим на фазовые диаграммы циклов длины больше 3.
Стартовые константы получены вышеописанным образом из gnuplot.
image
Фиг.16 Фазовая диаграмма траекторий циклов длины 4, в названии стартовая константа
pp4-1,3107 получен двойной бифуркацией и находится до горизонта событий.
pp4-1.9408 обход по часовой стрелке


Фиг.17 Фазовая диаграмма траекторий циклов длины 5
Забавно, pp5-1.98542 получается из pp4-1.9408 изломом одной грани.


Фиг.18 Фазовая диаграмма траекторий циклов длины 6
pp6-1.77289 получен расщеплением цикла длины 3.
pp6-1.99638 получен дальнейшим изломом грани в pp5-1.99638
pp6-1.75488 порождает цикл длины 3 т.к. попадает в окно с периодичностью 3, которое имеет приоритет.

Далее мы не будем смотреть на все имеющиеся циклы, с ростом периода число корней моды растёт экспоненциально, да и степени в полиномах возникают такие, что как-то становится тревожно за точность gnuplot. Просто поглядим на субъективно интересное.


Фиг.19 само-непересекающиеся циклы длины 3...7

Эти циклы разного размера, но имеют близкую родственную связь. Заключается она в том, что всё это циклы с минимальным корнем соответствующей моды.
Аналогичный цикл длины больше 7 отловить не удалось из-за нарастающей потери точности в вычислениях.


Фиг.20 Еще одна серия траекторий с ростом длины циклов по единице.
Это, кстати, вторые снизу минимальные корни.
По-видимому, это (+1) вполне популярная история. Возможно, стоит продолжить.


Фиг.21 Третьи снизу корни мод.

В принципе логика понятна.

Фиг.22 Фазовая диаграмма траектории длины 11.
Здесь хорошо видно, как нарастает число зубьев, а также то, что точки фазовой диаграммы находятся на параболе, что логично, учитывая их происхождение.

Однако, и это еще не всё. Встречаются и вот такие жемчужины:

Фиг.23 цикл длины 9 утроение цикла.

До сих пор мы встречали только удвоение циклов, например, pp6-1.77289 из pp3-1.755.

Фиг.24 удвоение и утроение цикла 3.

Цикл 3 при -1.755.
Цикл 6 при -1.77289
Цикл 9 при -1.7859
Утроение (-1.7859) находится за локальным горизонтом событий.
И, по видимому, соответствует циклу 3*3 за горизонтом событий цикла 3.
Если гипотеза верна, между [-1.7859:-1.7783] мы найдём и цикл 3*6 и 3*5 (если точности хватит)


Фиг.25 Бифуркационный спектр в интересующем нас интервале.

Невозможно не отметить, насколько этот кусочек спектра похож на полный спектр, приведенный выше (Фиг.7). Что еще раз указывает на фрактальную природу происходящего.


Фиг.26 Расщепление цикла 3 на 4, 5, 6 частей

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


Фиг.27 псевдо-хаотическое поведение, длинный цикл.

Подводя итоги, нельзя не отметить что данная статья поднимает больше вопросов, чем даёт ответов.
Чем всё же определяется форма и размер больших и малых довесков?
Как связаны между собой моды?
Неужели мы забыли, что у полиномов есть не только вещественные корни?
Не торчат ли здесь уши сферических функций?

Что же, будет чем заняться дальше.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru