Читатель! Взгляни на рисунок. Что ты видишь? Что-то похожее на бактерии, инфузории или какие-то микробы под микроскопом.

биоморфы

Это — биоморфы (то есть формы, напоминающие живые организмы), обитатели комплексной плоскости, порождения компьютерной программы. Их придумал К.Пикоувер, ученый из исследовательского центра фирмы IBM. С комплексной плоскостью, надеюсь, ты знаком. Это плоскость, точка на которой называется комплексным числом и состоит из двух частей — действительной (координата x) и мнимой (координата y). Такое число записывается так: x+y·i. Число i — это воображаемое число, квадратный корень из -1, то есть i2=-1. Некоторые возразят — из отрицательных чисел нельзя взять квадратный корень. Но на то это число и воображаемое. На комплексной плоскости обитают еще несколько объектов — такие как множество Мандельброта и множества Жюлиа.
Все эти объекты — фракталы. Фракталы представляют собой структуры с дробной размерностью. Название «фрактал», которое было предложено Бенуа Мандельбротом в 1975 году, происходит от латинского fractus, что значит «образованный из фрагментов, дробный». Это, конечно, сложно, а если проще — это бесконечно самоподобные объекты. Часть фрактала под увеличением напоминает сам фрактал, и так до бесконечности. Сам Бенуа Мандельброт определяет фрактал так: «Фракталом называется структура, состоящая из частей, которые в каком-то смысле подобны целому». Узнать больше о фракталах можно, к примеру, тут: «Красивая жизнь комплексных чисел».
Программа, порождающая биоморфы, по специальным правилам итерирует функции комплексных переменных. На каждом шаге результат вычисления принимается за значение переменной на следующем шаге, то есть zn+1:=f(zn).

Написать такую программу несложно. Например, рассмотрим создание под номером 5, похожее на радиолярию. Оно получается итерированием функции f(z)=z3+c, где с — это постоянная. Обычно выбирают для с небольшое значение, например, 0.5+0·i.

Вот алгоритм вычислений, который ты можешь перевести на свой любимый язык программирования:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
c:=0.5+0·i
for x:=-10 to 10 step 0.1
    for y:=-10 to 10 step 0.1
        z:=x+y·i
        k:=0
        repeat
            k:=k+1
            z:=z<sup>3</sup>+c
        until |Re(z)|&gt;10 or |Im(z)|&gt;10 or |z|&gt;10 or k=100
        if |Re(z)|&gt;10 or |Im(z)|&gt;10 then
            Раскрасить(x,y,черный)
        else
            Раскрасить(x,y,белый)
        endif
    endfor
endfor
Биоморфы на самом деле представляют собой сокращенную и по-другому раскрашенную версию множества Жюлиа, которое представляется формулой z=z2+c, а внутренняя часть биоморфов (особенно №5) напоминает множество Жюлиа.
Вначале организуем вложенные циклы для того, чтобы «пробежать» все точки на комплексной плоскости от -10-10·i до 10+10·i (все биоморфы, изображенные на рисунке, были обнаружены в квадрате размером 20*20 и центром в начале координат). После чего для каждой такой точки многократно вычисляем формулу z:=z3+c. Re(z) обозначает действительную, а Im(z) — мнимую часть числа z.

Повторяем внутренний цикл, пока одно из частей числа z или его модуль достигнет 10 (модуль числа x+y·i равен квадратному корню из x2+y2). На самом деле, проще и быстрее сравнивать квадрат модуля (x2+y2) с числом 100, чем сам модуль с числом 10 — экономишь на извлечении квадратного корня. Переменная k выступает как ограничитель, на случай того, если предыдущие условия никогда не выполнятся. Без нее программа может зациклиться.

Затем нужно раскрасить точку с координатами (x,y) на экране в зависимости от величины получившегося комплексного числа z черным или белым цветом. Но поскольку числа x и y лежат в диапазоне от -10 до 10, тебе придется перевести их в координаты пикселей на экране, умножив их на коэффициенты и добавив сдвиг, например:
1
2
xs:=(x+10)*20
ys:=(y+10)*20
где xs, ys — координаты пикселя на экране.
Пикоувер обнаружил биоморфы из-за ошибки в своей программе, с помощью которой он исследовал фрактальные свойства комплексных функций. Вместо and в процедуре принятия решения окраски точки белым или черным цветом он по ошибке написал or, из-за чего гораздо большее количество точек было окрашено в черный цвет. В частности, реснички и жгутики биоморфов состоят именно из таких точек.
Конечно, переменные c и z комплексные, и на обычном языке программирования придется попотеть, чтобы организовать умножение и сложение.  К примеру, записать выражение z:=z3+c можно так:
1
2
3
xx:=x*(x*x-3*y*y)+Re(c)
y:=y*(3*x*x-y*y)+Im(c)
x:=xx


Здесь x и y — действительная и мнимая части комплексного числа z, а Re(c) и Im(c) — действительная и мнимая части комплексного числа с, которое у нас постоянно.

Правила для математики комплексных чисел такие:
  1. Сложение: (a1+b1·i)+(a2+b2·i)=(a1+b1)+(a2+b2)·i
  2. Умножение: (a1+b1·i)·(a2+b2·i)=(a1·a2-b1·b2)+(a1·b2+b1·a2)·i
  3. Возведение в квадрат: (a+b·i)2=(a2-b2)+2·b·i
Остальные формулы выражаются так:
  1. Sin(a+b·i)=sin(a)·ch(b)+(cos(a)·sh(b))·i, где ch — гиперболический косинус, sh — гиперболический синус
  2. ea+b·i=ea·cos(b)+(ea·sin(b))·i
  3. Ln(a+b·i)=1/2·ln(a2+b2)+arg(a+b·i)·i, где arg — аргумент комплексного числа, который вычисляется так: Arg(a+b·i)=arctg(b/a), причем при y<0 и x>0 к результату надо добавить Пи, а при y<0 и x<0 — вычесть Пи из результата.
  4. И самая экзотическая функция — zz=ez·ln(z)
Для тебя, читатель, оставлю возможность исследовать еще и другие формулы. Также можно на свое усмотрение выбирать в программе значения c и k. Попробуй раскрашивать точки не черным или белым цветом, а цветом, зависящим, например от значения переменной k. В таблице приводятся формулы, которые соответствуют биоморфам на рисунке.
Формула
1,2,8,10 z=zz+z6+c
3 z=sin(z3)+c
4,6,7,11 z=z2+sin(z)+c
5 z=z3+c
9 z=z5+c
12,14 z=ez+sin(z)+c
13 z=zz+z3+c
Тому, кому не хочется разбираться в этих математических дебрях, предлагаю скачать исходные тексты программы для разглядывания биоморфов на Delphi 5. В архиве также есть отдельный модуль для комплексных вычислений.

Биоморфы
6.8 KiB
179 Downloads
Детали

Страница просмотрена 1906 раз(а)