Множина Мандельброта

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Множина Мандельброта.
Колір відповідає швидкості зростання Zn
Детальне збільшення множини Мандельброта

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

Зображення множини Мандельброта можна створити шляхом вибірки комплексних чисел і тестування, для кожної точки вибірки , чи послідовність прямує до нескінченності (на практиці перевіряють, чи залишає вона деякий визначений окіл 0 після визначеної кількості ітерацій). Якщо інтерпретувати дійсну і уявну частини числа як координати зображення на площині комплексних чисел, то колір пікселя можна визначити відповідно до того, як швидко послідовність перетинає довільно вибране порогове значення, де спеціальний колір (як правило чорний) використовують для значень в яких послідовність не перетинає порогове значення після визначеної кількості ітерацій (це необхідно аби чітко розрізняти зображення множини Мандельброта від зображення її доповнення). Якщо залишатиметься сталим, а замість того змінним буде початкове значення  — що позначається як , буде отримано відповідну множину Жуліа для кожної точки в просторі параметрів простої функції.

Точне значення площі множини Мандельброта невідоме. На 2012 рік вона оцінювалася як 1,506 591 884 9 ± 2,8×10−9. Точна координата центра мас (розташованого на осі абсцис) теж невідома і оцінюється як −0,286 768 420 48 ± 3,35×10−9[1].

Принцип побудови[ред. | ред. код]

Візьмімо точку , що лежить на комплексній площині. Нехай

=
=
=
і так далі ….

Якщо послідовність з завжди залишається близько до і ніколи не віддаляється, тоді точка C належить множині Мандельброта.[2]

Формально[ред. | ред. код]

Сукупність елементів поля комплексних чисел, для яких послідовність:, що визначена ітераційно за правилом

, де

задовольняє умову


називають множиною Мандельброта.

Комплексні числа можна трактувати як точки на площині. Тоді множину Мандельброта можна побудувати у просторі .

Розширене визначення[ред. | ред. код]

Вищевказана послідовність може бути розкрита для кожної точки на комплексній площині таким чином:

і так далі.

Якщо переформулювати ці вирази у вигляді ітеративної послідовності значень координат комплексної площини , тобто замінивши на , а на , отримаємо:

Візуально, всередині множини Мандельброта можна виділити нескінченну кількість елементарних фігур, причому найбільша в центрі являє собою кардіоїду. Також є набір овалів, дотичних до кардіоїди, розмір яких поступово зменшується, прямуючи до нуля. Кожен з цих овалів має свій набір менших овалів, діаметр яких також прямує до нуля і т. д. Цей процес триває нескінченно, утворюючи фрактал. Також важливо, що ці процеси розгалуження фігур не вичерпують повністю множину Мандельброта: якщо розглянути зі збільшенням додаткові «гілки», то в них можна побачити свої кардіоїди та кола, не пов'язані з головною фігурою. Найбільша фігура (видима при розгляданні основної множини) з них знаходиться в області від -1,78 до -1,75 на від'ємній осі дійсних значень.

Історія множини Мандельброта[ред. | ред. код]

Вперше множину Мандельброта було описано в 1905 році П'єром Фату, французьким математиком, який працював в галузі аналітичної динаміки комплексних чисел. Фату вивчав рекурсивні процеси виду

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

Фату знайшов, що орбіта при цьому перетворенні показує досить складну і цікаву поведінку. Існує нескінченна множина таких перетворень — своя для кожного значення . В ті часи комп'ютерів ще не було, і Фату, звичайно, не міг побудувати орбіти всіх точок площини, йому доводилося робити все вручну. Ґрунтуючись на своїх розрахунках, він довів, що орбіта точки, що лежить на відстані більше 2 від початку координат, завжди йде в нескінченність.

Фату ніколи не бачив зображень, які ми зараз знаємо як зображення множини Мандельброта, тому що необхідну кількість обчислень неможливо провести вручну. Професор Бенуа Мандельброт був першим, хто використав для цього комп'ютер.

