@c Language=Russian
@c Encoding=UTF-8
@c File=dynamics.texi 
@c OriginalRevision=1.15
@c TranslatedBy: (c) 2008-02 Vadim V. Zhytnikov <vvzhyt@gmail.com>


@menu
* Введение в пакет dynamics::
* Функции и переменные пакета dynamics::
@end menu

@node Введение в пакет dynamics, Функции и переменные пакета dynamics, Пакет dynamics, Пакет dynamics
@section Введение в пакет dynamics

Пакет @code{dynamics} включает несколько функций, предназначенных
для создания различных графических представлений дискретных
динамических систем и фракталов, и реализацию метода Рунге-Кутта 4-го порядка
для численного решения систем дифференциальных уравнений.

Для того, чтобы использовать функции данного пакета, его нужно сначала загрузить командой
@code{load("dynamics")}.

@b{Изменения введенные в Maxima 5.12}

Начиная с версии Maxima 5.12 пакет dynamics использует для построения 
графиков функцию @code{plot2d}. Команды, строящие графики
(исключая @code{julia} и @code{mandelbrot}), принимают любые опции
команды @code{plot2d}, включая опции выбора различных графических интерфейсов,
выбора стилей и цвета, и представления одной или обеих осей в логарифмической шкале.
Старые опции @var{domain}, @var{pointsize}, @var{xcenter}, @var{xradius},
@var{ycenter}, @var{yradius}, @var{xaxislabel} и @var{yaxislabel},
начиная с этой версии не действуют.

Все программы теперь принимают произвольные имена переменных, а не только @var{x}
и @var{y}, как в старых версиях. Обязательные параметры изменились в двух 
программах: @code{evolution2d} теперь требует список, называющий явным образом
две независимые переменные, а горизонтальный предел для @code{orbits} 
больше не требует указание размера шага.  Теперь предел задает
имя переменной, минимальное и максимальное значения. 
Размер шага теперь может быть изменен с помощью опции @var{nticks}.
@var{nticks}.

@opencatbox{Категории:}
@category{Динамические системы}
@category{Пакеты библиотеки share}
@category{Пакет dynamics}
@closecatbox

@node Функции и переменные пакета dynamics,  , Введение в пакет dynamics, Пакет dynamics
@section Функции и переменные пакета dynamics

@deffn {Функция} chaosgame (@code{[[}@var{x1}, @var{y1}@code{]}...@code{[}@var{xm}, @var{ym}@code{]]}, @code{[}@var{x0}, @var{y0}@code{]}, @var{b}, @var{n}, ..., options, ...);

Реализует так называемую игру хаоса: сначала изображается начальная точка (@var{x0},
@var{y0}), далее одна из @var{m} точек
@code{[}@var{x1}, @var{y1}@code{]}...@code{[}@var{xm}, @var{ym}@code{]}
выбирается произвольным образом. Следующая точка изображается на отрезке,
соединяющем предыдущую точку со случайно выбранной, на расстоянии от случайной точки
равном длине этого отрезка, умноженной на @var{b}
Процедура повторяется @var{n} раз.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} evolution (@var{F}, @var{y0}, @var{n}, ..., options, ...);

Изображает @var{n+1} точек на 2-мерном графе, где горизонтальные
координаты точек есть 0, 1, 2, ..., @var{n}, а вертикальные 
координаты есть соответствующие значения последовательности @var{y(n)},
определенной рекуррентным соотношением
@ifnottex
@example
        y(n+1) = F(y(n))
@end example
@end ifnottex
@tex
$$y_{n+1} = F(y_n)$$
@end tex

С начальным значением @var{y(0)} равным @var{y0}. @var{F} должно быть
выражением, которое зависит только от одной переменной (в примере,
оно зависит от @var{y}, но может быть использована только одна переменная),
@var{y0} должно быть вещественным числом, а @var{n} должно быть положительным целым.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} evolution2d (@code{[}@var{F}, @var{G}@code{]}, @code{[}@var{u}, @var{v}@code{]}, @code{[}@var{u0}, @var{y0}@code{]}, @var{n}, ..., options, ...);

