МОДЕЛИРОВАНИЕ ФРАКТАЛОВ В СРЕДЕ MAXIMA

часть II

П.И. ТРОШИН

Казанский федеральный университет

Казань 2012 Оглавление

ВВЕДЕНИЕ3

1 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ5

2 ХАОТИЧЕСКАЯ ДИНАМИКА. ДЕТЕРМИНИРОВАННЫЙ ХАОС 17

3 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ 23

ПРИЛОЖЕНИЕ 38

РЕСУРСЫ ИНТЕРНЕТА 43

СПИСОК ЛИТЕРАТУРЫ 44

УКАЗАТЕЛЬ КОМАНД 47

2 ВВЕДЕНИЕ

Чем абстрактнее истина, которую ты хочешь преподать, тем сильнее ты должен обольстить ею ещё и чувства. Фридрих Ницше

Красоту в математике так же трудно формально определить, как и красоту в искусстве, но лю- ди, изучающие математику, обыч- но не имеют затруднений в её рас- познавании. Поль Дирак

Любая формула, включенная в кни- гу, уменьшает число её покупате- лей вдвое. Стивен Хокинг

астоящее пособие является продолжением части I, в которой изложены методы мо- Н делирования в системе компьютерной алгебры Maxima таких фрактальных объектов, как 퐿-системы, системы итерированных функций, множества Мандельброта и Жюлиа, аттракторы в проблеме Кэли, а также метод нахождения фрактальной размерности. Во II части пособия излагаются методы построения паутинных и бифуркационных диаграмм, а также диаграмм орбит, построение странных аттракторов, кривых и поверх- ностей фрактального броуновского движения. Содержание этой части сфокусировано на динамических аспектах фрактальной геометрии, или на фрактальных аспектах динами- ческих систем. В качестве среды моделирования выбрана система компьютерной алгебры Maxima— свободное программное обеспечение, зарекомендовавшее себя в течение длительного вре- мени (проект зародился в 1968 году и стал открытым с 1998 года). Преимуществами этой системы являются: бесплатная лицензия, кросс- платформенность (реализация в ОС Windows, Linux, Unix, Mac OS X, BSD), открытый код (что понижает количество встроенных ошибок), поддержка языка программирования

3 4

Lisp и др.. Maxima выполняет символьные и численные вычисления, строит различные графики, обладает широким набором дополнительных программных пакетов. Максима имеет несколько графических интерфейсов: XMaxima, wxMaxima и др., а также может работать в режиме командной строки, используя псевдографику. Предпо- лагается, что читатель знаком с основами языка Maxima. Ввиду сделанного выбора данное пособие может использоваться при изучения при- менения пакета Maxima в курсе высшей математики. Однако все изложенные алгоритмы читатель легко сможет адаптировать для других языков математических вычислений. Заметим, что хотя данное пособие посвящено построению фракталов, мы не будем да- вать строгое определение фрактальным множествам и фрактальной размерности, чтобы избежать однобокого или же, наоборот, слишком пространного и техничного определе- ния. Предполагается, что читатель знаком с широким значением понятия, которое мы будем просто называть «фрактал». Основное содержание пособия близко по изложению книге Р.М. Кроновера [1] и охва- тывает широко известные алгоритмы построения фрактальных множеств. Каждая гла- ва снабжена списком Задач. В Приложении даются сведения об использовании готовых специализированных пакетов для изучения фракталов и динамических систем. Первое множество, связанное с областью хаотической динамики, построим в Maxi- ma прямо на этой странице1:

load(dynamics)$ orbits(x^2+c,0,50,200,[c,-2,0.25],[style,dots],[nticks,1000]);

Это изображение, напоминающее заснеженные горные вершины, — бифуркационная диаграмма (или диаграмма орбит), представляющая собой иллюстрацию возникновения хаоса методом удвоения периода. С этим графиком связана знаменитая универсальная константа Фейгенбаума.

Рекомендуемая литература: официальная страница Maxima: [3e], установочный файл Maxima: [4e], руководства пользователя Maxima: [8e], [9e], [6e].

1Здесь и далее мы не будем ставить точки после формул кода в конце предложений, так как это несомненно вызовет ошибку при их компиляции. Глава 1 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

Земле мы, конечно, при- пишем вид куба: ведь из всех четырёх родов наибо- лее неподвижна и пригодна к образованию тел именно земля, а потому ей необхо- димо иметь самые устой- чивые основания. Платон Хаотизация поведения большого чис- ла нелинейных систем количественно описывается универсальными числами 훿 = 4, 6692016 ... и 훼 = 2, 502907875 ... Митчелл Фейгенбаум

этой главе мы изучаем качественное поведение некоторых дискретных динамиче- В ских систем, знакомясь с различными видами их представления: график орбиты, паутинная и бифуркационная диаграмма, — а также с такими понятиями как: периоди- ческие точки (и их характер), точки бифуркации, константа Фейгенбаума, унимодальные отображения и «переход к хаосу с помощью удвоения периода».

1.1 Паутинные диаграммы

Неподвижной точкой отображения (функции) называется точка , для 푓 : R → R 푥푓 ∈ R которой 푓(푥푓 ) = 푥푓 . Неподвижные точки отображений имеют большое значение в раз- личных областях математики. Например, известный метод Ньютона нахождения нулей функции опирается именно на теорию неподвижной точки. Орбитой точки 푥 ∈ R называется последовательность точек

푥, 푓(푥), 푓(푓(푥)), . . . , 푓 (푛)(푥),... (1.1)

5 6 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

Орбиту точки можно изобразить на графике как последовательность точек

(0, 푥0), (1, 푥1),..., (푛, 푥푛), где 푥푘+1 = 푓(푥푘). Последовательность {푥푘} можно задать так:

п р f(x):=3*x*(1-x)$ и м x[0]:0.5$ е р for i:0 thru 50 do x[i+1]:f(x[i])$ Отобразим данную последовательность на графике:

п р и orb:makelist([i,x[i]],i,0,50))$ м е plot2d([discrete,orb],[style,points])$ р

Комментарий. Последнюю строчку можно заменить на load(draw)$ draw2d(point_type=filled_circle,points(orb))$

Гораздо проще для аналогичного представления орбит использовать команду evolution1 пакета dynamics:

п р и load(dynamics)$ м е evolution(3*x*(1-x),0.5,50)$ р

2 Неподвижная точка 푥푓 называется притягивающей (аттрактором) , если существует (푛) её окрестность 푈(푥푓 ), для любой точки 푥 ∈ 푈(푥푓 ) которой lim 푓 (푥) = 푥푓 . Если функция 푛→∞ ′ 푓 дифференцируема, то в притягивающей неподвижной точке 푓(푥푓 ) = 푥푓 , |푓 (푥푓 )| < 1. Неподвижная точка называется отталкивающей (репеллером), если для любой точки ˇ (푛) 푥 ∈ 푈(푥푓 ) любой её проколотой окрестности 푓 (푥) ̸→ 푥푓 . Если функция 푓 дифференци- ′ руема, то в притягивающей неподвижной точке 푓(푥푓 ) = 푥푓 , |푓 (푥푓 )| > 1. В Maxima неподвижную точку отображения 푓(푥) на отрезке [푎, 푏] можно искать ко- мандой find_root(f(x)-x,a,b), в которой возможно указать точность вычисления: find_root(f(x)-x,a,b,abserr=0.0001,relerr=0.00001) Пакет newton1 позволяет находить неподвижные точки в окрестности данной точки

푥0 методом Ньютона с точностью eps (то есть 푓(푥) ≈ 푥 с погрешностью не больше eps): load (newton1)$ (f(x)-x,x,x_0,eps)

Сосчитаем модуль производной функции 푓(푥) для нахождения типа неподвижной точ- ки 푥푓 = 푎: at(abs(diff(f(x),x)),[x=a]) Комментарий.

1Подробнее об этой команде см. Приложение, с. 39. 2 Неподвижная точка — частный случай точки периода 푝 ∈ N, см. часть I, параграф 4.1. Моделирование фракталов в среде Maxima 7

diff(푓(x),x) — возвращает производную функции 푓 по переменной x; diff(푓(x),x,k) — возвращает производную k-го порядка функции 푓 по переменной x; at(푔(푥),[x=a]) — возвращает значение выражения 푔(푥) в точке x=a.

(푛) Неподвижные точки находятся методом итераций 푓 (푥0) → 푥푓 . Процесс сходимости (или же, наоборот, расходимости, а также более сложные типы поведения данной дина- мической системы3) удобно изображать графически с помощью «паутинных диаграмм». Паутинная диаграмма — это отображение в одной системе координат графика функции 푓(푥), диагонали 푦 = 푥 и пред- ставляющей итерационный процесс ломаной линии с верши- нами в точках

(푥0, 푥0), (푥0, 푥1), (푥1, 푥1), (푥1, 푥2),...,

푥푛 = 푓(푥푛−1), 푛 = 1, 2,...

Алгоритм 1.1: Построение паутинной диаграммы

Вход: 푓(푧);  функция, для которой ищется неподвижная точка [푎, 푏];  область определения функции 푓(푥) 푥0;  начальная точка для итераций из отрезка [푎, 푏] 푙푒푣푒푙;  количество итераций отображения 푓(푥) Выход: паутинная диаграмма: изображение ломаной итераций, графика функции и диа- гонали 푦 = 푥.

1: 푝푎푡ℎ = {푥0, 푥0};  инициализация массива точек-вершин ломаной 2: повторять 푙푒푣푒푙 раз 3: 푦0 = 푓(푥0); 4: 푝푎푡ℎ = 푝푎푡ℎ ∪ {{푥0, 푦0}, {푦0, 푦0}}; 5: 푥0 = 푦0; 6: отобразить ломаную с вершинами из массива 푝푎푡ℎ, график функции 푓(푥) и диагональ 푦 = 푥 в одной системе координат на интервале [푎, 푏].

Программируем на Maxima (листинг № 1.1): Построение паутинной диаграммы § ¤ 1 load(draw)$ § ¦ ¥ ¤ 2 [a,b]: [0,1]$ /* леваяи правая границы:a<=x<=b*/ 3 x0: 0.05$ /* начальная точка*/ 4 level: 10$ /* число итераций*/ 5 f(x):=4*x(1-x)$ /* исходная фунция*/ 6 7 path:[[x0,x0]]$ /* массив вершин ломаной*/

3 Т.е. процесс 푥푛 = 푓(푥푛−1), 푛 = 1, 2,..., где начальное приближение 푥0 играет роль управляющего параметра. 8 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

8 9 thru level do( /* построение ломаной path*/ 10 y0: f(x0), 11 path: append(path,[[x0,y0],[y0,y0]]), 12 x0: y0 13 )$ 14 draw2d( 15 color=black, 16 explicit(f(x),x,a,b), /* отображаем функциюf*/ 17 color="#23AB0F", 18 explicit(x,x,a,b), /* отображаем диагональy=x*/ 19 color=blue, 20 /* отображаем концевые точки ломаной окружностями:*/ 21 point_type=circle,point_size=1, points([path[1],last(path)]), 22 point_type=dot,points_joined=true,points(path), /* отображаем ломаную*/ 23 /* отображаем вектор направления итераций вдоль первого ребра ломаной*/ 24 head_length = 0.05, head_angle=13, vector(path[1],0.6*(path[2]-path[1])), 25 user_preamble="set size ratio -1" 26 )$

¦ Комментарий. ¥ Замечания об использованных командах: color=black — определение цвета для графики (например: blue, red, green, magenta, black, cyan). В пакете draw есть 83 именных цвета (см. в справке по Maxima), другие цвета можно определять в шестнадцатеричной системе счисления в фор- мате #푅푅퐺퐺퐵퐵: color="#23AB0F"; explicit(푓(푥),x,a,b) — график явно заданной функции 푓(푥), 푥 ∈ [a, b];

1.2 Бифуркационная диаграмма

В математике, особенно при изучении динамических систем, под понятием бифуркацион- ная диаграмма4 подразумевают изображение на рисунке смены возможных динамических режимов системы (равновесных состояний, неподвижных точек, периодических орбит и пр.) при изменении значения бифуркационного параметра. Рассмотрим динамическую систему с параметром 푐 ∈ 퐶:

푓 : 푈 × 퐶 → 푈, 푈, 퐶 ⊂ R, 푐

푥푛 = 푓(푥푛−1, 푐), 푛 = 1, 2, . . . , 푥0 ∈ 푈. (1.2) 푥푛−1 푥푛 = 푓(푥푛−1, 푐) 푥푛

Требуется изобразить зависимость наличия стабильных периодических точек отобра- жения 푓 от изменения параметра 푐. Будем отмечать по оси ординат параметр 푐, а по оси абсцисс — соответствующие этому значению параметра стабильные периодические точки.

4Иногда её называют диаграммой орбит. Моделирование фракталов в среде Maxima 9

Находить аналитически5 и исследовать на стабильность характер периодических то- чек достаточно трудоемко: нужно решать уравнения 푓 (푛)(푥, 푐) = 푥, 푛 = 0, 1,..., а затем исследовать ⃒ 푑 (푛) ⃒. ⃒ 푑푥 푓 (푥, 푐)⃒ Наиболее эффективным и простым способом построения такой диаграммы является следующий. Разбив область 푈 на сетку значе- ний, для каждого из них запустим итерационный процесс (1.2) (с произвольной, но не отталкивающей начальной точкой) и будем от- рисовывать 푁 точек орбиты, откинув первые 푠푘푖푝 значений6. При сравнительно большом 푠푘푖푝 наша орбита притянется к стабильной периодической орбите. Тогда на рисунке будет видно, группируют- ся ли точки в кластеры, соответствующие стабильным (притягива- ющим) периодическим точкам (маловероятно появление на графи- ке нестабильных периодических точек, почему?). Таким образом, вне хаотических областей параметра 푐 ветви бифуркационной диа- граммы состоят из притягивающих точек периода 푛 ( ): 푑 (2푛) . 푥 2 푛 ∈ N | 푑푥 푓 (푥, 푐)| < 1 Алгоритм 1.2: Построение бифуркационной диаграммы

