- PVSM.RU - https://www.pvsm.ru -
Привет. Кипят страсти, конец года, сессии, дедлайны, новый год, а так же цензура проникает во все слои интернетов, что не может не печалить. Хабр уже не торт [1]. Просто хотелось написать, что я не согласен с таким подходом, но тогда бы меня просто забанили. Так что придется написать интересный контент. Хотя если забанят из-за предисловия к посту о множестве Жюлиа, ну что, тогда остатки торта стухли и шансов нет.
Итак, вернемся к теме поста. Я давно хотел немного больше узнать о комплексных числах, а не только то, что корень из минус единицы равен i. Особенно вызывали интерес фигуры имеющие фрактальную структуру, хотелось понять, что это значит, и как сделать такую визуализацию. Где то на полке стояла книжка по ТФКП [2], а так же закончился курс по комплексному анализу на курсере [3], и появилось немного свободного от работы времени. Приступим.
Перед тем как написать алгоритм, придется изучить несколько базовых понятий. Начнем мы с понятия итерация функции f. Введем следующее обозначение n-ой итерации функции [4] f:

За нулевую итерацию принимается тождественное отображение [6]:

Существует множество теорем о неподвижных точках [7] определенных типов отображений, вспомним что такое неподвижная точка некоторого отображения g, это решение следующего уравнения:

Аналогично, для итерации функции вводится притягивающая точка [8] — такая точка из области определения функции f, что последовательность значение итераций функции f сходится к некоторой неподвижной точке отображения f:

Множество всех y, удовлетворяющее предыдущему условию — называется предельным множеством точки x под действием итерации функции f.
Как правило, интерес представляет изучение последовательности функций образованных итерациями (подобную идею можно увидеть в методе Ньютона [9], искомое решение оказывается притягивающей неподвижной точкой построенного отображения, и потому может быть найдено как предел последовательности итераций.)

а так же последовательность значений вычисленных в некоторой начальной точке

Для комплексного мира визуализировать итеративную сходимость точки y к x под действием итерации функции f немного проблематично, все таки 4d, но для действительного мира картина всего 2d (красная траектория расходится, в то время как синяя сходится к неподвижной точке).

Итак, первый камушек, необходимый для понимания множества Жюлиа заложен, перейдем к следующему.
Вообще множество Жюлиа строится для функции вида

Мы же упростим задачу, и будем строить множество Жюлиа только для квадратичного полинома. Квадратичный комплексный полином в общем виде выглядит следующим образом:

Так же существует понятие унитарной (a = 1) центрированной (b = 0) формы квадратичного полинома

Введем следующее отображение φ, и найдем его обратное отображение:


Рассмотрим следующее выражение

Легко заметить, что последнее выражение напоминает квадратичный полином в общем виде p(z), давайте найдем такое c, что бы привести полученное выражение к квадратичному полиному общего вида

Таким образом мы показали, что при вышеприведенной замене c, полином общего вида можно записать как

Перейдем к третьему камушку базы для понимания множества Жюлиа. Рассмотрим вторую итерацию комплексного квадратичного полинома

Не трудно показать, что

И как раз вот тут мы объединяем все три пункта, давайте сформулируем вывод: для того что бы исследовать поведение квадратичного полинома под действием итераций, достаточно исследовать его в унитарной центрированной форме, а не в общем виде. А это реально круто, ведь в общем виде мы имеем целых три коэффициента, а в унитарной центрированной форме всего лишь один.
Уже скоро можно будет дать определение множества Жюлиа. Мы будем рассматривать скорее интуитивные определения, нежели строго математические. Но сперва, рассмотрим понятие устойчивости. Решение некоторого дифференциального уравнения называется устойчивым, если поведение решения с условиями, близкими к начальным, не сильно отличается от поведения исходного решения. Не трудно догадаться, что вся соль во фразе не сильно отличается. Вообще выделяют различные типы устойчивости, например в определении множества Жюлиа участвует устойчивость по Ляпунову (это более ясное определение вытекает из теоремы Монтеля о компактном семействе функций [10]), но мы даже не будем вдаваться в суть различий устойчивостей, тут главное понять идею. Попробуем это проиллюстрировать. Для начала взглянем на интуитивное восприятие устойчивости, тут синяя и желтые траектории точек при небольшом изменении ведут себя почти одинаково, в то время как для красной траектории, небольшое изменение ведет совершенно в другую сторону.