Изображает на двумерном графике первые @var{n+1} точек последовательности,
определяемой двумерной дискретной динамической системой с 
рекуррентными соотношениями
@ifnottex
@example
        u(n+1) = F(u(n), v(n))    v(n+1) = G(u(n), v(n))
@end example
@end ifnottex
@tex
$$\cases{u_{n+1} = F(u_n, v_n) &\cr v_{n+1} = G(u_n, v_n)}$$
@end tex

С начальными значениями @var{u0} и @var{v0}. Выражения @var{F} и @var{G} должны 
зависеть только от двух переменных @var{u} и @var{v}, 
которые должны быть явно объявлены в списке. 

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} ifs (@code{[}@var{r1}, ..., @var{rm}@code{]}, @code{[}@var{A1}, ..., @var{Am}@code{]}, @code{[[}@var{x1}, @var{y1}@code{]}, ..., @code{[}@var{xm}, @var{ym}@code{]]}, @code{[}@var{x0}, @var{y0}@code{]}, @var{n}, ..., options, ...);

Реализует метод системы повторяющихся функций (Iterated Function System). 
Этот метод аналогичен игре хаоса, описанной в функции @code{chaosgame}, 
но вместо сжатия отрезка от текущей точки до случайно выбранной, 
две компоненты данного отрезка умножаются на 2х2
матрицу @var{Ai}, которая соответствует случайно выбранной точке.

Случайный выбор @var{m} точек притяжения может быть осуществлен 
с вероятностью, определенной весами
@var{r1},...,@var{rm}. Веса могут быть заданы в кумулятивной форме,
например, если есть 3 точки с вероятностями 0.2, 0.5 и 0.3, 
то веса @var{r1}, @var{r2} и @var{r3} могут быть 2, 7 и 10.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} julia (@var{x}, @var{y}, ...@var{options}...)

Создает графический файл с изображением фрактала Джулия для комплексного числа (@var{x} + i @var{y}). 
Параметры @var{x} и @var{y} должны быть вещественными.
Файл в графическом формате XPM создается в текущей директории пользователя. 
Работа программы занимает несколько секунд, а по окончании вычислений она печатает 
имя созданного файла.

Точкам, которые не принадлежат фракталу Джулия, присваиваются разные цвета
в соответствии с числом итераций, необходимых последовательности,
начинающейся в точке, чтобы выити из круга сходимости радиуса 2.
Максимальное число итераций определяется опцией @var{levels}.
Если после этого числа итераций, последовательность все еще
находится в круге сходимости, то точка будет изображена 
цветом, определяемым опцией @var{color}.

Все цвета, используемые для изображения точек, не принадлежащих
фракталу Джулия, имеют одинаковые @var{saturation} и @var{value}, 
но различные углю оттенков, равномерно распределенные 
в интервале от @var{hue} до (@var{hue} + @var{huerange}).

@var{options} -- набор необязательных опций. Список допустимых опций приведен
в разделе ниже.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} mandelbrot (@var{options})

Создает графический файл с изображением фрактала Мандельброта. 
Файл в графическом формате XPM создается в текущей директории пользователя. 
Работа программы занимает несколько секунд, а по окончании вычислений она печатает 
имя созданного файла.

Точкам, которые не принадлежат фракталу Джулия, присваиваются разные цвета
в соответствии с числом итераций, необходимых последовательности,
начинающейся в точке, чтобы выити из круга сходимости радиуса 2.
Максимальное число итераций определяется опцией @var{levels}.
Если после этого числа итераций, последовательность все еще
находится в круге сходимости, то точка будет изображена 
цветом, определяемым опцией @var{color}.

Все цвета, используемые для изображения точек, не принадлежащих
фракталу Джулия, имеют одинаковые @var{saturation} и @var{value}, 
но различные углы оттенков, равномерно распределенные 
в интервале от @var{hue} до (@var{hue} + @var{huerange}).

@var{options} -- набор необязательных опций. Список допустимых опций приведен
в разделе ниже.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} orbits (@var{F}, @var{y0}, @var{n1}, @var{n2}, [@var{x}, @var{x0}, @var{xf}, @var{xstep}], ...options...);

Изображает диаграмму траекторий семейства одномерных
дискретных динамических систем с одним параметром @var{x}.
Такой тип диаграмм используется при изучении бифуркации одномерных
дискретных систем.