Вход: 푓(푥, 푐);  итерируемая функция [푐1, 푐2];  область изменения параметра 푐 푝푟푒푐;  количество точек для деления отрезка [푐1, 푐2] 푁;  количество отображаемых точек при каждом 푐 푠푘푖푝;  количество пропущенных начальных точек при каждом 푐 푥0;  произвольная точка из области определения функции 푓(푥) Выход: изображение бифуркационной диаграммы. 1: 푝푎푡ℎ = ∅;  инициализация массива точек графика 2: 푐 = 푐1;  значение 푐 будет меняться от 푐1 до 푐2 3: повторять 푝푟푒푐 раз 4: 푐2−푐1 ; 푐 = 푐 + 푝푟푒푐 5: повторять 푠푘푖푝 раз 6: 푥0 = 푓(푥0, 푐); 7: повторять 푁 раз 8: 푥0 = 푓(푥0, 푐); 9: 푝푎푡ℎ = 푝푎푡ℎ ∪ {푥0, 푐} 10: отобразить точки из массива 푝푎푡ℎ на дисплее.

Программируем на Maxima (листинг № 1.2):

Построение бифуркационной диаграммы (для 푓(푥) = 푐푥(1 − 푥)) § ¤ 1 load(draw)$ § ¦ ¥ ¤ 2 [c1,c2]: [-2,-0.7]$ /* леваяи правая границы: c1<=c<=c2*/ 3 f(x):=c*x*(1-x)$ /* исходная фунция*/ 4

5 2 푛 Например, для отображения 푓(푥) = 4푥(1 − 푥) есть простая формула 푥푛 = sin (2 휋휃) ( 1 −1 √ )[2, с. 181]; а для отображения — формула 1 1 2푛 . 휃 = 휋 sin 푥0 푓(푥) = 2푥(1 − 푥) 푥푛 = 2 − 2 (1 − 2푥0) 6В известной книге [3] для создания иллюстраций используются значения 푠푘푖푝 = 5000 и 푁 = 120. 10 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

5 prec: 150$ /* число точек деленияс*/ 6 N:120$ /* число отображаемых точек при каждомс*/ 7 skip:30$ /* число пропущенных первых точек при каждомс*/ 8 9 x0: 0.4$ /* начальная точка*/ 10 path:[]$ /* массив точек графика*/ 11 c:c1$ 12 13 thru prec do( 14 c:c+(c2-c1)/prec, 15 thru skip do x0: f(x0), /* пропускаем первые skip точек*/ 16 thru N do( /* добавляемв массив последующиеN точек*/ 17 x0: f(x0), 18 path: endcons([x0,c],path) 19 ) 20 )$ 21 22 draw2d(point_type=dot,points(path),user_preamble="set size ratio -1")$

¦ Самым известным и первым примером динамической системы, обладающей загадоч- ¥ ной бифуркационной диаграммой7, является логистическое8 отображение

푓 : [0, 1] ∋ 푥 ↦→ 푐푥(1 − 푥) ∈ [0, 1], 푐 ∈ [0, 4]. (1.3)

Его часто приводят в пример того, как из очень простых нелинейных уравнений может возникать сложное, хаотическое поведение. Это отображение популяризовал биолог Ро- берт Мэй (1976), хотя впервые его аналог был рассмотрен Пьером Франсуа Ферхюльстом9

(1838). Динамическая модель 푥푛 = 푐푥푛−1(1 − 푥푛−1) описывает численность биологиче- ской популяции в дискретные моменты времени: 푥푛 ∈ [0, 1] представляет относительный размер популяции в год 푛, множитель 푐 — это скорость роста популяции (с учетом её репродукции и гибели в результате перенаселения и нехватки ресурсов).

1.3 Универсальность Фейгенбаума

Митчелл Фейгенбаум10 [8,9] описал механизм «получения хаоса с помощью удвоения периода» и заметил, что он возникает не только при итерациях логистического отобра- жения, но и для других двузначных отображений интервала в себя, таких как 푥2 + 푐, 푐 sin 휋푥, 푐푥2 sin 휋푥.

7Бифуркационная диаграмма для логистического отображения называется диаграммой Фейгенбаума. 8Его также называют логистической параболой, а также отображением Ферхюльста. П.Ф. Ферхюльст ввел название логистическая функция для решение уравнения 푓˙(푡) = 푐푓(푡)(1 − 푓(푡)). Иногда логистиче- ским отображением называют отображение 푓(푥) = 1 − 푐푥2, обладающее схожими свойствами. 9На самом деле, логистическое уравнение было рассмотрено Бенджамином Гомпертцем в 1825 году. 10Одновременно и независимо от него это наблюдение и его объяснение сделали П. Кулле и Ч. Трес- сер [4,5]. Одно из строгих обоснований такого поведения было получено с применением компьютерных вычислений О. Лэнфордом [6]. Обзор этой темы и доказательство универсальности см. также в статье М. Любича [7]. Моделирование фракталов в среде Maxima 11

Обозначим через 푐0, 푐1,... точки бифуркации на бифуркационной диаграмме, то есть 푛−1 точки 푐푛, в которых итерации 푓(푥, 푐) сменяют притягивающую орбиту периода 2 на притягивающую орбиту периода 2푛. М. Фейгенбаум заметил, что для вышеупомянутых отображений существует конечный 11 предел 푐∞, 푐푛 → 푐∞, иногда называемый точкой Фейгенбаума. При этом при 푐 → 푐∞ −0 происходит удвоение периода, а участок 푐 > 푐∞ называется областью хаоса. Он также заметил, что отношение длин последовательных интервалов между точками бифуркаций имеет «универсальный» предел12, называемый константой Фейгенбаума13:

푐 − 푐 훿 = lim 푛 푛−1 = 4, 66920160910299067185320382046620161725818557747 푛→∞ 푐푛+1 − 푐푛 576863274565134300413433021131473713868974402394801381716 ...

Этот предел характеризует скорость перехода динамической системы, испытывающей удвоение периода, к хаотическому поведению. Оказалось, что одинаковое поведение: области удвоения на диаграмме орбит, один и тот же предел 훿, «хаотическое» пове- дение — имеют многие унимодальные (одногорбые) отображе- ния интервала в себя, и константа 훿 помогает предсказывать наступление «хаоса». Известна связь константы Фейгенбаума и множества Мандельброта: диаметры больших окружностей

на вещественной оси равны периодам удвоения 푐푛 для отобра- жения 푓(푥, 푐) = 푐 − 푥2, и 훿 совпадает с пределом отношения этих убывающих диаметров. В настоящее время не известны необходимые и достаточ- ные критерии, позволяющие утверждать, что произвольное семейство отображений 푓(푥, 푐) обладает вышеупомянутыми свойствами. Однако частичные ответы, среди каких функций искать такие отображения, дают следующая теорема Давида Зингера и условия соответствующих теорем из [10,8]. Д. Зингер [11] впервые использовал производную Шварца для исследования динамики отображений отрезков и обратил внимание на важность условия отрицательного швар- циана 푓 ′′′(푥) 3 (︂푓 ′′(푥))︂2 푆푓(푥) ≡ − . 푓 ′(푥) 2 푓 ′(푥)

Сосчитаем его в Maxima: Sf(x):=block([u], at(diff(f(u),u,3)/diff(f(u),u)-1.5*(diff(f(u),u,3)/diff(f(u),u,2))^2, [u=x]) )$

11Cвой для каждого отображения 푓. 12Единый для многих таких отображений 푓. 13См. [10e], [11e]. Ср. со значением из книги [1, гл. 6, с. 162], точным лишь до порядка 10−4. 12 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

Комментарий.

block([푥1, . . . , 푥푛],푓1, . . . , 푓푘) — выполняет команды 푓1, . . . , 푓푘 и возвращает значение последнего выражения 푓푘, считая 푥1, . . . , 푥푛 локальными переменными. Заме- тим, что желательно вводить локальные переменные при определении функ- ций. Подумайте, почему?

Теорема 1.1 (Д. Зингер, см. [11], [2, Appendix D]). Пусть 푓 : [0, 1] → [0, 1], 푓 ∈ 퐶3, причём ∙ 푓(0) = 푓(1) = 0; ′ ∙ существует единственная критическая точка 푥0 ∈ [0, 1]: 푓 (푥0) = 0; ∙ 푆푓(푥) < 0 ∀푥 ∈ [0, 1]. Тогда в (0, 1) существует не более одной стабильной периодической орбиты для 푓. Если такая орбита существует, то ее точки — предельные для орбиты критической точки 푥0. Итак, динамические системы, обладающие описанными универсальными свойствами диаграмм удвоения периода, следует искать среди унимодальных (одногорбых) отобра- жений 푓(푥, 푐) (т.е. 푓 :[푎, 푏] ∋ 푥 ↦→ 푓(푥, 푐) ∈ [푎, 푏] — непрерывно, имеет единственный максимум в точке 푥0 ∈ (푎, 푏) и 푓(푎) = 푓(푏)). Кроме того, следует обратить внимание на отрицательность шварциана.

Каким образом можно вычислять точки бифуркации 푐푛? Аналитическое нахождение (푛) 푐푛 связано с вычислением критических точек отображений 푓 (푥, 푐), что в большинстве случаев практически невыполнимо. Экспериментально эти значения можно найти при построении бифуркационной диаграммы. Однако наша цель — подсчитать константу 훿, и это можно сделать без нахождения 푐푛. Рассмотрим прямой способ вычисления константы 훿 [1, гл. 6]. Нам понадобится следующая лемма.

Лемма 1.1. Пусть 푥0 = 푥0(푐) —единственная критическая точка отображения 푓(푥, 푐) и 푥 — сверхпритягивающая точка периода 푛. Тогда 푥 принадлежит орбите 푥0. В част- ности, 푥0 — тоже сверхпритягивающая точка периода 푛. Доказательство. Пусть 푥 — сверхпритягивающая точка периода 푛, тогда 푑 0 = 푓 (푛)(푥, 푐) = 푓 ′ (푓 (푛−1)(푥, 푐), 푐) · 푓 ′ (푓 (푛−2)(푥, 푐), 푐) · ... · 푓 ′ (푥, 푐), 푑푥 푥 푥 푥 откуда, ввиду единственности критической точки , определяемой условием ′ , 푥0 푓푥(푥0, 푐) = 0 (푘) получаем, что при некотором 푘 푓 (푥, 푐) = 푥0, откуда 푥 принадлежит орбите 푥0. Можно легко показать, что если одна точка орбиты периода 푛 является сверхпри- тягивающей, притягивающей или отталкивающей, то этим же свойством обладают

все точки орбиты, в частности, 푥0 — сверхпритягивающая точка периода 푛. Между каждой парой точек бифуркации и существует точка * , обладающая 푐푛 푐푛+1 푐푛 сверхпритягивающей орбитой14 периода 푛. Искать * проще, чем . Для этого надо 2 푐푛 푐푛 14Т.е. среди всех притягивающих точек при найдется значение * такое, что точка — 푥 푐 ∈ (푐푛, 푐푛+1) 푐푛 푥 сверхпритягивающая периода 푛 (в силу Леммы 1.1 при этом значении * можно положить ). Это 2 푐푛 푥 = 푥0 утверждение, как и формула (1.4), требуют доказательства. Моделирование фракталов в среде Maxima 13

решить систему уравнений:

{︂ ′ * — сверхпритягивающая точка отображения * 푓푥(푥0, 푐푛) = 0, (푥0 푓(푥, 푐푛)) (2푛) * — точка периода 푛 для отображения * 푓 (푥0, 푐푛) = 푥0 (푥0 2 푓(푥, 푐푛)). Можно доказать, что 푐* − 푐* 푛 푛−1 (1.4) 훿 = lim * * , 푛→∞ 푐푛+1 − 푐푛 что и является прямым способом нахождения 훿 (в отличии от способа ренормализации15). Алгоритм 1.3: Нахождение константы Фейгенбаума (в общих чертах)

Вход: 푓(푥, 푐);  функции с параметром 푐, для которых ищется константа Фейгенбаума ; количество точек * для подсчёта предела 푛  푐푖 훿 Выход: массив значений 푛 , . {훿푖}푖=1 훿 ≈ 훿푛 1: ; находим единственную критическую точку для : ′ 푥0  푓(푥) 푓푥(푥0, 푐) = 0 2: * * начальные приближения для вычислений {푐0, 푐1, 훿1} = {0, 1, 3.2};  3: для 푖 = 2, . . . , 푛 4: *; находим корень уравнения (2푖) . 푐푖  푐 푓 (푥0, 푐) = 푥0 Для этого можно воспользоваться методом Ньютона с начальным приближением 푐* −푐* 푖 푐 = 푐* + 푖−1 푖−2 . Поскольку у функции 푓 (2 ) имеется много плотно расположенных 푖−1 훿푖−1 нулей 푐, угадывание значения начального приближения с помощью приближённого зна- чения 훿 ≈ 훿푖−1 существенно влияет на точность вычислений * * 푐푖−1−푐푖−2 5: 훿푖 = * * ; 푐푖 −푐푖−1 В приведённом Алгоритме 1.3 особого внимания заслуживает строка 4. Для решения (2푖) уравнения 푓 (푥0, 푐) = 푥0 относительно переменной 푐 можно воспользоваться средствами Maxima16. Здесь сложность решения заключается в том, что степень17 уравнения экспо- 2 ненциально растет, например, при 푓(푥, 푐) = 푐 − 푥 и 푖 = 4 (푥0 = 0) получаем уравнение

푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−(푐−푐2)2)2)2)2)2)2)2)2)2)2)2)2)2)2 = 0. Чтобы взять ситуацию в свои руки, опишем, как можно эффективно реализовать метод Ньютона в данном случае. Введем две последовательности функций (или выраже- ний):

