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

Одна короткая формула $z\to z^2+c$ порождает бесконечно сложную фрактальную границу.

Множество Мандельброта — набор комплексных чисел $c$, для которых итерация $z_{n+1}=z_n^2+c$ (начиная с $z_0=0$) не уходит в бесконечность.

Правило игры

Выбираем комплексное число $c$. Запускаем итерацию: $z_0=0$, затем многократно применяем $z\to z^2+c$. Возможны два исхода: либо последовательность остаётся ограниченной (точки не разбегаются), либо модуль $|z|$ растёт неограниченно. В первом случае $c$ принадлежит множеству Мандельброта, во втором — нет.

Доказано, что как только $|z|\gt2$, точка уже обязательно убежит. Поэтому критерий простой: итерируем и проверяем, превысил ли модуль $2$.

Проверка точек

Напишем функцию, возвращающую число итераций до «побега» (или $-1$, если точка осталась внутри за отведённое число шагов):

def escape(c, max_iter=50):
    z = 0
    for i in range(max_iter):
        z = z*z + c
        if abs(z) > 2:
            return i  # убежала на шаге i
    return -1          # осталась внутри

for c in [0, -1, 1, 0.3+0.5j, -0.8+0.156j, 2]:
    r = escape(c)
    status = "внутри" if r == -1 else f"убежала на шаге {r}"
    print(f"c={c}: {status}")

Вывод:

c=0: внутри
c=(-1+0j): внутри
c=(1+0j): убежала на шаге 2
c=(0.3+0.5j): внутри
c=(-0.8+0.156j): внутри
c=2: убежала на шаге 1

Точки $c=0$ и $c=-1$ остаются ограниченными (они в множестве), а $c=1$ и $c=2$ быстро убегают (вне множества). Граница между «внутри» и «снаружи» бесконечно изломана — это и есть фрактал.

ASCII-картинка множества

Раскрасив плоскость по признаку «внутри/снаружи», получим узнаваемую форму. Сделаем грубую текстовую визуализацию:

def escape(c, max_iter=30):
    z = 0
    for i in range(max_iter):
        z = z*z + c
        if abs(z) > 2:
            return False
    return True

for row in range(-10, 11):
    line = ""
    for col in range(-30, 11):
        c = complex(col/20, row/12)
        line += "#" if escape(c) else " "
    print(line)

Вывод:

                           ## #          
                          #####          
                        #  ##            
                   ## ############ ###   
                   ##################    
                 #####################   
                 ####################### 
       # ###    ######################   
     ########## ######################   
      ###############################    
####################################     
      ###############################    
     ########## ######################   
       # ###    ######################   
                 ####################### 
                 #####################   
                   ##################    
                   ## ############ ###   
                        #  ##            
                          #####          
                           ## #          

Даже в такой грубой сетке проступает характерная форма множества Мандельброта: большое «тело» с почкой слева.

Как работает под капотом

Почему такая элементарная формула рождает бесконечную сложность? Итерация $z^2+c$ сочетает удвоение угла (от $z^2$) и сдвиг (от $+c$) — небольшое изменение $c$ может радикально поменять судьбу траектории. Граница множества имеет фрактальную размерность: сколько ни увеличивай, видны всё новые узоры, подобные целому. Это наглядный пример того, как простое детерминированное правило порождает безграничную сложность — связь комплексного анализа с теорией хаоса.

Частые ошибки

  • Начинать итерацию не с нуля. Для множества Мандельброта всегда $z_0=0$, меняется только параметр $c$.
  • Брать слишком мало итераций. Точки у границы убегают медленно, нужно достаточно шагов.
  • Путать множество Мандельброта (по параметру $c$) с множествами Жюлиа (по начальному $z$ при фиксированном $c$).

Итог

  • Множество Мандельброта — точки $c$, для которых итерация $z\to z^2+c$ не убегает в бесконечность.
  • Критерий побега: как только $|z|\gt2$, точка уже не вернётся.
  • Простое правило рождает фрактал с бесконечной сложностью — мост к теории хаоса.
Проверьте себя
1. С какого значения $z_0$ начинается итерация для множества Мандельброта?
A$z_0=c$
B$z_0=0$
C$z_0=1$
D$z_0=2$
2. По какому признаку точка считается убежавшей из множества?
AКогда $z$ становится вещественным
BКогда модуль $|z|$ превысил 2
CКогда $z=c$
DКогда сделано ровно 10 шагов
3. Чем множество Мандельброта отличается от множеств Жюлиа?
AНичем, это синонимы
BМандельброт строится по параметру $c$ (при $z_0=0$), Жюлиа — по начальному $z$ при фиксированном $c$
CЖюлиа не использует комплексные числа
DМандельброт всегда конечен, Жюлиа бесконечно