Функция @var{F(y)} определяет последовательность с начальным значением @var{y0}, 
также как в случае функции @code{evolution}, но в данном случае функция
еще зависит от параметра @var{x}, принимающего значения в интервале от
@var{x0} до @var{xf} с шагом @var{xstep}. 
Каждое значение параметра @var{x} изображается на горизонтальной оси.
На вертикальной оси изображаются @var{n2} значений последовательности
@var{y(n1+1)},..., @var{y(n1+n2+1)}, полученных поле @var{n1} 
начальных итераций.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@deffn {Функция} rk (@var{ODE}, @var{var}, @var{initial}, @var{domain})
@deffnx {Функция} rk ([@var{ODE1},...,@var{ODEm}], [@var{v1},...,@var{vm}], [@var{init1},...,@var{initm}], @var{domain})

Первая форма численно решает одно обычное дифференциальное 
уравнение первого порядка, а вторая форма решает систему m 
подобных уравнений, с использованием метода Рунге-Кутта 4-го порядка.
@var{var} -- зависимая переменная. @var{ODE} -- должно быть выражением, которое 
зависит только от независимой и зависимой переменных и определяет 
производную зависимой переменной по независимой.

Независимая переменная задается параметром @code{domain}, который должен быть списком 
четырех элементов. Например:
@example
[t, 0, 10, 0.1]
@end example
первый элемент списка есть независимая переменная, 
второй и третий элементы есть начальное и конечное значения этой переменной,
и последний элемент задает шаг для данного интервала.

Если предстоит решить @var{m} уравнений, то должно быть @var{m}
зависимых переменных @var{v1}, @var{v2}, ..., @var{vm}. 
Начальные значения для этих переменных будут @var{init1}, @var{init2}, ..., @var{initm}.
При этом все равно остается только одна зависимая переменная, задаваемая @code{domain},
как в предыдущем случае. 
@var{ODE1}, ..., @var{ODEm} -- выражения, определяющие производную каждой
из зависимых переменных по независимой.
Эти выражения могут зависеть только от зависимых переменных и независимой переменной.
Важно задать производные  @var{ODE1}, ..., @var{ODEm} в списке точно в том порядке,
что и зависимые переменные. Т.е. третий элемент списка будет
интерпретирован как производная третьей зависимой переменной.

Программа пытается проинтегрировать уравнения от начального значения 
независимой переменной до конечного значения с использованием
постоянного приращения. 
Если на каком-либо шаге значение одной из зависимых переменных
становится слишком большим по абсолютной величине, то интегрирование прекращается.
Результат является списком с числом элементов равным числу итераций.
Каждый элемент сам является списком с @var{m}+1 элементами: 
значение зависимой переменной с последующими значениями зависимых переменных
в соответствующей точке.

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Дифференциальные уравнения}
@category{Численные методы}
@closecatbox

@end deffn

@deffn {Функция} staircase (@var{F}, @var{y0}, @var{n}, ...options...);

Строит лестничную диаграмму для последовательности,
заданной рекуррентным соотношением
@ifnottex
@example
        y(n+1) = F(y(n))
@end example
@end ifnottex
@tex
$$y_{n+1} = F(y_n)$$
@end tex

Интерпретация и допустимые значения параметров аналогичны таковым для команды @code{evolution}. 
Лестничная диаграмма состоит из графика функции @var{F(y)} вместе с прямой @var{G(y)} @code{=} @var{y}. 
Из точки (@var{y0}, @var{y0}) на этой прямой строится вертикальный отрезок
до переcечения с функцией @var{F}. Из этой точки строится горизонтальный отрезок до
точки пересечения с прямой в точке (@var{y1}, @var{y1}).
Процедура повторяется @var{n} раз до достижения точки (@var{yn}, @var{yn}).

@opencatbox{Категории:}
@category{Пакет dynamics}
@category{Графика}
@closecatbox

@end deffn

@b{Опции}

Каждая опция есть список из двух или более элементов. Первый элемент -- имя опции,
остальные -- аргументы опции.