для 푘 ≥ 1 퐵푘(푐) = 푓(퐵푘−1(푐), 푐), 퐵0(푐) = 푥0; ′ 퐷푘(푐) = 퐵푘(푐)푐, 퐷0(푐) = 0. Тогда

(푘) 퐵푘(푐) = 푓 (푥0, 푐) и ′ ′ ′ 퐷푘(푐) = 퐵푘(푐)푐 = 푓푥(퐵푘−1(푐), 푐)퐷푘−1(푐) + 푓푐(퐵푘−1(푐), 푐). 15Этот способ прост, но не является эффективным, в виду экспоненциально растущего объёма вычис- лений. Более эффективный способ использует теорию ренормализации, см. [12, 13]. 16Напомним, в Maxima есть команды newton и find_root, см. с.6. 17В случае, если 푓 — полином. 14 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

Запишем метод Ньютона для нашего уравнения 퐵2푖 (푐) − 푥0 = 0:

퐵2푖 (˜푐푛−1) − 푥0 퐵2푖 (˜푐푛−1) − 푥0 퐵2푖 (˜푐푛−1) − 푥0 푐˜푛 =푐 ˜푛−1 − ′ =푐 ˜푛−1 − ′ =푐 ˜푛−1 − , (퐵2푖 (˜푐푛−1) − 푥0)푐 퐵2푖 푐(˜푐푛−1) 퐷2푖 (˜푐푛−1)

푐˜0 — начальное приближение корня, 푛 = 1, 2,... Таким образом, для вычисления корня * не нужно решать уравнение степени 푖, а до- 푐푖 2 статочно итеративно вычислять функции 퐵푘(푐) и 퐷푘(푐) и, затем, значения этих функций в точках 푐푛. Алгоритм 1.4: Нахождение константы Фейгенбаума (подробнее)

Вход: 푓(푥, 푐);  функции с параметром 푐, для которых ищется константа Фейгенбаума 휀;  точность промежуточных вычислений ; количество точек * для подсчёта предела 푛  푐푖 훿 Выход: массив значений 푛 , . {훿푖}푖=1 훿 ≈ 훿푛 1: ; находим единственную критическую точку для : ′ 푥0  푓(푥) 푓푥(푥0, 푐) = 0 2: * * начальные приближения для вычислений {푐0, 푐1, 훿1} = {0, 1, 3.2};  3: 퐵(푐) = 푓(푓(푥0))  퐵(푐) = 퐵2(푐) 4: ′ ′ ′ 퐷(푐) = 푓푥(푓(푥0), 푐)푓푐(푥0, 푐) + 푓푐(푓(푥0), 푐)  퐷(푐) = 퐷2(푐) 5: для 푖 = 2, . . . , 푛 푐* −푐* 6: 푐 = 푐* + 푖−1 푖−2 ;  начальное приближение для метода Ньютона 푖−1 훿푖−1 7: повторять 2푖−1 раз 8: ′ ′ ;. цикл вычисляет и по 퐷(푐) = 푓푥(퐵(푐), 푐)퐷(푐) + 푓푐(퐵(푐), 푐)  퐵2푖 (푐) 퐷2푖 (푐) предыдущим значениям и 퐵2푖−1 (푐) 퐷2푖−1 (푐) 9: 퐵(푐) = 푓(퐵(푐), 푐); 10: 퐶표푙푑 = 0; 11: повторять 12: ; в этом цикле ищем корень методом Ньютона 퐶표푙푑 = 퐶  퐵2푖 (퐶) = 푥0 퐵 (˜푐 )−푥 13: 퐵(퐶)−푥0 ;  итерации методом Ньютона: 2푖 푛−1 0 퐶 = 퐶 − 퐷(퐶) 푐˜푛 =푐 ˜푛−1 − 퐵 ′ (˜푐 ) 2푖 푐 푛−1 14: пока не |퐶−퐶표푙푑| 퐶 < 휀 15: * ; 푐푖 = 퐶 * * 푐푖−1−푐푖−2 16: 훿푖 = * * ; 푐푖 −푐푖−1

Программируем на Maxima (листинг № 1.3): Нахождение константы Фейгенбаума § ¤ 1 f(x):=c-x^2$ /* изучаемая функция*/ § ¦ ¥ ¤ 2 x0:0$ /* единственная критическая точка функцииf*/ 3 [c[0],c[1],d[1]]:[0,1,3.2]$ /* начальные приближенные значения*/ 4 5 B:f(f(x0))$ /* начальные значения дляBиD*/ 6 D:1-2*f(x0)$ 7 n:8$ /* количество точек для подсчета пределаd*/ 8 eps:10^-8$ /* точность промежуточных вычислений*/ Моделирование фракталов в среде Maxima 15