Фрактали були описані Мандельбротом у 1975 році в його книзі «Les Objets Fractals: Forme, Hasard et Dimension» («Фрактальні об'єкти: форма, випадковість і розмірність»). У цій книзі Мандельброт вперше використав термін «фрактал» для позначення математичного феномена, який демонструє настільки непередбачувану і дивну поведінку. Ці феномени народжувалися при використанні рекурсивного алгоритму для отримання якої-небудь кривої або множини. Множина Мандельброта — один із таких феноменів, названий за іменем свого дослідника.

Побудова множини[ред. | ред. код]

Неважко довести, що як тільки модуль zn виявиться більшим від 2 (або, у термінах дійсної і уявної частин, xn2 + yn2 > 4), послідовність прямуватиме до нескінченності. У разі |c| ⩽ 2 це можна довести за допомогою методу математичної індукції. При |c| > 2 точка c не належить множині Мандельброта, що також можна вивести методом індукції, використовуючи рівність z0 = 0. (Хоча в цьому випадку може існувати інше z0, для якого відповідна послідовність обмежена за модулем, але для деякого n виконується нерівність |zn| > 2.)

Порівняння |zn| з цим числом (в англомовній літературі його називають «bail-out») дозволяє виділяти точки, що не потрапляють всередину множини. Для точок, що лежать всередині множини, послідовність не буде мати тенденції до нескінченності і ніколи не досягне цього числа, тому після певного числа ітерацій розрахунок необхідно примусово завершити. Максимальне число ітерацій, після яких число вважається таким, що потрапило всередину множини, задається в програмі.

Зображення, отримане таким способом, є лише наближенням до реальної множини Мандельброта. Більш якісні результати можна отримувати, збільшуючи максимальну кількість ітерацій, однак при цьому пропорційно зростає і час розрахунків.

Додання кольору[ред. | ред. код]

Фрагмент межі множини Мандельброта в кольоровому варіанті

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

Порядок визначення, потрапляє точка z0 всередину множини (яка традиційно зафарбовується чорним кольором) чи ні (зафарбовується кольором, залежним від швидкості руху в нескінченність) такий: на кожній ітерації для zn = xn + yn·i обчислюється значення модуля , який потім порівнюється з «межею нескінченності» (зазвичай береться значення, що дорівнює 2). Тут важливо звернути увагу, що вже на даному етапі можна запровадити певну оптимізацію обчислень, якщо не перевіряти , а , що значно знизить час розрахунків.

Таким чином, якщо |zn|2 ⩽ 4 за будь-якого числа ітерацій (на практиці — при всіх обчислених ітераціях), то колір точки чорний, в іншому випадку він залежить від останнього значення n, за якого |zn|2 ⩽ 4. Значення n, фактично, означає швидкість руху zn в нескінченність і може бути просто індексом у таблиці кольорів або використовуватись як параметр у більш складному алгоритмі.

Даний алгоритм визначає, що якщо точка віддаляється більше ніж на 2 від початку координат, то вона лежить зовні множини Мандельброта. Для того, щоб визначити, що точка лежить всередині множини, є багато способів. Найпростіше рішення — обмежити кількість ітерацій певним максимумом. Якщо точка не вийшла за зазначену межу, можна вважати, що вона знаходиться всередині множини.

Точкам біля межі множини потрібно більше ітерацій для виходу в нескінченність. Тому такі області промальовуються помітно довше. Чим далі від кордонів множини, тим вища швидкість відходу в нескінченність. Для таких точок потрібно менше ітерацій.

Оптимізація[ред. | ред. код]

Одним зі способів зменшення обсягу обчислень при обчисленні загальної картини множини може служити перевірка, чи потрапляє точка в область головної кардіоїди. Формула кардіоїди в полярних координатах виглядає так:

Таким чином, для точки необхідно обчислити

Якщо , то точка потрапляє всередину множини і зафарбовується чорним кольором, а повторне обчислення можна пропустити.

На практиці найбільше зменшення обсягу обчислень дає трасування межі: якщо є деяка замкнута крива, що не перетинає вісь абсцис, кожна точка якої йде за межу (англ. bail-out) за однакове число ітерацій або, навпаки, належить множині Мандельброта, то будь-яка точка всередині цієї кривої буде володіти тією ж властивістю, а отже вся область всередині межі зафарбовується однаковим кольором.

Зв'язок з множиною Жюліа[ред. | ред. код]

Фрагмент множини Мандельброта, що лежить в районі її межі
Фрактал Жюліа
Збільшення на межі множини Мандельброта формує зображення, аналогічні множині Жюліа

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

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

Множина Мандельброта й сама містить структури, що нагадують множину Жюліа: для будь-якого область множини Мандельброта поблизу нагадує центр множини Жюліа з параметром . Якщо сильно збільшити множину Мандельброта в граничній точці c і те ж саме зробити з множиною Жюліа для цього ж значення c і в цій самій точці, то картини будуть асимптотично прямувати одна до одної при зростанні збільшення.

Варіації множини Мандельброта[ред. | ред. код]

Найчастіше під назвою «множина Мандельброта» розуміється тільки множина, описана вище. Однак будь-яка функція комплексної змінної має відповідну множину Мандельброта, що також характеризується наявністю або відсутністю зв'язної множини Жюліа. Наприклад, можна покласти fc(z) = z3 + c. Тоді для кожного значення c перевіряється зв'язність множини Жюліа функції fc і за наявності зв'язності вважається, що c належить множині Мандельброта. В описаному випадку зв'язність можна перевірити тим самим способом, що й для fc(z) = z2 + c.

Ці твердження можна узагальнити і на множини Жюліа, визначувані більше, ніж двома числами. Наприклад, безліч Жюліа, обумовлена трьома дійсними числами, має відповідну тривимірну множину Мандельброта.

Розглядаються і багатовимірні варіації множини Мандельброта. Так, тривимірний аналог отримав назву лампочка Мандельброта, хоча класичні аналоги на комплексних числах існують тільки в розмірності, рівній степеню 2.

Застосування множини Мандельброта[ред. | ред. код]

Безліч Мандельброта знаходить застосування для аналізу виникнення турбулентності у фізиці плазми і термодинаміці, розвитку біфуркацій тощо.[джерело не вказано 61 день]

Застосування множини Мандельброта в мистецтві[ред. | ред. код]

Пошук гарних зображень множини Мандельброта — цікаве хобі для дуже багатьох людей. Вони збирають колекції таких зображень, причому кожне з них може бути описане невеликою кількістю параметрів, наприклад, просто координатами центра.

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

Математичні факти про множину Мандельброта[ред. | ред. код]

Douady і Hubbard довели, що множина Мандельброта є зв'язною, хоча в це й важко повірити, дивлячись на хитрі системи мостів, що з'єднують різні її частини. Зв'язність множини Мандельброта випливає з того, що вона є перетином вкладених зв'язкних компактних множин.

Однак невідомо, чи є вона локально зв'язною. Ця відома гіпотеза в комплексній динаміці отримала назву MLC (англ. Mandelbrot locally connected). Багато математиків докладають зусиль до її доведення. Jean-Christophe Yoccoz довів, що гіпотеза правильна у всіх точках зі скінченною ренормалізацією, потім багато інших математиків доводили справедливість гіпотези у багатьох окремих точках множини Мандельброта, але загальна гіпотеза залишається недоведеною.

Mitsuhiro Shishikura довів, що розмірність Гаусдорфа межі множини Мандельброта дорівнює 2. Але залишається невідомою відповідь на питання, чи має межа множини Мандельброта додатну міру Лебега на площині.

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

Як намалювати?[ред. | ред. код]

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

і, за методом математичної індукції, всі наступні ітерації теж поза колом радіуса . Якщо ж , то

і (тут верхній індекс позначає номер ітерації).

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

Код мовою Python, що за розмірами генерує зображення множини Мандельброта, на якому колір позначає номер ітерації розбіжності.

""" @author: Nikita Skybytskyi : Mandelbrot set in 16 lines of code """
import numpy as np
import matplotlib.pyplot as plt

def mandelbrot(h, w, max_iter=40):
    """Returns an image of the Mandelbrot fractal of size (h,w)."""
    y, x = np.ogrid[-1.5 : 1.5 : h * 1j, -2 : 1 : w * 1j]
    c = x + y * 1j
    z = c
    div_time = max_iter + np.zeros(z.shape, dtype=int)
    
    for iteration in range(max_iter):
        z = z**2 + c
        diverge = z * np.conj(z) > 2**2             # орбіти яких точок розходяться
        div_now = diverge & (div_time == max_iter)  # орбіти яких точок починають розходитися на цій ітерації
        div_time[div_now] = iteration               # запам'ятовуємо, хто коли починає розходитися 
        z[diverge] = 2                              # уникаємо надто сильної розбіжності (вона може призвести до переповнення)
        
    return div_time

plt.imshow(mandelbrot(800,800))
plt.show()

Примітки[ред. | ред. код]

  1. Pixel Counting [Архівовано 17 червня 2017 у Wayback Machine.](англ.).
  2. За Піснею про множину Мандельброта Jonathan Coulton Mandelbrot Set [Архівовано 10 квітня 2007 у Wayback Machine.] (mp3 теж можна звантажити безплатно)

Література[ред. | ред. код]

  • Бенуа Мандельброт, Ричард Л. Хадсон. (Не)послушные рынки: фрактальная революция в финансах = The Misbehavior of Markets. — М. : «Вильямс», 2005. — С. 400. — ISBN 5-8459-0922-8.

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]