Допустимые опции функций @code{evolution}, @code{evolution2d},
@code{staircase}, @code{orbits}, @code{ifs} и @code{chaosgame} те же самые, что 
у функции @code{plot2d}. Функция @code{orbits} 
допускает дополнительную опцию @var{pixels}, которая задает максимальное
число точек по вертикали.

Следующие опции допускаются функциями @code{julia} и @code{mandelbrot}:

@itemize @bullet
@item
@dfn{size} имеет один или два аргумента. Если задан только один аргумент,
то ширина и высота создаваемого графика в пикселях будут равны этому значению.
Если заданы два агрумента, то они определяют ширину и высоту соответственно.
Значение по умолчанию равно 400 для ширины и для высоты.
Если два параметра не равны, то график будет искаженным.

@item
@dfn{levels} определяет максимальное число итераций, которое также 
равно числу цветов, используемых для раскраски не принадлежащих фракталу точек.
Значение по умолчанию равно 12. Большее значение приводят к большему времени
вычисления.

@item
@dfn{huerange} определяет диапазон углов оттенков, используемых
для раскраски не принадлежащих фракталу точек.
Значение по умолчанию 360, что означает -- весь диапазон оттенков.
Значения больше 360 означает повторяющиеся оттенки,
а отрицательное значение позволяет уменьшать углы оттенков с
увеличением числа итераций.

@item
@dfn{hue} задает оттенок в градусах для первого цвета,
используемого для раскраски не принадлежащих фракталу точек.
Значение по умолчанию 300, что соответствует цвету маджента.
Значения для некоторый других стандартных цветов:
0 -- красный, 45 -- оранжевый, 60 -- желтый, 120 -- зеленый, 180 -- циан и
240 -- синий. См. также опцию @var{huerange}.

@item
@dfn{saturation} задает значение насыщенности цвета для не принадлежащих
фракталу точек. Оно должно быть в пределах от 0 до 1. 
Значение по умолчанию 0.46.

@item
@dfn{value} задает яркость цвета для не принадлежащих
фракталу точек. Оно должно быть в пределах от 0 до 1. 
Чем больше значение, тем ярче цвет.

@item
@dfn{color} должна иметь три параметра, задающих оттенок,
насыщенность и яркость. Значение по умолчанию 0 для всех трех параметров,
что соответствует черному цвету.
Для объяснения допустимых значений см. опции 
@var{hue}, @var{saturation} и @var{value}.

@item
@dfn{center} должна иметь два вещественных параметра, задающих
на комплексной плоскости точку центра изображаемой области.
Значение по умолчанию 0 для обеих координат (начало координат).

@item
@dfn{radius} задает радиус наибольшего круга внутри изображаемой квадратной области.
Значение по умолчанию 2.

@item
@dfn{filename} задает имя файла, в котором будет сохранен результирующий график. 
Расширение .xpm добавляется к имени файла. Если файл уже существует,
то он будет замене на новый.
Значение по умолчанию есть julia для фрактала Джулия и mandelbrot
для фрактала Мандельброта.

@end itemize

@b{Примеры}

Графическое представление лестничной диаграммы для последовательности:
2, cos(2), cos(cos(2)),...

@example
(%i1) load("dynamics")$

(%i2) evolution(cos(y), 2, 11);

(%i3) staircase(cos(y), 1, 11, [y, 0, 1.2]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics1,8cm}
@image{@value{figuresfolder}/dynamics2,8cm}
@end ifnotinfo

Если ваша система медленна, следует уменьшить число итераций в следующих примерах. 
Если точки кажутся слишком маленькими на мониторе, то можно 
попробовать другой стиль, например 
@code{[}@var{style}, @code{[}@var{points}, 0.8 @code{]]}.

Диаграмма траекторий для квадратичного отображения с параметром @var{a}.
@ifnottex
@example
        x(n+1) = a + x(n)^2
@end example
@end ifnottex
@tex
$$x_{n+1} = a + x_n^2$$
@end tex