9 10 for i:2 thru n do 11 ( 12 C:c[i-1]+(c[i-1]-c[i-2])/d[i-1], /* начальное приближение для метода Ньютона*/ 13 thru 2^(i-1) do /* итерируемBиD*/ 14 ( 15 D:1-2*B*D, 16 B:f(B) 17 ), 18 C_old:0, 19 unless abs(C-C_old)/C

¦ Комментарий. ¥ Замечания об использованных командах: строчки 20–26 реализуют метод Ньютона для поиска корней уравнения B=x0, их можно заменить одной командой: c[i]:newton(B-x0,c,C,eps), убрав за ненадобностью строчку 17 (напомним, для этого надо подключить пакет load(newton1)). unless 푐표푛푑 do 푠푚푡ℎ — цикл: пока выполняется условие 푐표푛푑 выполнять действие 푠푚푡ℎ.

Задача Придумайте пример функции одновременно с притягивающей и отталкивающей 1.1 неподвижными точками.

Задача Пусть 푓(푥) = 푐푥(1−푥), 푥 ∈ [0, 1]. Изобразите 푓 (2)(푥) и найдите графически точки 1.2 периода 2 для функции 푓, а также её неподвижные точки. Являются они при- тягивающими или отталкивающими для 푓 (2)? Изобразите 푓 (4)(푥) и найдите графически точки периодов 1, 2, 4 для функции 푓. Заметьте, как нестабильные неподвижные точки порождают пары стабильных точек периода 2.

Задача Изобразить бифуркационную диаграмму возмущённой логистической функции 1.3 푓(푥) = 푐푥(1 − 푥)(1 + 푎 sin 푏푥), 푎 = −0.015, 푏 = 31.6 ([2, Appendix D]). Что проис- ходит с производной Шварца для данной функции?

Задача Изобразить бифуркационную диаграмму для функций 푥2 + 푐, 푐 sin 휋푥, 푐푥2 sin 휋푥 1.4 на соответствующих множествах. 16 НЕПОДВИЖНЫЕ ТОЧКИ, ОРБИТЫ, БИФУРКАЦИИ

Задача Придумать функцию (и построить её бифуркационную диаграмму), отличную 1.5 от рассмотренных выше, удовлетворяющую условиям теоремы Зингера.

Задача Модифицируйте Листинг 1.2 так, чтобы можно было отрисовывать бифуркаци- 1.6 онную диаграмму в произвольной области [푎, 푏] × [푐, 푑] ⊂ 푈 × 퐶 (чтобы рассмат- ривать части диаграммы при меньшем масштабе). Продемонстрируйте, что бифуркационная диаграмма обладает свойством самоподобия (например, для логистического отображения рас- смотрев область [0.53, 0.6] × [−1.86, −1.82]).

Задача Придумайте пример функции с двумя притягивающими неподвижными точка- 1.7 ми. Найдите точку 푥Γ, разделяющую области притяжения этих двух неподвиж- ных точек. Продемонстрируйте, как меняется поведение орбиты точек при малых отклонениях

от точки 푥Γ.

Задача Постройте модификацию бифуркационной диаграммы, рассмотренную Чипом 1.8 Россом (см. [2e],[14]).

Задача Озвучьте бифуркационную диаграмму и переход к хаосу: время композиции — 1.9 это параметр 푐, каждая стабильная периодическая точка при данном 푐 озвучи- вается своим музыкальным тоном. Таким образом зазвучит каждая ветвь диаграммы.

(푛) Задача Покажите, что если 푆푓(푥) < 0, то и 푆푓 (푥) < 0 при любом 푛 ∈ N. 1.10 2 (푛) Задача Пусть 푓푐(푥) = 푥 +푐. Постройте Q-кривые 푦(푐) = 푓 (0) при 푛 = 0, 1, 2, 3, 4, 5, 6, 7 1.11 на одном графике, 푐 ∈ [−2, 0]. Что напоминает получившийся рисунок, какой смысл имеют точки пересечения кривых (см. [2e],[14])?

Задача Изучите и напишите в Maxima алгоритм получения константы Фейгенбаума с 1.12 помощью метода ренормализации, описанного в [12, 13].

Задача Предложите алгоритм нахождения значений точек бифуркации 푐푛. 1.13 Задача Докажите утверждение, выделенное курсивом в Лемме 1.1. 1.14

Рекомендуемая литература: [1, гл. 6], [2, гл. 4, Appendix D], [15], [14], [12], [16], [17], [18], [13], [19]; [2e], [11e]. Глава 2 ХАОТИЧЕСКАЯ ДИНАМИКА. ДЕТЕРМИНИРОВАННЫЙ ХАОС

Математика может открыть опре- делённую последовательность даже в хаосе. Гертруда Стайн

Предсказывать довольно сложно, особенно будущее. Нильс Бор

ростейшая дискретная динамическая система — это множество с действующей на П нём трансформацией: 푓 : 푋 → 푋. Под действием этой трансформации каждая точка множества образует свою орбиту — последовательность точек

푥, 푓(푥), 푓 2(푥) ≡ 푓(푓(푥)), . . . , 푓 (푛)(푥) ≡ 푓(푓 . . . (푓(푥)) ...),... ⏟ 푛 раз⏞

Для выделенной начальной точки 푥0 ∈ 푋 этот процесс можно записать как последова- тельность

푥0, 푥1 = 푓(푥0), 푥2 = 푓(푥1), . . . , 푥푛 = 푓(푥푛−1),... Определённая таким образом динамическая система является детерминированной: зная начальную точку, мы всегда можем определить её следующее положение, приме- нив в к ней трансформацию 푓. Задачей теории динамических систем является описание характера эволюции систе- мы во времени: изучение предельных траекторий, их устойчивости, а также типичности самой системы. Динамические системы описывают многих естественные процессы: от численности по- пуляций до процесса представления вещественного числа в двоичной системе счисления.

17 18 ХАОТИЧЕСКАЯ ДИНАМИКА. ДЕТЕРМИНИРОВАННЫЙ ХАОС

2.1 Детерминированный хаос. Теорема Такенса

2.1.1 Детерминированная хаотичность Многие детерминистические динамические системы обнаруживают кажущееся хаотиче- ское поведение. Обратно, по такому хаотическому поведению системы можно предполо- жить, что оно на самом деле не случайно, а задается вполне определённым механизмом. Классическим примером здесь является логистическая парабола — отображение 푓 : [0, 1] → [0, 1]: 푓(푥) = 훼푥(1 − 푥), 훼 ∈ [2, 4].

1 Рассмотрим вполне детерминированную последовательность значений 푥푛 = 푓(푥푛−1), 2 пусть 푥0 = 0.892, 훼 = 3.95. Отобразим эти точки : п р и load(dynamics)$ м е evolution(3.95*x*(1-x),0.892,31,[style,linespoints])$ р

Найдем среднее m и дисперсию s данного набора значений {푥푘 = 푓(푥푘−1)} и сгенери- руем случайную последовательность randomseq с нормальным распределением 푁(m, s): f(x):=3*x*(1-x)$ п р x[0]:0.5$ и м for i:0 thru 31 do x[i+1]:f(x[i])$ е р [m,s]:[mean(listarray(x)),var(listarray(x))]$ randomseq:random_normal(m,s,32)$

Комментарий. listarray(x) — в данном случае возвращает списком элементы недекларированно- го массива {x[0],. . . ,x[n]} (а попросту, набора не связанных друг с другом перемен- ных); mean(x) — среднее выборки, представленной списком x; var(x) — дисперсия выборки, представленной списком x; random_normal(m,s) — псевдослучайная величина, распределенная нормально со средним m и дисперсией s;

1Пример взят из книги [20, с. 121]. 2Воспользуемся уже обсуждавшейся командой evolution, с параметрами графики [style,linespoints] (соединять «жирные» точки ломаной), подробнее см. с. 39. Моделирование фракталов в среде Maxima 19

random_normal(m,s,n) — псевдослучайный набор из n чисел, распределённых нор- мально со средним m и дисперсией s

Возьмём для определённости следующий массив данных и отобразим его: randomseq:[0.860,0.826,0.413,0.919,0.792,0.599,0.499,0.423,0.518,0.875,0.265, п р и 0.786,0.626,0.537,0.226,0.581,0.870,0.802,0.833,0.769,0.584,0.845,0.785, м е 0.697,0.979,1.093,0.871,0.713,0.669,0.734,0.815,0.656]$ р plot2d([discrete,randomseq])$

Можете ли вы отличить, какой из графиков выше порожден случайным процессом, а какой — детерминированным?

2.1.2 Существенная зависимость от начальных условий Проиллюстрируем ещё одно характерное для данного случая свойство, называемое су- щественной зависимостью от начальных условий. Изобразим на одном графике две

траектории для логистического отображения: при 푥0 = 0.892 и 푥0 = 0.89201 (훼 = 3.95 в обоих случаях). load(draw)$ f(x):=3.95*x*(1-x)$ x[0]:0.892$ п р и orb:append([[0,x[0]]],makelist([i+1,x[i+1]:f(x[i])],i,0,31))$ м е x[0]:0.89201$ р orb2:append([[0,x[0]]],makelist([i+1,x[i+1]:f(x[i])],i,0,31))$ draw2d(point_type=circle,points_joined=true, points(orb),color=red,points(orb2))$

Комментарий. Здесь для удобства мы воспользовались командой draw2d из пакета draw, описанной

в первой части пособия. Кроме того, здесь создание последовательностей {푥푖} и 표푟푏 = {푖, 푥푖} происходит в одной строчке.

Легко заметить, что небольшое возмущение начального значения влечёт существенное изменение траектории. 20 ХАОТИЧЕСКАЯ ДИНАМИКА. ДЕТЕРМИНИРОВАННЫЙ ХАОС

2.1.3 Бифуркации, катастрофы в качественном поведении

На примере нашего логистического отображения покажем ещё одно интересное свойство — качественное изменение поведения системы при небольших изменениях управляюще- го параметра. Если рассматривать 훼 как параметр системы (аналогично параметру 푐 в предыдущей главе), то можно заметить, например, что в окрестности точки 훼 = 3.5 си- стемы 푓(푥, 훼) имеют предельный цикл периода 4, в то время как в окрестности 훼 = 3.7 обнаруживается хаотическое поведение.

Изобразим это на двух графиках: пусть 푥0 = 0.892 в обоих случаях.

п load(dynamics)$ р и evolution(3.5*x*(1-x),0.892,100)$ м е ...... р evolution(3.8*x*(1-x),0.892,100)$

2.1.4 Теорема Такенса о вложении

Одним из способов проверки, является ли данный набор данных не случайным, а порож- денным некоторой неизвестной зависимостью, например так:

푥푛 = 퐹 (푥푛−1, 푥푛−2, . . . , 푥푛−푘), где 푘 «не очень большое»,

— является теорема Такенса о вложении.

Вложим одномерную последовательность {푥1, . . . , 푥푛,...} в плоскость в виде последо- вательности:

{(푥1, 푥2), (푥2, 푥3),..., (푥푛−1, 푥푛), (푥푛, 푥푛+1),...}. Моделирование фракталов в среде Maxima 21

2.2 Фрактальные аттракторы динамических систем

2.2.1 Аттрактор Лоренца ⎧ ⎨ 푥˙ = 휎(푦 − 푥), 푦˙ = 푥(푟 − 푧) − 푦, ⎩ 푧˙ = 푥푦 − 푏푧. load(dynamics)$ [sigma,r,b]:[10,28,8/3]$ eq:[sigma*(y-x),x*(r-z)-y,x*y-b*z]$ init:[1.0,0,0]$ t_range:[t,0,50,0.01]$ sol:rk(eq,[x,y,z],init,t_range)$

п len:length(sol)$ р и t:makelist(sol[k][1],k,1,len)$ м е р x:makelist(sol[k][2],k,1,len)$ y:makelist(sol[k][3],k,1,len)$ z:makelist(sol[k][4],k,1,len)$ plot2d([discrete,t,x])$ ...... load(draw)$ draw3d(point_size=0.2,points_joined=true, point_type=filled_circle,points(x,y,z))$

Отметим, что области графика 푥(푡), лежащие выше оси 푥 = 0, соответствуют виткам в правой части «крыла бабочки» аттрактора Лоренца, а нижележащие области — вит- кам в левой её части. Обдумайте связь между поведением 푥(푡) и движением точки по аттрактору в фазовом пространстве. Очевидно, такую же связь можно усмотреть, если построить графики 푦(푡) и 푧(푡). Одно из свойств аттрактора Лоренца как странного аттрактора: он является аттрак- тором, то есть, к нему «притягиваются» другие траектории в фазовом пространстве. Все

траектории отличаются начальными значениями 푟0 = {푥(0), 푦(0), 푧(0)} = {푥0, 푦0, 푧0} за- дачи Коши. 22 ХАОТИЧЕСКАЯ ДИНАМИКА. ДЕТЕРМИНИРОВАННЫЙ ХАОС

Другим свойством является существенная зависимость от начальных условий. Выбе- рем одну из координат в фазовом пространстве: пусть это будет 푥. Изобразим два решения 푥(푡) задачи Коши: при 푟0 = {1, 0, 0} и 푟0 = {1.001, 0, 0} на одном рисунке.

При близких начальных условиях различия в траекториях проявляются экспоненци- ально быстро, поведение систем разительно отличается: там где синий график выше оси 푥 = 0, а красный — ниже, — точки фазового пространства находятся в разных «крыльях бабочки», а значит, например, движение цилиндров в эксперименте Лоренца происходит в противоположных направлениях, и его трудно предсказать при неточности в начальном значении.

2.2.2 Аттрактор Энона

Задача Покажите, что при различных начальных значениях траектории притягиваются 2.1 к аттрактору Лоренца, как это изображено на с. 21.

Задача Покажите, что для аттрактора Лоренца при близких начальных значениях тра- 2.2 ектории быстро разбегаются, как это изображено на с. 22 и показано на с. 19 для логистического отображения. Для этого достаточно показать быстрое расхождение одной

из компонент 푥(푡), 푦(푡) или 푧(푡) при малом отличии в 푟0.

Задача Постройте графики 푦(푡) и 푧(푡) для аттрактора Лоренца, как это сделано для гра- 2.3 фика 푥(푡) на странице с. 21. Пронаблюдайте связь между поведением графиков и характером движения точки в фазовом пространстве относительно аттрактора.

Задача Придумайте, как можно показать, что аттрактор Лоренца локально устроен как 2.4 произведение канторова множества на интервал, то есть его сечение Пуанкаре (например, плоскостью 푧 = 0) — канторово множество.

Задача Исследуйте аттрактор Рёсслера по аналогии с задачами 2.1–2.4. 2.5

Рекомендуемая литература: [20] Глава 3 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

Gin a body meet a body Flyin’ through the air. Gin a body hit a body, Will it fly? And where? Ilka impact has its measure, Ne’er a ane hæ I, Yet a’ the lads they measure me, Or, at leaś, they try. Gin a body meet a body Altogether free, How they travel afterwards We do not always see. Ilka problem has its method By analytics high; For me, I ken na ane o’ them, But what the waur am I? Джеймс Клерк Максвелл (подражая Роберту Бёрнсу)

роуновское движение представляет собой пример естественного фрактала с фрак- Б тальной размерностью 푑 = 1.5 (Мандельброт и Ван Несс, 1968). Впервые его наблю- дал шотландский ботаник Роберт Броун1 в 1827 году: он заметил непрерывное беспо- рядочное движение взвешенных в жидкости маленьких частиц (пыльцы), но ошибочно приписал причину движения самим частицам ([22]). Только в 1905 году Альберт Эйн- штейн2 и вслед за ним в 1906 году Мариан Смолуховский объяснили это движение хао- тическими соударениями с молекулами окружающей среды ([21]). В 1908–1913 годах Жан Батист Перрен поставил ряд опытов ([23]), подтвердивших выводы Эйнштейна и Смолу- ховского. И, наконец, в 1923 год Норберт Винер построил первую математическую модель броуновского движения ([24, 25]). Альтернативные подходы были предложены Андреем Николаевичем Колмогоровым в 1933 году и Полем Леви в 1948 году ([26], [27], все три подхода см. в [28]).

1Это традиционный вариант русского написания фамилии Brown, хотя правильнее переводить Браун, как это сделано в [21]. 2Правильнее Айнштайн, но традиция — сильная штука!

23 24 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

В этой главе мы построим кривые классического броуновского движения, а также кривые и поверхности фрактального броуновского движения (рассмотренные Б. Ман- дельбротом и В. Нессом [29]), пригодные для моделирования рельефа поверхности и дру- гих естественных процессов.

3.0.3 Классическое броуновское движение

Рассмотрим случайный процесс (случайную величину) 푋(푡), заданную на отрезке [0, 푇 ].

Определение 3.1. Случайный процесс 푋(푡) называется одномерным броуновским дви- жением (или винеровским процессом) на интервале [0, 푇 ], если он обладает следующими свойствами3: ∙ 푋(0) = 0 почти наверное и 푋(푡) — почти наверное непрерывная функция на [0, 푇 ]; ∙ 푋(푡) — процесс с независимыми приращениями4; ∙ 푋(푡) — процесс с приращениями, распределёнными нормально5.

Отметим следующие свойства броуновского движения: ∙ 푋(푡) почти наверное нигде не дифференцируем (см. [29]); ∙ 푋(푡) — марковский процесс (не обладает памятью), т.е. если известна величина 푋(푡), то при 푡1 < 푡 < 푡2 величины 푋(푡1) и 푋(푡2) независимы; ∙ Фрактальная размерность графика 푋(푡) равна 1.5; ∙ Приращение 푋(푡) обладает свойством статистического самоподобия6: для любого 푟 > 0 1 푋(푡 + △푡) √ (푋(푡 + 푟△푡) − 푋(푡)). , 푟 ∙ Стационарность приращений: дисперсия приращения зависит только от разности моментов времени: 2 퐷(푋(푡2) − 푋(푡1)) = 휎 |푡2 − 푡1|. (3.1) ∙ Математическое ожидание приращения равно √︀ √︀ 퐸(|푋(푡2) − 푋(푡1)|) = 2/휋휎 |푡2 − 푡1|.

Для моделирования броуновского движения можно воспользоваться разными алго- ритмами. Мы рассмотрим три из них. Например, проще всего реализовать дискретную реализацию броуновского движения,

рассмотрев последовательность 푥0 = 0, 푥푛+1 = 푥푛 + 푔푛, где 푔푛 — случайная величина, имеющая нормальное распределение (например, 푁(0, 1)).

3Определённый таким образом процесс является нормальным, или гауссовским, а также марковским. 4 При любых фиксированных 푡1 < . . . < 푡푁 случайные величины △1 = 푋(푡2) − 푋(푡1),..., △푁−1 = 푋(푡푁 ) − 푋(푡푁−1) являются независимыми. 5 2 Случайная величина △푋 = 푋(푡1)−푋(푡2) имеет нормальное распределение с параметрами 푁(0, 휎 (푡2− 2 푡1)) для любых 푡2 > 푡1, а величина 휎 — постоянная для данного процесса. 6 Здесь символ , означает одинаковое распределение двух случайных величин. Моделирование фракталов в среде Maxima 25

load(distrib)$ п р N:1000$ и м X[0]:0$ е р for i:1 thru N do X[i]:X[i-1]+random_normal(0,1)$ plot2d([discrete,makelist(i,i,0,N),listarray(X)])$

3.0.4 Алгоритм срединных смещений Метод случайного срединного смещения основан на работах Н. Винера ([24, 25]), он бо- лее сложен, чем метод из предыдущего параграфа, однако используется для конструк- тивного доказательства существования броуновского движения, а также для построения фрактальной интерполяции (когда необходимо, чтобы кривая проходила через заданные точки интерполяции). Метод также может быть обобщен на случай 푛-мерных броунов- ских движений. Алгоритм случайного срединного смещения вычисляет значения 푋(푡) в диадических рациональных точках вида 푘 . Последовательно вычисляются значения в середине 2푛 ∈ [0, 1] отрезка , затем в серединах отрезков 1 и 1 и т. д.. На каждом шаге итерации [0, 1] [0, 2 ] [ 2 , 1] должен выполняться закон дисперсии для приращений (3.1) в вычисленных точках. Пара- метр 휎 определяет масштаб по вертикальной оси, не влияя на фрактальную размерность графика. Алгоритм 3.1: Броуновское движение методом срединного смещения (1)

Вход: 푁;  число шагов алгоритма, при этом всего 2푁 + 1 точек интерполяции 휎;  параметр вертикального масштаба, коэффициент дисперсии Выход: массив значений 푘 2푁 .  реализация броуновского движения на {푋( 2푁 )}푘=0 푋(푡) дискретном множестве точек вида 푘 , 푁 푡푘 = 2푁 푘 = 0, 2 1: 푋(0) = 0; 2: 푋(1) = 휎푔  푔 — случайная величина, распределенная нормально с параметрами 푁(0, 1) 3: Шаг 1: (︀ 1 )︀ 1 1 ; 푋 2 = 2 (푋(0) + 푋(1)) + 2 휎푔 4: Шаг 2: (︀ 1 )︀ 1 (︀ (︀ 1 )︀)︀ 1 ; 푋 4 = 2 푋(0) + 푋 2 + 23/2 휎푔 (︀ 3 )︀ 1 (︀ (︀ 1 )︀ )︀ 1 ; 푋 = 푋 + 푋(1) + 3/2 휎푔 . 4 2 2 2 . 5: Шаг N: (︀ 1 )︀ 1 (︀ (︀ 1 )︀)︀ 1 ; 푋 푁 = 푋(0) + 푋 푁−1 + (푁+1)/2 휎푔 . 2 2 2 2 . (︁ 푁 )︁ (︁ (︁ 푁−1 )︁ )︁ 2 −1 1 2 −1 1 ; 푋 2푁 = 2 푋 2푁−1 + 푋(1) + 2(푁+1)/2 휎푔

Заметим, что точки 푘 можно последовательно занумеровать номерами . При 푡푘 = 2푁 푘 этом если точка имеет вид 푎 , то её номер 푁−푏. Укажем алгоритм, в котором точки 2푏 푘 = 푎2 푡푘 пронумерованы эффективно. 26 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

Алгоритм 3.2: Броуновское движение методом срединного смещения (2)

Вход: 푁;  число шагов алгоритма, при этом всего 2푁 + 1 точек интерполяции 휎;  параметр вертикального масштаба, коэффициент дисперсии Выход: массив значений 2푁 . реализация броуновского движения на {푋(푘)}푘=0  푋(푡) дискретном множестве точек вида 푘 , 푁 푡푘 = 2푁 푘 = 0, 2 1: 푋(0) = 0; 2: 푋(1) = 휎푔  푔 — случайная величина, распределенная нормально с параметрами 푁(0, 1) 3: для 푗 = 1, . . . , 푁 4: для 푖 = 1,..., 2푁−1 5: (︀ 푁−푗)︀ (︀ 푁−푗+1)︀ (︀ 푁−푗+1)︀ 1 ;  это 푋 (2푖 − 1)2 = 푋 (푖 − 1)2 + 푋 푖2 + 2(푗+1)/2 휎푔 соответствует формуле 푋 (︀ 2푖−1 )︀ = 푋 (︀ 푖−1 )︀ + 푋 (︀ 푖 )︀ + 1 휎푔 2푗 2푗−1 2푗−1 2(푗+1)/2

Программируем на Maxima (листинг № 3.1): Броуновское движение методом срединного смещения § ¤ 1 load(distrib)$ § ¦ ¥ ¤ 2 N:10$ 3 s:2$ 4 [X[0],X[2^N]]:[0,s*random_normal(0,1)]$ 5 6 for j:1 thru N do 7 for i:1 thru 2^(j-1) do 8 X[(2*i-1)*2^(N-j)]:float((X[(i-1)*2^(N-j+1)]+X[i*2^(N-j+1)])/2+ 9 s*random_normal(0,1)/2^((j+1)/2))$ 10 11 plot2d([discrete,makelist(k/2^N,k,0,2^N),listarray(X)]);

¦ Комментарий. ¥ В строчке 8 используется команда float, чтобы хранить в памяти результат, а не последовательность действий (подумайте над этим).

3.0.5 Фрактальное броуновское движение Фрактальное броуновское движение (ФБД) уже не является марковским процессом, а обладает некоторой «памятью» (Б. Мандельброт и В. Несс, [29]). Кроме того, вводя па- раметр 0 < 퐻 < 1 можно получить одномерное ФБД размерности 푑 = 2 − 퐻 и двумерное ФБД размерности 푑 = 3−퐻. Заметим, что классическое броуновское движение получает- ся как частный случай при 퐻 = 0.5. Для аппроксимации ФБД нет простого метода, вроде суммирования нормальных случайных величин, как в случае классического броуновско- го движения. Для аппроксимации ФБД наиболее удобно использовать преобразования Фурье. Рассмотрим случайный процесс (случайную величину) 푋(푡), заданную на отрезке [0, 푇 ]. Моделирование фракталов в среде Maxima 27

Определение 3.2. Случайный процесс 푋(푡) называется одномерным7 фрактальным броуновским движением на интервале [0, 푇 ], если он обладает следующими свойства- ми8: ∙ 푋(0) = 0 почти наверное и 푋(푡) — почти наверное непрерывная функция на [0, 푇 ]; ∙ 푋(푡) — процесс с приращениями, распределенными нормально9. Отметим следующие свойства фрактального броуновского движения: ∙ 푋(푡) почти наверное нигде не дифференцируем (см. [29]); ∙ Фрактальная размерность графика 푋(푡) равна 2 − 퐻; ∙ Процесс 푥(푡) не обладает свойством независимости приращений; ∙ Приращение 푋(푡) обладает свойством статистического самоподобия10: для любого 푟 > 0 1 푋(푡 + △푡) (푋(푡 + 푟△푡) − 푋(푡)). , 푟퐻 ∙ Стационарность приращений: дисперсия приращения зависит только от разности моментов времени: 2 2퐻 퐷(푋(푡2) − 푋(푡1)) = 휎 |푡2 − 푡1| . (3.2) ∙ Математическое ожидание приращения равно

√︀ 퐻 퐸(|푋(푡2) − 푋(푡1)|) = 2/휋휎|푡2 − 푡1| .

3.0.6 Метод Фурье-фильтрации для построения ФБД Метод Фурье-фильтрации для аппроксимации ФБД заключается в следующем. Нам по- надобится

Теорема 3.1 ([1]). Если 푋(푡) — ФБД с параметром 퐻, то его спектральная плотность 1 푆(푓) . ∝ 푓 2퐻+1 Идея метода состоит в следующем. Строится преобразование Фурье для искомого ФБД в частотной области, задавая случайные фазы и подбирая амплитуды, удовлетво- ряющие свойству из Теоремы 3.1. Затем получаем ФБД во временной области с помощью обратного преобразования Фурье. Будем моделировать дискретный аналог ФБД, то есть наша цель — получить величи- ны 푁−1, аппроксимирующие ФБД в точках . Воспользуемся формулой дискретного {푋푛}푛=0 푛 преобразования Фурье 푁−1 ˆ ∑︁ −2휋푘푛/푁 푋푛 = 푋푘푒 푘=0 7Не путайте с фрактальной размерностью его графика! 8Определённый таким образом процесс является нормальным, или гауссовским, но не марковским. 9 2 Случайная величина △푋 = 푋(푡1)−푋(푡2) имеет нормальное распределение с параметрами 푁(0, 휎 (푡2− 2퐻 2 푡1) ) для любых 푡2 > 푡1, а величины 휎 и 퐻 — постоянные для данного процесса. 10 Здесь символ , означает одинаковое распределение двух случайных величин. 28 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

и обратного дискретного преобразования Фурье

푁−1 ∑︁ ˆ 2휋푘푛/푁 푋푛 = 푋푘푒 . 푘=0

Далее будем рассматривать только чётные значения 푁, а для применения метода быстрого дискретного преобразования Фурье нужно, чтобы 푁 = 2푀 , 푀 ∈ N. Метод быст- рого дискретного преобразования Фурье реализован во многих системах компьютерной алгебры, в том числе и в Maxima. Он позволяет сократить вычисления в 2푁 раз. log2 푁 Для того, чтобы получающиеся величины 푋푛 были вещественными, мы наложим усло- вие сопряжённой симметрии:

ˆ ˆ ˆ ˆ (3.3) 푋0, 푋푁/2 ∈ R, 푋푛 = 푋푁−푛, 푛 = 1, . . . , 푁/2 − 1.

Фильтрация относится к той части моделирования, когда мы заставляем коэффици- енты преобразования Фурье удовлетворять степенному закону из Теоремы 3.1:

1 |푋ˆ |2 , 푛 = 1, . . . , 푁/2. 푛 ∝ 푛2퐻+1 Для этого мы возьмём 푔푒2휋푖푢 푋ˆ = , 푛 푛퐻+0.5 где 푔 — независимые значения нормально распределённой случайной величины с пара- метрами 푁(0, 1), а 푢 — независимые значения равномерно распределённой на отрезке [0, 1] случайной величины. Оставшиеся коэффициенты вычислим из соотношений (3.3). Для вычисления искомой аппроксимации ФБД 푁−1 применим обратное дискрет- {푋푛}푛=0 ное преобразование Фурье к набору ˆ 푁−1. {푋푛}푛=0 Алгоритм 3.3: Кривая ФБД методом Фурье-фильтрации

Вход: 퐻 ∈ (0, 1);  параметр ФБД, размерность графика равна 푑 = 2 − 퐻 푁 = 2푀 , 푀 ∈ N;  параметр, определяющий количество точек дискретизации ФБД Выход: массив значений 푁−1. дискретная аппроксимация ФБД в {푋푛}푛=0  последовательные моменты времени 푛 ˆ 1: 푋0 = 푔; 2: для 푗 = 1, . . . , 푁/2 − 1 3: ˆ 푔푒2휋푖푢 ; 푋푗 = 푗퐻+0.5 4: ˆ 푔 cos(2휋푖푢) ;  Здесь — вещественная часть комплексной экспоненты 푋푁/2 = (푁/2)퐻+0.5 cos 푒 5: для 푗 = 푁/2 + 1, . . . , 푁 − 1 ˆ ˆ 6: 푋푗 = 푋푁−푗; 7: 푋 = ОДПФ(푋ˆ).  Вектор 푋 = {푋0, . . . , 푋푁−1} получается обратным дискретным преобразованием Фурье из вектора 푋^ = {푋^0,..., 푋^푁−1}. Моделирование фракталов в среде Maxima 29

Программируем на Maxima (листинг № 3.2): Кривая ФБД методом Фурье-фильтрации § ¤ 1 load(distrib)$ § ¦ ¥ ¤ 2 load(fft)$ 3 N:2^4$ 4 H:1$ 5 6 X[0]:random_normal(0,1)$ 7 for j:1 thru N/2-1 do X[j]:random_normal(0,1)* 8 exp(2*%*%i*random_continuous_uniform(0,1))/j^(H+0.5)$ 9 X[N/2]:random_normal(0,1)*cos(2*%pi*random_continuous_uniform(0,1))/(N/2)^(H+0.5)$ 10 for j:N/2+1 thru N-1 do X[j]:conjugate(X[N-j])$ 11 12 Y:inverse_fft(rectform(ev(listarray(X),numer)))$ 13 14 plot2d([discrete,makelist(i,i,0,N-1),realpart(Y)])$

¦ Комментарий. ¥ fft — пакет для работы с быстрым дискретным преобразованием Фурье. Для приме- нения команд этого пакета длина вектора-аргумента должна быть степенью 2. Вектор- аргумент может быть комплекснозначным, но все числа должны быть записаны в ал- гебраической форме. fft(x) — возвращает массив (или список), являющийся быстрым дискретным пре- образованием Фурье от массива (или списка) x; inverse_fft(x) — возвращает массив (или список), являющийся быстрым обрат- ным дискретным преобразованием Фурье от массива (или списка) x. random_continuous_uniform(a,b) — псевдослучайная величина, распределенная равномерно на отрезке [a, b], команда пакета distrib; conjugate(x) — возвращает комплексно-сопряжённое к комплексному числу x; Зачем нужны команды rectform и ev? rectform(x) — приводит комплексное число x к алгебраической форме 푎 + 푖푏; без приведения числа к алгебраической форме нельзя пользоваться командой fft; ev(x,numer) — в данном случае вычисляет значение x с флагом numer (численно). Рассмотрим пример, чтобы понять, зачем нам нужны команды rectform и ev: fpprintprec:14$ a:-0.1234*%e^(0.1234*%e*i*%pi); п р и float(a); м е ev(a,numer); р rectform(a); rectform(ev(a,numer));

fpprintprec:x — константа, ограничивающая количество выводимых на экран зна- ков в десятичном представлении всех чисел в программе; она не изменяет сами числа и не влияет на выполнение программы. Зачем использована команда realpart, ведь теоретически должны получаться ве- щественные значения при соблюдении условия сопряжённой симметрии (3.3)? При под- 30 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

счёте обратного преобразования Фурье с конечной точностью заданных значений по- лучаются погрешности, в данном случае порядка 10−16푖.

Для построения аппроксимации двумерного фрактального броуновского движения ме- тодом Фурье-фильтрации используются те же идеи, что и в одномерном случае11. Вместо ˆ ˆ 푋푛 используются 푋푘,푗, 푘, 푗 = 0, 푁 − 1, условие Теоремы 3.1 примет вид ([30]):

1 |푋ˆ |2 , 푛, 푘 = 1, . . . , 푁/2, 푘,푗 ∝ (푘2 + 푗2)퐻+1

мы возьмем12 푔푒2휋푖푢 푋ˆ = , 푛, 푘 = 1, . . . , 푁/2. 푘,푗 (푘2 + 푗2)퐻/2+0.5

Запишем обратное дискретное преобразование Фурье: для 푚, 푛 = 0, 푁 − 1

푁−1 푁−1 푁−1 푁−1 ∑︁ ∑︁ ˆ −2휋푖 푘푛+푗푚 ˆ ∑︁ ˆ −2휋푖 푘푛 ∑︁ ˆ −2휋푖 푗푚 푋푚,푛 = 푋푘,푗푒 푁 = 푋0,0 + 푋푘,0푒 푁 + 푋0,푗푒 푁 + 푘=0 푗=0 푘=1 푗=1 푁/2 푁/2 푁−1 푁−1 푁/2 푁−1 푁−1 푁/2 ∑︁ ∑︁ ˆ −2휋푖 푘푛+푗푚 ∑︁ ∑︁ (︀ )︀ ∑︁ ∑︁ (︀ )︀ ∑︁ ∑︁ (︀ )︀ + 푋푘,푗푒 푁 + ... + ... + ... . (3.4) 푘=1 푗=1 푁 푁 푘=1 푁 푁 푗=1 푘= 2 +1 푗= 2 +1 푗= 2 +1 푘= 2 +1

Из формулы (3.4) следует, что для вещественности всех величин 푋푚,푛 достаточно выполнения следующих условий сопряжённой симметрии:

ˆ ˆ ˆ (3.5) 푋푁−푘,푁−푗 = 푋푘,푗, 푘, 푗 = 1, 푁/2; 푋푁/2,푁/2 ∈ R, ˆ ˆ ˆ (3.6) 푋푘,푁−푗 = 푋푁−푘,푗, 푘, 푗 = 1, 푁/2 − 1; 푋0,0 ∈ R, ˆ ˆ ˆ (3.7) 푋0,푁−푗 = 푋0,푗, 푗 = 1, 푁/2; 푋0,푁/2 ∈ R, ˆ ˆ ˆ (3.8) 푋푁−푘,0 = 푋푘,0, 푘 = 1, 푁/2; 푋푁/2,0 ∈ R.

(очевидно, условия (3.7)–(3.8) обеспечивают вещественность первых двух сумм, а усло- вия (3.5)–(3.6) — оставшихся четырёх сумм).

11 Здесь одно и два измерения — это размерность аргумента процесса 푋: 푋(푡) или 푋(푡1, 푡2), а не фрак- тальная размерность их графиков. 12Мы строим аппроксимацию ФБД на квадратной решётке узлов, однако приведённый здесь алгоритм можно легко распространить на прямоугольную решётку 2푀1 × 2푀2 , в этом случае формулы будут более громоздкими. Моделирование фракталов в среде Maxima 31

Алгоритм 3.4: Поверхность ФБД методом Фурье-фильтрации

Вход: 퐻 ∈ (0, 1);  параметр ФБД, размерность графика равна 푑 = 3 − 퐻 푁 = 2푀 , 푀 ∈ N;  параметр, определяющий количество точек ФБД по каждому из двух измерений Выход: массив значений 푁−1 . дискретная аппроксимация ФБД на решётке {푋푛,푘}푛,푘=0  узлов 1: для 푗, 푘 = 1, 푁/2 2: ˆ 푔푒2휋푖푢 ; 푋푗,푘 = (푗2+푘2)퐻/2+0.5 ˆ ˆ 3: 푋푁−푗,푁−푘 = 푋푗,푘; 4: для 푘 = 1, 푁/2 − 1 5: ˆ 푔푒2휋푖푢 ; 푋0,푘 = (푘2)퐻/2+0.5 6: ˆ 푔푒2휋푖푢 ; 푋푘,0 = (푘2)퐻/2+0.5 ˆ ˆ 7: 푋0,푁−푘 = 푋0,푘; ˆ ˆ 8: 푋푁−푘,0 = 푋푘,0; 9: для 푗, 푘 = 1, 푁/2 − 1 10: ˆ 푔푒2휋푖푢 ; 푋푁−푗,푘 = ((푁−푗)2+푘2)퐻/2+0.5 ˆ ˆ 11: 푋푗,푁−푘 = 푋푁−푗,푘; ˆ 12: 푋0,0 = 0; 13: ˆ 푔 cos(2휋푢) ; 푋푁/2,0 = ((푁/2)2)퐻/2+0.5 14: ˆ 푔 cos(2휋푢) ; 푋0,푁/2 = ((푁/2)2)퐻/2+0.5 15: ˆ 푔 cos(2휋푢) ; 푋푁/2,푁/2 = (2(푁/2)2)퐻/2+0.5 16: ОДПФ ˆ ; Обратное дискретное преобразование Фурье матрицы ^ ^ 푁−1 푋 = (푋)  푋 = {푋푗,푘}푗,푘=0

Программируем на Maxima (листинг № 3.3): Поверхность ФБД методом Фурье-фильтрации § ¤ 1 load(distrib)$ § ¦ ¥ ¤ 2 load(fft)$ 3 load(draw)$ 4 N:2^4$ 5 H:1$ 6 7 for j:1 thru N/2 do 8 for k:1 thru N/2 do 9 (Y[j,k]:random_normal(0,1)*exp(2*%pi*%i*random_continuous_uniform(0,1))/ 10 (j^2+k^2)^(H/2+0.5), 11 Y[N-j,N-k]:conjugate(Y[j,k]) 12 )$ 13 for k:1 thru N/2-1 do 14 (Y[0,k]:random_normal(0,1)*exp(2*%pi*%i*random_continuous_uniform(0,1))/ 15 (k^2)^(H/2+0.5), 32 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

16 Y[k,0]:random_normal(0,1)*exp(2*%pi*%i*random_continuous_uniform(0,1))/ 17 (k^2)^(H/2+0.5), 18 Y[0,N-k]:conjugate(Y[0,k]), 19 Y[N-k,0]:conjugate(Y[k,0]) 20 )$ 21 for j:1 thru N/2-1 do 22 for k:1 thru N/2-1 do 23 (Y[N-j,k]:random_normal(0,1)*exp(2*%pi*%i*random_continuous_uniform(0,1))/ 24 ((N-j)^2+k^2)^(H/2+0.5), 25 Y[j,N-k]:conjugate(Y[N-j,k]) 26 )$ 27 Y[0,0]:0$ 28 Y[N/2,0]:random_normal(0,1)*cos(2*%pi*random_continuous_uniform(0,1))/ 29 ((N/2)^2)^(H/2+0.5)$ 30 Y[0,N/2]:random_normal(0,1)*cos(2*%pi*random_continuous_uniform(0,1))/ 31 ((N/2)^2)^(H/2+0.5)$ 32 Y[N/2,N/2]:random_normal(0,1)*cos(2*%pi*random_continuous_uniform(0,1))/ 33 (2*(N/2)^2)^(H/2+0.5)$ 34 35 X:map(inverse_fft,rectform(genmatrix(Y,N-1,N-1,0,0)))$ 36 Z:realpart(map(inverse_fft,transpose(X)))$ 37 38 draw3d(elevation_grid(Z,0,0,1,1),surface_hide = true);

¦ Комментарий. ¥ genmatrix(A,푗1,푗2,푖1,푖2) — возвращает матрицу, соответствующую массиву 퐴, причём элемент A[푖1,,푗1] является левым верхним элементом матрицы, а элемент A[푖2,,푗2] — нижним правым (аналог команды listarray для списков); если пропустить аргументы

푖1 и 푗1, то по умолчанию считается 푖1 = 푗1 = 1; transpose(x) — возвращает транспонированную к x матрицу; Заметим, что в силу формулы

푁−1 푁−1 푁−1 푁−1 푁−1 ∑︁ ∑︁ ˆ −2휋푖 푘푛+푗푚 ∑︁ −2휋푖 푘푛 ∑︁ ˆ −2휋푖 푗푚 ∑︁ ˆ −2휋푖 푘푛 푋푚,푛 = 푋푘,푗푒 푁 = 푒 푁 푋푘,푗푒 푁 = 푋̂︁푘푒 푁 푘=0 푗=0 푘=0 푗=0 푘=0 двумерное дискретное преобразование Фурье и обратное к нему можно получить, ис- пользуя одномерные преобразования Фурье следующим образом: сначала применяем преобразование Фурье к каждой строчке матрицы 푋ˆ, а затем — к каждому столбцу полученной матрицы. Эта схема реализована в нашем алгоритме в строках 35-36;

elevation_grid(Z,푥0,푦0,△푥,△푦 — команда, используемая внутри команды draw3d, которая рисует график поверхности, аппликаты точек которой заданы элемен-

тами матрицы Z 푚,푛, а абсциссы и ординаты точек — индексами матрицы. А именно, индексы матрицы отображаются на плоскость следующим образом: 1,1 ↔ (푥0, 푦0 +△푦), 1,푛 ↔ (푥0 + △푥, 푦0 + △푦), 푚,1 ↔ (푥0, 푦0) и 푚,푛 ↔ (푥0 + △푥, 푦0), задавая отображение всех индексов на прямоугольную сетку узлов на плоскости. Эта команда поддерживает следующие опции, указываемые в команде draw3d: surface_hide = true — отрисовывает только видимые части поверхности; Моделирование фракталов в среде Maxima 33

line_type = dots — тип линии сетки на поверхности: solid (сплошная, по умол- чанию) и dots (точечная); line_width = x — ширина линии сетки на поверхности (x> 0, по умолчанию 1); color = red — задаёт цвет графика; enhanced3d(f(x,y,z),x,y,z) — задает режим раскраски поверхности: x,y,z — явное указание переменных функции 푓, реализующей цвет точки (x,y,z) поверхности; кроме того, для этой опции можно (но не обязательно!) указать палитру цветов (по умолчанию она «марсианская»): palette=[훼,훽,훾] — палитра, задаваемая тремя числами 훼, 훽, 훾; заметим, её задание отличается для команды plot3d, описанной в справке по Maxima. Попробуйте заменить строчку 38 на следующий код:

п р и draw3d(palette=[0,30,25],enhanced3d=[z,x,y,z], м е surface_hide=true, elevation_grid(m,0,0,1,1)); р

И напоследок приведем алгоритм, позволяющий строить аппроксимацию поверхности ФБД с помощью метода срединного смещения. Этот алгоритм работает сравнительно быстро и поэтому широко применяется, однако его реализация не полностью удовлетво- ряет определению ФБД. Воспользуемся аналогией с одномерным методом срединных смещений для аппрокси-

мации броуновского движения. Определим значения 푋(푡1, 푡2) в вершинах большого квад- рата (см. схему ниже) и вычислим значение в его центре как среднее арифметическое значений его вершин плюс случайное смещение. Рассмотрим квадраты (треугольники, √ если их центры лежат на границе исходного квадрата), стороны которых в 2 раз мень- ше и параллельны диагоналям исходного квадрата, определим значение в них как среднее арифметическое значений окружающих их вершин плюс случайные смещения. Повторим два этих шага необходимое число раз. Таким образом, на каждом шаге сначала вычисляются значения в центрах «обычных» квадратов, а затем — в центрах «диагональных» квадратов. 34 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

Алгоритм 3.5: Поверхность ФБД методом срединного смещения

Вход: 퐻 ∈ (0, 1);  параметр ФБД, размерность графика равна 푑 = 3 − 퐻 휎;  параметр, определяющий вертикальный масштаб 푁 = 2푀 , 푀 ∈ N;  параметр, определяющий количество точек ФБД по каждому из двух измерений Выход: массив значений 푁 . дискретная аппроксимация ФБД на решётке {푋푛,푘}푛,푘=0  узлов

1: 푋0,0 = 푋0,푁 = 푋푁,0 = 푋푁,푁 = 0;  инициализация значений в вершинах большого квадрата 2: 푟 = 휎; 3: 퐷 = 푁;  инициализация шагов решётки 4: 푑 = 푁/2; 5: повторять 푀 раз 6: 푟 = 푟/2퐻/2;  меняем масштаб Считаем значения в центрах квадратов как среднее арифметическое их вершин плюс случайное приращение: 7: для 푖, 푗 = 푑, . . . , 푁 − 2 с шагом 퐷 8: 푋푖,푗 = (푋푖+푑,푗+푑 + 푋푖+푑,푗−푑 + 푋푖−푑,푗+푑 + 푋푖−푑,푗−푑)/4 + 푟푔;  здесь и делее 푔 — случайная величина, распределенная нормально с параметрами 푁(0, 1) 9: 푟 = 푟/2퐻/2;  меняем масштаб Считаем значения на границе большого квадрата как среднее значение трёх окру- жающих узлов плюс случайное приращение: 10: для 푖 = 푑, . . . , 푁 − 푑 с шагом 퐷 11: 푋푖,0 = (푋푖+푑,0 + 푋푖−푑,0 + 푋푖,푑)/3 + 푟푔; 12: 푋푖,푁 = (푋푖+푑,푁 + 푋푖−푑,푁 + 푋푖,푁−푑)/3 + 푟푔; 13: 푋0,푖 = (푋0,푖+푑 + 푋0,푖−푑 + 푋푑,푖)/3 + 푟푔; 14: 푋푁,푖 = (푋푁,푖+푑 + 푋푁,푖−푑 + 푋푁−푑,푖)/3 + 푟푔; Считаем значения в центрах диагональных квадратов как среднее значение в вер- шинах этих квадратов плюс случайное приращение: 15: для 푖 = 푑, . . . , 푁 − 푑 с шагом 퐷 16: для 푗 = 퐷, . . . , 푁 − 퐷 с шагом 퐷 17: 푋푖,푗 = (푋푖,푗+푑 + 푋푖,푗−푑 + 푋푖+푑,푗 + 푋푖−푑,푗)/4 + 푟푔; 18: для 푖 = 퐷, . . . , 푁 − 퐷 с шагом 퐷 19: для 푗 = 푑, . . . , 푁 − 푑 с шагом 퐷 20: 푋푖,푗 = (푋푖,푗+푑 + 푋푖,푗−푑 + 푋푖+푑,푗 + 푋푖−푑,푗)/4 + 푟푔; 21: 퐷 = 퐷/2; 22: 푑 = 푑/2; Моделирование фракталов в среде Maxima 35

Программируем на Maxima (листинг № 3.4):

Поверхность ФБД методом срединного смещения § ¤ ¦ ¥ 1 load(distrib)$ § ¤ 2 load(draw)$ 3 H:1$ /* параметр размерности поверхности*/ 4 s:2$ /* параметр вертикального масштаба*/ 5 M:6$ /* число шагов алгоритма*/ 6 7 X[0,0]:0$ /* инициализация значенийв точках первого квадрата*/ 8 X[0,N]:0$ 9 X[N,0]:0$ 10 X[N,N]:0$ 11 N:2^M$ 12 r:s$ 13 D:N$ /* инициализация шага решётки*/ 14 d:N/2$ 15 16 thru M do 17 ( 18 r:r/2^(H/2), 19 for i:d thru N-d step D do 20 for j:d thru N-d step D do 21 X[i,j]:float((X[i+d,j+d]+X[i+d,j-d]+X[i-d,j+d]+X[i-d,j-d])/4+ 22 r*random_normal(0,1)), 23 r:r/2^(H/2), 24 for i:d thru N-d step D do 25 ( 26 X[i,0]:(X[i+d,0]+X[i-d,0]+X[i,d])/3+r*random_normal(0,1), 27 X[i,N]:(X[i+d,N]+X[i-d,N]+X[i,N-d])/3+r*random_normal(0,1), 28 X[0,i]:(X[0,i+d]+X[0,i-d]+X[d,i])/3+r*random_normal(0,1), 29 X[N,i]:(X[N,i+d]+X[N,i-d]+X[N-d,i])/3+r*random_normal(0,1) 30 ), 31 for i:d thru N-d step D do 32 for j:D thru N-D step D do 33 X[i,j]:(X[i,j+d]+X[i,j-d]+X[i+d,j]+X[i-d,j])/4+r*random_normal(0,1), 34 for i:D thru N-D step D do 35 for j:d thru N-d step D do 36 X[i,j]:(X[i,j+d]+X[i,j-d]+X[i+d,j]+X[i-d,j])/4+r*random_normal(0,1), 37 38 D:D/2, 39 d:d/2 40 )$ 41 Y:genmatrix(X,N,N,0,0)$ 42 draw3d(elevation_grid(Y,0,0,1,1),surface_hide = true);

¦ ¥ 36 ФРАКТАЛЬНОЕ БРОУНОВСКОЕ ДВИЖЕНИЕ

Комментарий. Здесь цикл for используется с дополнительной опцией step, означающей шаг инкре- мента цикла. Кроме того, подумайте, с какой целью используется команда float в строчке 22.

Задача Пусть 푋(푡) и 푌 (푡) — независимые одномерные броуновские движения. Изоб- 3.1 разите путь 푓(푡) = (푋(푡), 푌 (푡)) на графике. Этот путь имеет фрактальную размерность 푑 = 2 почти наверное. Сделайте соответствующее наблюдение.

Постройте также путь 푓(푡) = (푋(푡), 푌 (푡), 푍(푡)) в 3 R , где 푍(푡) — ещё одна реализация броуновского движения. Что можно сказать о фрактальной раз- мерности такого пути?

Задача В алгоритмах 3.1–3.2 использовался случайный сдвиг на 휎푔. Будут ли измене- 3.2 ния, если заменить этот сдвиг на 푔(0, 휎) — случайную величину, распределенную нормально с параметрами 푁(0, 휎)?

Задача Реализуйте алгоритм для двумерного броуновского движения методом случай- 3.3 ного срединного смещения. См. указание в [1, гл. 9, с. 268].

Задача Реализуйте алгоритм построения аппроксимации ФБД с помощью ковари- 3.4 ационной матрицы. Алгоритм состоит в следующем. Необходимо получить

аппроксимацию ФБД 푋(푡) в точках 푡1, . . . , 푡푛. Для этого: ∙ Находим матрицу Γ = (푟(푡 , 푡 ))푛 , где 푟(푡, 푠) = 1 (︀푠2퐻 + 푡2퐻 − |푡 − 푠|2퐻 )︀; √ 푖 푗 푖,푗=1 2 ∙ Находим Σ = Γ (т.е. Σ2 = Γ) — соответствует матрице стандартного отклонения, ассоцииро- ванной с ковариационной матрицей Γ; ∙ Пусть 푣 = {푔1, . . . , 푔푛} – вектор, составленный из 푛 нормальных случайных величин с параметрами 푁(0, 1); ∙ Тогда 푋 = Σ푣. Как вычислить матрицу Σ? Для этого можно использовать разложение Холецкого13 (попробуйте!). Здесь же укажем другой способ (посредством собственных значений матрицы Γ): ∙ Поскольку Γ — симметричная положительно-определённая матрица, то её собственные значения 휆푖 вещественнны и 휆푖 ≥ 0, 푖 = 1, 푛; ∙ Пусть Λ = 퐷푖푎푔(휆푖), Λ푖,푗 = 휆푖훿푖푗, — диагональная матрица собственных значений, и пусть 1/2 1/2 — диагональная матрица с элементами 1/2 1/2 ( — символ Кронеке- Λ = 퐷푖푎푔(휆푖 ) Λ푖푗 = 휆푖 훿푖푗 훿푖푗 ра);

∙ Пусть 푃 — матрица, столбцами которой являются собственные векторы 푣푖, отвечающих 13Андре-Луи Хол´ецкий(1875-1918) — французский математик. Речь идет о представлении симметрич- ной положительно-определённой матрицы 퐴 в виде 퐴 = 퐿퐿푇 , где 퐿 — нижняя треугольная матрица со строго положительными элементами диагонали. Такое разложение существует, единственно и алгорит- мически несложно. Моделирование фракталов в среде Maxima 37

собственных значениям 휆푖. Заметим, что матрица 푃 обратима ввиду линейной независимости собственных векторов. ∙ Тогда Σ = 푃 Λ1/2푃 −1 (так как Γ = 푃 Λ푃 −1).

Задача Реализуйте алгоритм построения аппроксимации ФБД с помощью гипергео- 3.5 метрической функции Гаусса. Алгоритм состоит в следующем. Если 푋(푠) — классическое броуновское движение, то ФБД с параметром 퐻 можно получить так: ∫︀ 푡 푋퐻 (푡) = 0 퐾퐻 (푡, 푠) d퐵(푠), 퐻− 1 где (푡−푠) 2 (︀ 1 1 1 푡 )︀, — гамма-функция Эйлера. и — 퐾퐻 (푡, 푠) = 1 2퐹1 퐻 − 2 , 2 − 퐻, 퐻 + 2 , 1 − 푠 Γ 2퐹1 Γ(퐻+ 2 ) гипергеометрическая функция (ряд) Гаусса: ∞ [︂푘−1 ]︂ ∑︀ ∏︀ (푎+푛)(푏+푛) 푘 푎푏 푧 푎(푎+1)푏(푏+1) 푧2 2퐹1(푎, 푏, 푐, 푧) = 1 + (1+푛)(푐+푛) 푧 = 1 + 푐 1! + 푐(푐+1) 2! + ... = 푘=1 푛=0 Γ(푐) ∫︀ 1 푏−1 푐−푏−1 −1 = Γ(푏)Γ(푐−푏) 0 푡 (1 − 푡) (1 − 푡푧) d푡. Предположим, мы хотим получить аппроксимацию ФБД в точках 0 = 푡0 < 푡1 < . . . < 푡푛 = 푇 , тогда: √︀ ∙ Пусть 훿퐵푗 = 푔푗 푇/푛, 푗 = 0, 푛 (푔푗 — независимые нормально распределённые случайные величины с параметрами 푁(0, 1)), — приращения броуновского движения на интервале [0, 푇 ]. ∙ Тогда для каждого 푡푗, 푗 = 0, 푛, подсчитаем 푗−1 푛 ∑︀ ∫︀ 푡푖+1 푋 (푡푗) = 퐾 (푡푗, 푠) d푠 훿퐵푖. 퐻 푇 푡푖 퐻 푖=0 Для подсчёта гамма-функции Эйлера можно воспользоваться командой gamma(z) — возвращает значение гамма-функции Эйлера ∫︀ ∞ 푧−1 −푡 . Γ(푧) = 0 푡 푒 d푡 Для подсчёта интеграла можно использовать метод квадратур Гаусса (или численные методы нахождения интегралов в Maxima). Для подсчёта гипергеометрической функции можно считать предел ряда или использовать встроенную в Maxima функцию hypergeometric([a,b],[c],z) — возвращает значение гипергеометрической функции Гаусса

2퐹1(푎, 푏, 푐, 푧).

Задача Подумайте, что изменится, если в Алгоритме 3.4 аппроксимации поверхности 3.6 ФБД методом Фурье-фильтрации вместо квадратной решётки узлов взять пря- моугольную.

Рекомендуемая литература: [20], [1, гл. 9] ПРИЛОЖЕНИЕ

Математика существует не для того, чтобы навязывать кому-либо тяжёлую работу. Наоборот, она существует только для удоволь- ствия. Для удовольствия тех, кто любит анализировать то, что он делает, или может сделать, или то, что уже сделал в надежде сде- лать это ещё лучше. Роберт Брингхерст

этой главе собраны дополнительные сведения, полезные для дальнейшего и более В глубокого изучения применения программы Maxima для моделирования фракталов: использование пакета dynamics.

I Обзор пакета dynamics

C помощью пакета dynamics можно строить различные графические представления ди- намических систем и фракталов: ∙ паутинная диаграмма; ∙ бифуркационная диаграмма; ∙ эволюция орбиты одно- и двумерного отображений; ∙ «игра в хаос»; ∙ система итерированных функций, заданная аффинными преобразованиями; ∙ множества Жюлиа, Мандельброта; а также, в нём реализован метод Рунге-Кутты 4го порядка для решения систем диффе- ренциальных уравнений. Данный пакет обладает ограниченными возможностями. Однако рекомендуется изу- чить его исходный код, находящийся в файле «dynamics.mac». Параметры всех команд этого пакета, приведённых ниже, можно изменить непосредственно в тексте этого пакета или скопировать соответствующий кусок кода в свою рабочую область и изменить его. Рассмотрим функции этого пакета.

38 Моделирование фракталов в среде Maxima 39

Напомним, для использования команд данного пакета нужно его загрузить:

load(dynamics)$ Для вывода графики команды пакета dynamics используют команду plot2d, поэтому все опции 표푝푡푖표푛푠 этой команды можно передавать в команды пакета dynamics, например, можно менять графические интерфейсы, различные стили графиков, цвета, менять мас- штаб осей на логарифмический и т.д. Смотрите список опций команды plot2d в справке по Maxima.

+ evolution(퐹 (푥), 푥0, 푛, 표푝푡푖표푛푠) — графическое представление 푛 + 1 первых точек реккурентной последовательности 푥푛 = 퐹 (푥푛−1) с начальным членом 푥0: отображение точек (0, 푥0),..., (푛, 푥푛). В качестве 퐹 (푥) может быть любое выражение от одной пере- менной.

п р и м evolution(3*y*(1-y),0.5,100)$ е р

+ evolution2d([퐹 (푢, 푣), 퐺(푢, 푣)],[푢, 푣],[푢0, 푣0],푛, 표푝푡푖표푛푠) — графическое представ- ление 푛 + 1 первых точек (푢푘, 푣푘) орбиты двумерной дискретной динамической системы: 푢푛 = 퐹 (푢푛−1, 푣푛−1), 푣푛 = 퐺(푢푛−1, 푣푛−1) с начальной точкой (푢0, 푣0). В качестве 퐹 (푢, 푣) и 퐺(푢, 푣) могут быть любые выражения от двух переменных, эти переменные должны быть явно указаны в команде списком [푢, 푣].

п р и evolution2d([mod(2*u,1),0.5*(v+floor(2*u))], м е [u,v],[0.3,0.3],100)$ р

Комментарий. Рассмотренный пример — «преобразование пекаря». Напомним следующие команды: floor(푥) — «антье», целая часть 푥 ([푥]), также может вычислена с помощью команд: entier(푥) — целая часть 푥, fix(푥) — целая часть 푥; mod(푥, 푦) — 푥 по модулю 푦 (푥 − 푦[푥/푦]).

f:0.6*x*(1+2*x)+0.8*y*(x-1)-y^2-0.9$ п р и g:0.1*x*(1-6*x+4*y)+0.1*y*(1+9*y)-0.4$ м е evolution2d([f,g],[x,y],[-0.5,0],50000, р [style,dots])$ 40 ПРИЛОЖЕНИЕ

f:0.6*x*(1+2*x)+0.8*y*(x-1)-y^2-0.9$ п р g:0.1*x*(1-6*x+4*y)+0.1*y*(1+9*y)-0.4$ и м evolution2d([f,g],[x,y],[-0.5,0],300000, е р /* зум */ [x,-0.8,-0.6],[y,-0.4,-0.2], [style,dots])$

Комментарий. Рассмотренный пример — динамическая система, приводя- щею к фрактальному аттрактору. Заметим, что дополнительными опциями [x,-0.8,-0.6], [y,-0.4,-0.2], передаваемыми команде plot2d, мы можем обрезать построенные изображения, тем самым увеличивая их фрагменты.

+ orbits(퐹 (푥, 푐), 푥0, 푛1, 푛2,[푐, 푐0, 푐1, 푠푡푒푝],표푝푡푖표푛푠) — рисует бифуркационную диа- грамму (диаграмму орбит) для однопараметрического семейства отображений 퐹 (푥, 푐) с параметром 푐. На оси абсцисс отмечается параметр 푐 ∈ [푐0, 푐1], выбранный с ша- гом 푠푡푒푝. Для каждого значения 푐 вдоль оси ординат отмечается последовательность 푛1+푛2+1 — кусок орбиты начальной точки . Кроме опций команды {푥푛 = 퐹 (푥푛−1, 푐)}푛=푛1+1 푥0 plot2d, команда orbits принимает также опцию 푝푖푥푒푙푠, устанавливающую максималь- ное разрешение по вертикали.

п р и orbits(x^2+c,0,50,200,[c,-2,0.25], м е /* опции графики */ [style,dots],[nticks,1000])$ р

14 + staircase(퐹 (푥), 푥0, 푛, 표푝푡푖표푛푠) — рисует паутинную диаграмму для последова- тельности 푛 , заданной отображением с начальной точкой . См. с.7. {푥푘 = 퐹 (푥푘−1)}푘=1 퐹 푥0

п р и м staircase(cos(x), 1.1, 11, [x, 0, 1.2])$ е р

+ rk(퐹 (푦, 푥), 푦, 푦0,[푥, 푎, 푏, 푠푡푒푝]) rk([ ],[ ],[ 0 0 ],[ ])— + 퐹1(푦1, . . . , 푦푚), . . . , 퐹푚(푦1, . . . , 푦푚, 푥) 푦1, . . . , 푦푚, 푥 푦1, . . . , 푦푚 푥, 푎, 푏, 푠푡푒푝 это два варианта одной команды соответственно для решения обыкновенного дифферен- циального уравнения первого порядка и для решения систем таких уравнений, используя метод Рунге-Кутты 4го порядка.

14Staircase — лестничный пролёт (англ.). Моделирование фракталов в среде Maxima 41

Комментарий. Напомним, в чем заключается этот метод. Рассмотрим задачу Ко- ′ ши: 푦 = 푓(푥, 푦), 푦(푥0) = 푦0. Приближённое значение в последующих точках вычисля- ется по формуле: 1 푦 = 푦 + (푘 + 2푘 + 2푘 + 푘 ), 푛+1 푛 6 1 2 3 4

где 푘푖 вычисляются в 4 этапа: , ℎ 푘1 , ℎ 푘2 , . 푘1 = ℎ푓(푥푛, 푦푛) 푘2 = ℎ푓(푥푛 + 2 , 푦푛 + 2 ) 푘3 = ℎ푓(푥푛 + 2 , 푦푛 + 2 ) 푘4 = ℎ푓(푥푛 + ℎ, 푦푛 + 푘3) Этот метод имеет четвертый порядок точности: суммарная ошибка на интервале [푎, 푏] имеет порядок 푂(ℎ4).

В первом варианте решается уравнение 푦′ = 퐹 (푦, 푥). Здесь 푦 — зависимая переменная, область изменения [푎, 푏] независимой переменной 푥 разбивается на сетку узлов с шагом 푠푡푒푝. Начальное значение для 푦 равно 푦0. Заметим, что переменные не обязательно долж- ны иметь имена 푦 и 푥. Во втором варианте решается система из ОДУ ′ 푛 с за- 푚 {푦푘 = 퐹푘(푦1, . . . , 푦푚, 푥)}푘=1 푚 висимыми переменными [ ], вектором начальных значений [ 0 0 ] и одной 푦1, . . . , 푦푚 푦1, . . . , 푦푚 независимой переменной 푥 ∈ [푎, 푏], дискретизируемой с шагом 푠푡푒푝. Результат вычислений выводится списком из 푟 значений, полученных на каждой из 푟 = [(푏 − 푎)/푠푡푒푝] итераций метода, переходящего от одного узла 푥 к другому, если метод не прекратит свои вычисления раньше ввиду слишком большого значения одной из пере-

менных 푦1, . . . , 푦푚. Каждое из 푟 значений само является списком, состоящим из значений независимой переменной, и 푚 значений переменных 푦푘.

п р и sol:rk(t-x^2,x,1,[t,0,8,0.1])$ м е plot2d([discrete, sol])$ р

п р [F,G]:[4-x^2-4*y^2,y^2-x^2+1]$ и м sol:rk([F,G],[x,y],[-1.25,0.75],[t,0,4,0.02])$ е р plot2d([discrete, args(submatrix(sol,1))])$

Комментарий. В первом примере решается уравнение ′ 2 с начальным 푥푡 = 푡 − 푥 условием 푥(0) = 1, 푡 ∈ [0, 8] с шагом 0.1. Во втором примере решается система уравнений ′ 2 2, ′ 2 2 с начальными условиями и , 푥푡 = 4−푥 −4푦 푦푡 = 푦 −푥 +1 푥(0) = −1.25 푦(0) = 0.75 푡 ∈ [0, 4] с шагом 0.02. В обоих случаях результат записывается в массив sol и отображается на графике. Кроме того, напомним следующие команды:

submatrix(푟1, . . . , 푟푘, 푀, 푐1, . . . , 푐푠) — возвращает «подматрицу» матрицы 푀, полу- ченную из неё выбрасыванием строк с номерами 푟푖 и столбцов с номерами 푐푗. В случае данного примера решение sol состоит из списка, элементы которого — списки из трёх 42 ПРИЛОЖЕНИЕ

элементов вида [푡, 푥(푡), 푦(푡)]. При этом координаты (푥(푡), 푦(푡)) представляют точку ис- комой кривой. Необходимо выбросить первый элемент из каждого трёхэлементного списка, то есть первый столбец из матрицы, представляющей sol: submatrix(sol,1). args(expr) — возвращает списком аргументы верхнего уровня у выражения expr. В команду plot2d необходимо подавать список координат точек, а не матрицу (не смотря на то, что матрица в Maxima— это список своих строк). Поэтому здесь args — удобный способ перевода матрицы в список. Вообще, команда 푎푟푔푠 универсальна и используется не только для этого.

Мы опускаем описание следующих команд: +chaosgame, +ifs, +julia, +mandelbrot, — они были описаны в Приложении части I настоящего пособия. РЕСУРСЫ ИНТЕРНЕТА

[1e] http://www.altlinux.org/images/0/0b/MaximaBook.pdf Хорошее пособие по Maxima Е.А. Чичкарёва [31].

[2e] http://abacus.bates.edu/~sross/ Страница профессора Чипа Росса, посвященная бифуркационным диаграммам, диа- граммам орбит и Q-кривым.

[3e] http://maxima.sourceforge.net/ru/ Официальная страница проекта Maxima на русском языке (однако, она редко обнов- ляется, рекомендуется пользоваться английской версией страницы).

[4e] http://sourceforge.net/projects/maxima/files/ Здесь можно скачать установочный файл для Maxima.

[5e] http://maxima.sourceforge.net/ru/documentation.html Подборка руководств по Maxima с официального сайта, в том числе и на русском языке.

[6e] http://andrejv.github.com/wxmaxima/help.html Коллекция руководств по Maxima.

[7e] http://www.csulb.edu/~woollett/ Сайт профессора Edwin L. Woollett с очень полезной информацией о Maxima.

[8e] http://www.uneex.ru/static/MethodBooks_Maxima/Maxima.pdf Пособие Н.А. Стахина «Основы работы с системой аналитических (символьных) вычислений Maxima» на русском языке.

[9e] http://www3.msiu.ru/~lao4/maxima.pdf Методическое пособие с неофициального сайта МГИУ www3.msiu.ru.

[10e] http://oeis.org/A006890 Энциклопедия всевозможных констант, страница константы Фейгенбаума.

[11e] http://www.1-1-1.ir/pdf/feigenbaum-constant-to-1000-digits.pdf Константа Фейгенбаума, сосчитанная до 1000 знаков, .

43 СПИСОК ЛИТЕРАТУРЫ

(После источников указаны страницы

настоящего пособия, на которых они упоминаются)

[1] Кроновер, Р. М. Фракталы и хаос в динамических системах. Основы теории / Р. М. Кроновер. — М. : Постмаркет, 2000. — 352 с. с. 4, с. 11, с. 12, с. 16, с. 27, с. 36, с. 37

[2] Jackson, E. A. Perspectives of Nonlinear Dynamics / E. A. Jackson. — New York : Cam- bridge University Press, 2008. — 496 p. с. 9, с. 12, с. 15, с. 16

[3] Peitgen, H.-O. Chaos and , New Frontiers of Science / H.-O. Peitgen, H. J¨urgens, D. Saupe. — New York : Springer-Verlag, 1992. — 984 p. с. 9

[4] Coullet, P. Iterations d’endomorphismes et groupe de r´enormalisation / P. Coullet, C. Tresser // Comptes Rendus de l’Acad´emiedes Sciences. — 1978. — Vol. 287A. — Pp. 577–580. с. 10

[5] Coullet, P. It´erations d’endomorphismes et groupe de r´enormalisation / P. Coullet, C. Tresser // Journal de Physique Colloques. — 1978. — Vol. 39:C5. — Pp. 25–28. с. 10

[6] Lanford III, O. E. A computer-assisted proof of the feigenbaum conjectures / O. E. Lan- ford III // Bull. Amer. Math. Soc. — 1984. — Vol. 6:3. — Pp. 427–434. с. 10

[7] Lyubich, M. Feigenbaum-Coullet-Tresser universality and Milnor’s hairiness conjecture / M. Lyubich // Annals of Mathematics. — 1999. — Vol. 149. — Pp. 319–420. с. 10

[8] Feigenbaum, M. Quantitative universality for a class of nonlinear transformations / M. Feigenbaum // Journal of Statistical Physics. — 1978. — Vol. 19, no. 1. — Pp. 25– 52. с. 10, с. 11

[9] Feigenbaum, M. Universal behavior in nonlinear systems / M. Feigenbaum // Los Alamos Science. — 1980. — Pp. 4–27. с. 10

44 Моделирование фракталов в среде Maxima 45

[10] Metropolis, N. On finite limit sets for transformations on the unit interval / N. Metropolis, M. L. Stein, P. R. Stein // J. Combinatorial Theory. — 1973. — Vol. 15(1):25. — Pp. 25–44. с. 11 [11] Singer, D. Stable orbits and bifurcations of the maps in the interval / D. Singer // SIAM Journal on Applied Mathematics. — 1978. — Sep. — Vol. 35, no. 2. — Pp. 260–267. с. 11, с. 12 [12] Feigenbaum, M. The universal metric properties of nonlinear transformations / M. Feigen- baum // Journal of Statistical Physics. — 1979. — Vol. 21, no. 6. — Pp. 669–706. с. 13, с. 16 [13] Briggs, K. M. A precise calculation of the feigenbaum constants / K. M. Briggs // Math- ematics of computation. — 1991. — Vol. 57, no. 195. — Pp. 435–439. с. 13, с. 16 [14] Ross, C. The shadow-curves of the orbit diagram permeate the bifurcation diagram, too / C. Ross, M. Odell, S. Cremer // International Journal of Bifurcation and Chaos. — 2009. — Vol. 19, no. 9. — Pp. 3017–3031. с. 16 [15] Глейк, Д. Хаос. Создание новой науки / Д. Глейк. — Спб. : Амфора, 2001. — 398 с. с. 16 [16] McGuire, J. B. Asymptotic properties of sequences of iterates of nonlinear transforma- tions / J. B. McGuire, C. J. Thompson // Journal of Statistical Physics. — 1982. — Vol. 27, no. 1. — Pp. 183–200. с. 16 [17] Фейгенбаум, М. Универсальность в поведении нелинейных систем / М. Фейгенба- ум // Успехи физических наук. — 1983. — Октябрь. — Т. 141, № 2. — С. 343–374. с. 16 [18] Вул, Е. Б. Универсальность Фейгенбаума и термодинамический формализм / Е. Б. Вул, Я. Г. Синай, К. М. Ханин // Успехи математических наук. — 1984. — Т. 39, № 3 (237). — С. 3–37. с. 16 [19] Briggs, K. M. How to calculate the feigenbaum constants on your PC / K. M. Briggs // Austral. Math. Soc. Gazette. — 1989. — Vol. 16. — Pp. 89–92. с. 16 [20] Liebovitch, L. S. Fractals and Chaos Simplified for the Life Sciences / L. S. Liebovitch. — New York : Oxford University Press, 1998. — 288 p. с. 18, с. 22, с. 37 [21] Брауновское движение. А. Эйнштейн, М. Смолуховский: cб. ст. / Под ред. В. И. Давыдова. — М.–Л. : ОНТИ, 1936. — 608 с. — [пер. с нем. и франц., с доп. статьями Ю. А. Крутикова и Б.И. Давыдова]. http://www.mirgorodsky.ru/ mirgorodskiyal_statya/O_DVIGENII_VZVESHENNIH_V_POKOJASCHEISYA_JZIDKOSTI_ CHASTITC_EINSHTEIN_1905.pdf. с. 23 [22] Brown, R. A brief account of microscopical observations made in months of June, July, and August, 1827, on the particles contained in the pollen of plants; and on the general existence of active molecules in organic and inorganic bodies / R. Brown // Edinburgh new Philosophical Journal. — 1828. — Vol. 5. — Pp. 358–371. http://sciweb.nybg.org/ science2/pdfs/dws/Brownian.pdf. с. 23 46 Список литературы

[23] Перрен, Ж. Атомы / Ж. Перрен. Современные проблемы естествознания. — М. : Госиздат, 1921. — 254 с. — [пер. с англ., 1916 г.]. http://www.archive.org/stream/ atomsper00perruoft. с. 23

[24] Wiener, N. Differential space / N. Wiener // J. Math. Phys. — 1923. — Vol. 2. — Pp. 131– 174. с. 23, с. 25

[25] Wiener, N. Un probl`emede probabilit´esd´enombrables / N. Wiener // Bull. Soc. Math. France. — 1924. — Vol. 52. — Pp. 569–578. с. 23, с. 25

[26] Kolmogorov, A. N. Grundbegriffe der Wahrscheinlichkeitrechnung / A. N. Kolmogorov. — Berlin : Springer-Verlag, 1933. — Vol. 2:3 of Ergebnisse der Mathematik. — 62 p. с. 23

[27] L´evy,P. Processus Stochastiques et Mouvement Brownien / P. L´evy. — Paris : Gauthier- Villars, 1948. — 367 p. с. 23

[28] Karatzas, I. and Stochastic Calculus (secon edition) / I. Karatzas, S. E. Shreve. — New York ; Berlin : Springer-Verlag, 1991. — 493 p. с. 23

[29] Mandelbrot, B. B. Fractional brownian motions, fractional noises and applications / B. B. Mandelbrot, J. W. V. Ness // SIAM Review. — 1968. — October. — Vol. 10, no. 4. — Pp. 422–437. с. 24, с. 26, с. 27

[30] Peitgen, H.-O. The Science of Images / H.-O. Peitgen, D. S. et al.; Ed. by H.- O. Peitgen, D. Saupe. — Tokyo ; New York : Springer-Verlag, 1988. — 312 p. с. 30

[31] Чичкарёв, Е. А. Компьютерная математика с Maxima: Руководство для школьников и студентов / Е. А. Чичкарёв. Библиотека ALT Linux. — М. : ALT Linux, 2012. — 384 с. http://www.altlinux.org/images/0/0b/MaximaBook.pdf. с. 43

[32] Barnsley, M. F. Fractals everywhere, second edition / M. F. Barnsley. — Boston : Aca- demic Press, 1993. — 550 p.

[33] Barnsley, M. F. Superfractals / M. F. Barnsley. — Cambridge : Cambridge University Press, 2006. — 453 p. УКАЗАТЕЛЬ КОМАНД

args, 42 [line_type], 32 at,7 [line_width], 32 listarray, 18 block, 12 color,8 mean, 18 conjugate, 29 mod, 39 diff,7 newton1,6 dynamics, 38 orbits, 40 elevation_grid, 32 [enhanced3d], 32 [palette], 33 entier, 39 ev, 29 random_continuous_uniform, 29 evolution,6, 39 random_normal, 18 evolution2d, 39 rectform, 29 explicit,8 rk, 40 fft, 29 staircase, 40 find_root,6 [step], 36 fix, 39 submatrix, 41 floor, 39 [surface_hide], 32 [fpprintprec], 29 transpose, 32 gamma, 37 hypergeometric, 37 unless, 15 inverse_fft, 29 var, 18

47 Замечания и пожелания можно отправлять автору по адресу [email protected]