Множина Мандельброта: нескінченна складність із простих правил

Як ітерація z → z² + c породжує нескінченну складність? Досліджуємо обчислення множини Мандельброта, алгоритми плавного розфарбування, споріднені множини Жюліа та глибокий зв'язок фракталів із природними структурами — від берегових ліній до легень.

1980 року Бенуа Мандельброт надрукував перше впізнаване зображення множини, що згодом отримала його ім'я, на комп'ютері IBM у Йорктаун-Гайтс, штат Нью-Йорк. За сучасними мірками роздруківка була грубою — блокова, майже ASCII-графіка на папері, — але самоподібна, нескінченно складна межа не залишала сумнівів. Вона виникла з рівняння у два рядки. Майже п'ять десятиліть по тому множина Мандельброта лишається одним із найдивовижніших об'єктів усієї математики — і візуально, і математично: структура нескінченного багатства, схована у формулі, достатньо простій, щоб уміститися в один рядок коду.

Алгоритм: комплексна ітерація

Комплексне число c належить множині Мандельброта тоді й лише тоді, коли послідовність, визначена рекурентним співвідношенням z₀ = 0, zₙ₊₁ = zₙ² + c, не прямує до нескінченності при нескінченному ітеруванні. Обчислювально ми застосовуємо умову втечі: якщо модуль |z| колись перевищить 2, послідовність гарантовано розійдеться до нескінченності, і точка «втікає». Ми припиняємо ітерацію та фіксуємо, скільки кроків це зайняло.

function mandelbrot(cx, cy, maxIter) { let zx = 0, zy = 0; for (let i = 0; i < maxIter; i++) { const zx2 = zx * zx - zy * zy + cx; zy = 2 * zx * zy + cy; zx = zx2; if (zx * zx + zy * zy > 4) return i; } return maxIter; }

Точки, які ніколи не втікають — тобто повертають maxIter, — належать множині Мандельброта і зафарбовуються чорним. Точки, що втікають, забарвлюються залежно від швидкості втечі: ті, що втікають швидко, отримують один колір, повільні — інший. Межу ітерацій зазвичай встановлюють між 100 і 1000; вищі межі виявляють дрібніші деталі поблизу кордону множини, але вимагають більше обчислень. Безпосередньо на кордоні — нескінченно тонкій межі між збіжністю та розбіжністю — кількість ітерацій може бути як завгодно великою.

Чому радіус втечі дорівнює 2: математично доведено, що якщо |z| колись перевищить 2, орбіта z₀, z₁, z₂, … розійдеться до нескінченності. Використання більшого радіуса втечі (наприклад, 100) уможливлює алгоритм плавного розфарбування, описаний нижче, майже без додаткових обчислювальних витрат.

Плавне розфарбування та алгоритм радіуса втечі

Наївне розфарбування пікселів за цілим числом ітерацій дає потворні концентричні смуги — помітні «кільця» навколо множини. Смугастість виникає тому, що кількість ітерацій — величина дискретна, вона змінюється цілими числами, тоді як справжня швидкість розбіжності змінюється неперервно. Розв'язок — алгоритм неперервного (плавного) часу втечі.

Коли точка втікає на ітерації i з кінцевим значенням z, плавний час втечі обчислюється так:

mu = i - log(log(|z|) / log(2)) / log(2)

Цей поправочний доданок прибирає цілочислові «сходинки», породжуючи плавне дійсне число, яке неперервно зростає в міру віддалення точок від межі множини. Відображення mu на колірну палітру — зазвичай циклічним проходом по відтінку (hue) у просторі HSL або ретельно підібраним градієнтом — дає ті плавні, полум'яподібні кольорові смуги, які зробили візуалізації множини Мандельброта культовими.

Глибина масштабування, досяжна програмно, вражає. Стандартні числа з плаваючою комою подвійної точності, які використовують у більшості реалізацій, дозволяють досягти масштабу приблизно 10¹⁵, доки точність не вичерпується і зображення не розсипається на пікселізовані артефакти. На такій глибині з'являються структури, що моторошно повторюють початкову множину верхнього рівня: мініатюрні копії Мандельброта, що плавають серед ниток, оточені власним вигадливим мереживом спіралей і бульбашок. Бібліотеки арифметики довільної точності дозволяють досягати масштабів 10^1000 і глибше, розкриваючи структуру на масштабах, що не мають фізичного сенсу — множина не є фізичним об'єктом, це чиста математика.

Множини Жюліа: родичі Мандельброта

Множина Мандельброта тісно пов'язана із сімейством фракталів, які називають множинами Жюліа — на честь французького математика Гастона Жюліа, який досліджував комплексну ітерацію ще 1918 року, за десятиліття до того, як хтось міг візуалізувати його роботу на комп'ютері. Щоб обчислити множину Жюліа, ролі міняють місцями: c фіксують як конкретне комплексне число, а початкову точку z₀ змінюють по всій комплексній площині. Для кожної початкової точки ставлять те саме запитання: чи розходиться орбіта?

Зв'язок між цими двома типами множин — одна з найкрасивіших теорем комплексної динаміки:

Тож множина Мандельброта буквально є картою зв'язності множин Жюліа. Кожна точка на межі множини Мандельброта відповідає множині Жюліа, що переживає топологічний фазовий перехід від зв'язної до незв'язної. Наближення до межі Мандельброта й пошук мініатюрної копії множини рівносильні пошуку області, де локальні множини Жюліа близько нагадують ціле.

Розмірність Гаусдорфа межі множини Мандельброта була доведена як така, що дорівнює точно 2, Міцухіро Шишикурою 1998 року — тобто межа настільки нескінченно складна, що заповнює простір так само щільно, як двовимірна поверхня, попри те, що є кривою. Це фрактальна розмірність у своїй найекстремальнішій математичній формі.

Природні фрактали з'являються всюди, де ітеративні процеси росту діють без фіксованого масштабу: берегові лінії, виміряні з дедалі точнішою роздільною здатністю, стають нескінченно довшими (парадокс Річардсона), дерева розгалужуються під статистично самоподібними кутами, промені сніжинок ростуть як деревоподібні фрактали, бронхи людських легень розгалужуються протягом 23 поколінь, а дельти річок, побачені з супутника, виглядають однаково і на масштабі 10 км, і на масштабі 100 км. Усі вони мають фрактальну розмірність між 1 і 2 — складніші за лінію, але менш щільно заповнюючі простір, ніж площина. Множина Мандельброта об'єднує їх усіх як приклади одного й того самого математичного явища: нескінченної складності з кінцевого правила, ітерованого без обмежень.