Одна формула, що ітерується назавжди
І Джуліанова множина, і множина Мандельброта походять від одного абсурдно короткого рецепту: оберіть комплексне число z, повторно замінюйте його на z² + c, і спостерігайте, що відбувається. Для Джуліанової множини з фіксованим параметром c ви скануєте площину початкових точок z₀ та запитуєте, чи залишається орбіта для кожної з них обмеженою назавжди або врешті-решт покидає її до нескінченності. Для множини Мандельброта ви замінюєте початкову точку z₀ = 0 та скануєте площину параметрів c, ставлячи той самий запит про те, чи покидає орбіта кожної з них межі до нескінченності.
z₀ = (starting point, Julia) or 0 (Mandelbrot)
z_{n+1} = z_n² + c
if |z_n| > 2 for some n, the orbit escapes — it will diverge to infinity
Алгоритм виходу
У практиці жоден комп’ютер не ітерується назавжди. Симуляція обмежує кількість ітерацій певним максимальним значенням (кілька сотень ітерацій), і для кожного пікселя вона ітерує формулу до тих пір, поки амплітуда z не перевищиє 2 — у цьому випадку орбіта визнано небезпечною та обов’язково розійдеться — або вичерпається бюджет ітерацій, тоді точка вважається належною до обмеженого множини. Забарвлення кожного ‘вирваного’ пікселя тим, скільки ітерацій він витримав, а не просто чорним чи білим, перетворює межу на гладку, насичено забарвлену смужку, яку всі знають.
for each pixel (x, y):
z = complex(x, y) // Julia: fixed c, varying z0
for n in 0..maxIter:
if |z| > 2: colour(pixel, n); break
z = z*z + c
else: colour(pixel, "in set")
Чому дві множини пов'язані
Зв’язок не є випадковістю: для заданого c, множина Юліа є зв’язною (одна тверда крапля) точно тоді, коли орбіта 0 під z² + c залишається обмеженою — тобто, коли c саме належить множині Мандельброта. Виберіть c глибоко всередині множини Мандельброта і її множина Юліа буде єдиним зв’язним об’єктом; виберіть c зовні і множина Юліа розпадається на нескінченний, відокремлений від один одного набір точок, технічно названий Канторомським набором. Це пояснює, чому натискання навколо множини Мандельброта для вибору c, як дозволяє симуляція, насправді визначає, з якої з двох суттєво різних родин множин Юліа ви бачите.
Самоподібність без повторень
Збільшення в будь-який із наборів ніколи не досягає повторюваного візерунка, як у звичайному мозайці. Оскільки ітерація є однаковою нелінійною картою, яка застосовується на кожному рівні, структури поблизу межі віддзеркалюють форму всього набору в мініатюрі, трохи спотвореної кожного разу — це визначальний знак фрактальної межі, і причина, чому обидва набори виглядають безкінечно деталізованими незалежно від того, як далеко ви збільшуєте.
Frequently asked questions
Яке саме відношення між множиною Джулії та множиною Мандельброта?
Множина Мандельброта – це карта параметрів c: для кожного c ви запитуєте, чи є множина Джулії, побудована з цього c, однією з’єднаною частиною або розсипом пилу. Якщо параметр c обрано всередині множини Мандельброта, то завжди отримується з’єднана множина Джулії; якщо c обрано зовні – завжди отримується відокремлена, пилоподібна.
Чому деякі множини Джулії виглядають як твердий клубок, а інші – як розсип пилу?
Це залежить лише від того, чи залишається орбіта 0 під z² + c обмеженою (c всередині множини Мандельброта, з’єднана множина Джулії) чи розширюється до нескінченності (c зовні, відокремлений пил). Немає жодного посереднього стану – кожна множина Джулії є або однією, або іншою.
Чому тест на відхід використовує радіус 2 конкретно?
Це можна довести, що коли |z| перевищує 2 під цією картою, величина гарантовано зростатиме без обмежень на кожному наступному кроці, тому орбіта ніколи не повернеться – 2 є найменшим радіусом, для якого це гарантія виконується, що робить його найдешевшим безпечним порогом.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Julia Set і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Julia Set