@example
(%i4) orbits(x^2+a, 0, 50, 200, [a, -2, 0.25], [style, dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics3,8cm}
@end ifnotinfo

Для того, чтобы увеличить область вблизи нижней бифуркации около x @code{=} -1.25 используем:
@example
(%i5) orbits(x+y^2, 0, 100, 400, [a,-1,-1.53], [x,-1.6,-0.8],
             [nticks, 400], [style,dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics4,8cm}
@end ifnotinfo

Эволюция двумерной системы, приводящая к фракталу:

@example
(%i6) f: 0.6*x*(1+2*x)+0.8*y*(x-1)-y^2-0.9$

(%i7) g: 0.1*x*(1-6*x+4*y)+0.1*y*(1+9*y)-0.4$

(%i8) evolution2d([f,g], [x,y], [-0.5,0], 50000, [style,dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics5,8cm}
@end ifnotinfo

Увеличение небольшой области фрактала:

@example
(%i9) evolution2d([f,g], [x,y], [-0.5,0], 300000, [x,-0.8,-0.6],
                  [y,-0.4,-0.2], [style, dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics6,8cm}
@end ifnotinfo

График треугольника Серпинского, полученный как игра хаоса:

@example
(%i9) chaosgame([[0, 0], [1, 0], [0.5, sqrt(3)/2]], [0.1, 0.1], 1/2,
                 30000, [style, dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics7,8cm}
@end ifnotinfo

Фрактал папоротник (Barnsley's fern) полученный при помощи 
системы повторяющихся функций (Iterated Function System):

@example
(%i10) a1: matrix([0.85,0.04],[-0.04,0.85])$

(%i11) a2: matrix([0.2,-0.26],[0.23,0.22])$

(%i12) a3: matrix([-0.15,0.28],[0.26,0.24])$

(%i13) a4: matrix([0,0],[0,0.16])$

(%i14) p1: [0,1.6]$

(%i15) p2: [0,1.6]$

(%i16) p3: [0,0.44]$

(%i17) p4: [0,0]$

(%i18) w: [85,92,99,100]$

(%i19) ifs(w, [a1,a2,a3,a4], [p1,p2,p3,p4], [5,0], 50000, [style,dots]);
@end example

@ifnotinfo
@image{@value{figuresfolder}/dynamics8,8cm}
@end ifnotinfo

Чтобы создать файл @emph{dynamics9.xpm} с графическим изображением 
фрактала Мандельброта с 12 цветами, выполним:

@example
mandelbrot([filename,"dynamics9"])$
@end example

@ifnotinfo
@c commented out, image is missing... @image{@value{figuresfolder}/dynamics9,8cm}
@end ifnotinfo

Для фрактала Джулия с числом (-0.55 + i 0.6):
@example
julia(-0.55, 0.6, [levels, 36], [center, 0, 0.6], [radius, 0.3],
      [hue, 240], [huerange, -180], [filename, "dynamics10"])$
@end example

Граф будет сохранен ф файле @emph{dynamics10.xpm} и будет изображать область
от -0.3 до 0.3 по оси x, и от 0.3 до 0.9 по оси y. 
Используется 36 цветов, начиная с синего и заканчивая желтым.

@ifnotinfo
@c commented out, image is missing @image{@value{figuresfolder}/dynamics10,8cm}
@end ifnotinfo

Чтобы решить дифференциальное уравнение

@ifnottex
@example
          dx/dt = t - x^2
@end example
@end ifnottex
@tex
$${{dx}\over{dt}} = t - x^2$$ 
@end tex

с начальным значением x(t=0) = 1, в интервале t от 0 до 8 с шагом 0.1, используем команду:

@example
(%i20) results: rk(t-x^2,x,1,[t,0,8,0.1])$
@end example

Результат сохраняется в списке @code{results}.

Чтобы численно решить систему:

@ifnottex
@example
        dx/dt = 4-x^2-4*y^2     dy/dt = y^2-x^2+1
@end example
@end ifnottex
@tex
$$\cases{{\displaystyle{dx}\over\displaystyle{dt}} = 4-x^2-4y^2 &\cr &\cr {\displaystyle{dy}\over\displaystyle{dt}} = y^2-x^2+1}$$
@end tex

для t от 0 до 4, и с значениями -1.25 и 0.75 для x и y в t=0:

@example
(%i21) sol: rk([4-x^2-4*y^2,y^2-x^2+1],[x,y],[-1.25,0.75],[t,0,4,0.02])$
@end example