Давайте рассмотрим следующий полином f(z) = z2 — 1 + 0.213i, и построим траекторию для 100 итераций при z0 = 0.3 + 0.2i и z0 = 0.31 + 0.2i

В этом примере вы видите, что небольшое изменение в начальном условии вылилось в расхождение траекторий, такое поведение мы назовем хаотичным в некоторой окрестности начальной точки, т.е. поведение сильно зависит от небольших изменений в начальных условиях. В то время как поведение при котором сохраняется устойчивость, т.е. небольшие изменения в начальных условиях не сильно влияют на поведение в целом, мы будем называть нормальным, как в следующем примере. Рассмотрим следующий полином f(z) = z2 — 1 + 0.2i (всего лишь чуть изменили константу c), и построим траекторию для 100 итераций при z0 = 0.3 + 0.2i и z0 = 0.31 + 0.2i

Итак мы узнали смысл множества Жюлиа, можно приступить к алгоритму построения такого множества. Но и для этого, придется сперва ввести некоторые другие определения.
Рассмотрим A(∞) в контексте наших рассуждений для некоторого полинома f(z) = z2 + c

Оказывается существует следующая теорема. Множество A(∞) (в вышеописанном контексте) является открытым [13], связным [11]и неограниченным [14]. Оно полностью содержится во множестве Фату. Множество Жюлиа совпадает с границей [15]A(∞), которая является замкнутым [16]и ограниченным [14] подмножеством всех комплексных чисел.
Напоминаю, что мы напишем алгоритм для построения множества Жюлиа квадратичной динамики, а не любой функции. Итак мы узнали что множество Жюлиа совпадает с границей [15]A(∞), которая является замкнутым [16]и ограниченным [14] подмножеством всех комплексных чисел, т.е. множество Жюлиа тоже замкнуто и ограничено. Обозначим следующим образом то подмножество комплексных чисел, которое генерируется итерациями функции f и остается ограниченным. Назовем такое множество заполненным множеством Жюлиа:

И последняя теорема которая нам понадобится звучит следующим образом:

и n > 0 выполняется следующие условиеПомимо самого алгоритма, из этой теоремы можно сделать вывод, что все множество Жюлиа находится внутри шара радиуса R с центром в начале координат.
PS: примерно тут любители дизайна и золотых сечений, мистики и оккультики, заметят, что при f(z) = z2 + 1, порог R равен золотому сечению о_0
private static XBitmap PlotJuliaSet(ComplexNumber c, int w, int h, int maxIter,
double xMin = Double.NaN, double yMin = Double.NaN, double xMax = Double.NaN, double yMax = Double.NaN)
{
double r = CalculateR(c);
if (Double.IsNaN(xMin) || Double.IsNaN(xMax) || Double.IsNaN(yMin) || Double.IsNaN(yMax))
{
xMin = -r;
yMin = -r;
xMax = r;
yMax = r;
}
Logger.Instance.Log("R = " + r);
double xStep = Math.Abs(xMax - xMin) / w;
double yStep = Math.Abs(yMax - yMin) / h;
XBitmap bmp = new XBitmap(w, h);
IDictionary<int, IDictionary<int, int>> xyIdx = new Dictionary<int, IDictionary<int, int>>();
int maxIdx = 0;
for (int i = 0; i < w; i++)
{
xyIdx.Add(i, new Dictionary<int, int>());
for (int j = 0; j < h; j++)
{
double x = xMin + i * xStep;
double y = yMin + j * yStep;
ComplexNumber z = new ComplexNumber(x, y);
IList<ComplexNumber> zIter = SqPolyIteration(z, c, maxIter, r);
int idx = zIter.Count - 1;
if (maxIdx < idx)
{
maxIdx = idx;
}
xyIdx[i].Add(j, idx);
}
}
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
int idx = xyIdx[i][j];
double x = xMin + i * xStep;
double y = yMin + j * yStep;
ComplexNumber z = new ComplexNumber(x, y);
bmp.SetPixel(w - i - 1, j, ComplexHeatMap(idx, 0, maxIdx, z, r));
}
}
return bmp;
}
private static double CalculateR(ComplexNumber c)
{
return (1 + Math.Sqrt(1 + 4*c.Mod))/2;
}
public static Color ComplexHeatMap(decimal value, decimal min, decimal max, ComplexNumber z, double r)
{
decimal val = (value - min) / (max - min);
return Color.FromArgb(
255,
Convert.ToByte(255 * val),
Convert.ToByte(255 * (1 - val)),
Convert.ToByte(255 * (z.Mod / r > 1 ? 1 : z.Mod / r))
);
}
Вот несколько в картинок 5к на 5к, сделанных с помощью этой функции
А теперь давайте позумим множество Жюлиа для полинома f(z) = z2 — 0.74543 + 0.11301i, всё множество содержится в шаре радиуса 1.50197192317588.






Вот примерно на этой картинке кажется, что предел точности достигнут, и все красные элементы принадлежат множеству Жюлиа. Но не тут то было, увеличиваем параметр maxIter, и получаем еще более точное приближение. В общем продолжать можно до бесконечности. Без шуток -)
Автор: mephistopheies
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/matematika/51030
Ссылки в тексте:
[1] Хабр уже не торт: http://tjournal.ru/paper/deniskin
[2] ТФКП: http://ru.wikipedia.org/wiki/Комплексный_анализ
[3] курс по комплексному анализу на курсере: https://class.coursera.org/complexanalysis-001/
[4] n-ой итерации функции: http://en.wikipedia.org/wiki/Iterated_function
[5] композиция функций: http://ru.wikipedia.org/wiki/Композиция_функций
[6] тождественное отображение: http://ru.wikipedia.org/wiki/Тождественное_отображение
[7] теорем о неподвижных точках: http://en.wikipedia.org/wiki/Fixed-point_theorem
[8] притягивающая точка: http://ru.wikipedia.org/wiki/Неподвижная_точка
[9] методе Ньютона: http://ru.wikipedia.org/wiki/Метод_Ньютона
[10] теоремы Монтеля о компактном семействе функций: http://ru.wikipedia.org/wiki/Теорема_Монтеля_о_компактном_семействе_функций
[11] связно: http://ru.wikipedia.org/wiki/Связное_пространство
[12] Аттрактором: http://en.wikipedia.org/wiki/Attractor
[13] открытым: http://ru.wikipedia.org/wiki/Открытое_множество
[14] неограниченным: http://ru.wikipedia.org/wiki/Ограниченное множество
[15] границей : http://ru.wikipedia.org/wiki/Граница_(топология)
[16] замкнутым : http://ru.wikipedia.org/wiki/Замкнутое_множество
[17] f(z) = z2 — 0.8 + 0.156i: https://drive.google.com/file/d/0B4bl7YMqDnViR01xbGY5UW9GbVU/edit?usp=sharing
[18] f(z) = z2 + 0.285 + 0.01i: https://drive.google.com/file/d/0B4bl7YMqDnViMEpIUkJJaHV6YUE/edit?usp=sharing
[19] f(z) = z2 — 0.0085 + 0.71i: https://drive.google.com/file/d/0B4bl7YMqDnVicnNiU21GcW1CQm8/edit?usp=sharing
[20] Источник: http://habrahabr.ru/post/206516/
Нажмите здесь для печати.