Общие динамические системы
Мы ввели фиктивный класс смысл, которого только в том, чтобы
быть родителем для классов
и
- соответственно для
непрерывной и дискретной динамических систем. Мы также сразу
создали два наследника класса
для различного типа
динамических систем.
В качестве первого примера динамической системы мы рассмотрим
отображение Хенона. Фазовым множеством здесь является множество , время дискретное, а отображение задается формулой
![p(x,n)=T^nx,](/sites/default/files/tex_cache/f23591e5dca7ac3e15c4dac1ca2744fd.png)
![T](/sites/default/files/tex_cache/b9ece18c950afbfa6b0fdbfa4ff731d3.png)
![T\left(%
\begin{array}{c}
x_1 \\
x_2 \\
\end{array}%
\right)=\left(%
\begin{array}{c}
1+x_2-ax_1^2 \\
bx_1 \\
\end{array}%
\right),](/sites/default/files/tex_cache/20f12eba8d4d9acfb387ad002085f61e.png)
![a>0](/sites/default/files/tex_cache/323c5f97105643bc61e288fe596194ca.png)
![0<b<1](/sites/default/files/tex_cache/5f375c9915350da438317c968dd1e8ab.png)
![\begin{verbatim}
class THenon : TNDS
{
double a, b;
public THenon(double a, double b)
: base(new double[2])
{
this.a = a;
this.b = b;
}
public void Set_x1(double x1)
{
((double[])A)[0] = x1;
}
\end{verbatim}](/sites/default/files/tex_cache/56b4caa27ad9c1614becc6581895b29c.png)
![\begin{verbatim}
public void Set_x2(double x2)
{
((double[])A)[1] = x2;
}
public double Get_x1()
{
return ((double[])A)[0];
}
public double Get_x2()
{
return ((double[])A)[1];
}
public override void Next()
{
double x1, x2;
x1 = 1.0 + Get_x2() - a * Get_x1() * Get_x1();
x2 = b * Get_x1();
Set_x1(x1);
Set_x2(x2);
Inc();
}
}
\end{verbatim}](/sites/default/files/tex_cache/ee581e3731218ef5be3f9ca3fd2fb8a2.png)
Запустим наш класс для расчета первых точек, и на рисунке
19.1 приведем фазовый портрет.
![\begin{verbatim}
THenon Henon = new THenon(1.4, 0.3);
StreamWriter F = File.CreateText("henon.txt");
while (Henon.Get_n() <= 10000)
{
Console.WriteLine("{0}\t{1}", Henon.Get_x1(), Henon.Get_x2());
F.WriteLine("{0}\t{1}", Henon.Get_x1(), Henon.Get_x2());
Henon.Next();
}
F.Close();
\end{verbatim}](/sites/default/files/tex_cache/7008ef11a80fd8f2c8c9afa7f8faabad.png)
В качестве примера непрерывной динамической системы мы рассмотрим
нелинейный осциллятор Ван-дер-Поля. Фазовое пространство этой
динамической системы также двумерная плоскость: , время
непрерывное, а полугруппа преобразования задается решением задачи
Коши для следующего нелинейного дифференциального уравнения
второго порядка.
![y''(t)-a(1-by^2(t))y'(t)+y(t)=0.](/sites/default/files/tex_cache/b12c9c10361b00ea51b05dfbe60b087b.png)
![a,b\in{\rm R}](/sites/default/files/tex_cache/39e93b770c591c571f1bc3f3afafa463.png)
![a>0](/sites/default/files/tex_cache/323c5f97105643bc61e288fe596194ca.png)
Реализуем соответствующий класс на C#.
![\begin{verbatim}
class TPole : TRDS
{
TPoleRK RK;
double h;
public TPole(double a, double b, double h)
: base(new double[2])
{
this.h = h;
RK = new TPoleRK(a, b);
Set_x1(10.0);
Set_x2(10.0);
RK.SetInit(0, new double[] { Get_x1(), Get_x2() });
}
\end{verbatim}](/sites/default/files/tex_cache/b0076cbb654269dd2a19afeec4ee3c52.png)
![\begin{verbatim}
public void Set_x1(double x1)
{
((double[])A)[0] = x1;
}
public void Set_x2(double x2)
{
((double[])A)[1] = x2;
}
public double Get_x1()
{
return ((double[])A)[0];
}
public double Get_x2()
{
return ((double[])A)[1];
}
public override void Next()
{
RK.NextStep(h);
Inc(h);
Set_x1(RK.Y[0]);
Set_x2(RK.Y[1]);
}
}
\end{verbatim}](/sites/default/files/tex_cache/ba4de9751cecc5d1a7780a47db24bd3c.png)
![\begin{verbatim}
class TPoleRK : TRungeKutta
{
double a, b;
public TPoleRK(double a, double b) : base(2)
{
this.a = a;
this.b = b;
}
public override void F(double t, double[] Y,
ref double[] FY)
{
FY[0] = Y[1];
FY[1] = a * (1 - b * Y[0] * Y[0]) * Y[1] - Y[0];
}
}
\end{verbatim}](/sites/default/files/tex_cache/4fe82733497b82610b85b684f896f5db.png)
Теперь проведем вычислительный эксперимент.
![\begin{verbatim}
TPole Pole = new TPole(1, 0.05, 0.01);
StreamWriter F = File.CreateText("pole.txt");
while (Pole.Get_t() <= 100)
{
Console.WriteLine("{0}\t{1}\t{2}",
Pole.Get_t(), Pole.Get_x1(), Pole.Get_x2());
F.WriteLine("{0}\t{1}\t{2}",
Pole.Get_t(), Pole.Get_x1(), Pole.Get_x2());
Pole.Next();
}
F.Close();
\end{verbatim}](/sites/default/files/tex_cache/bc6cbaf81ed6772b9652491a209a8598.png)
В результате мы получим фазовый портрет, который представлен на рисунке 19.2. Мы видим, что наша динамическая система имеет так называемый предельный цикл.
Ключевые термины
Абстрактно заданная динамическая система - динамическая система на множестве, заданная с помощью полугруппы преобразований этого множества.
Конечный автомат - абстрактный автомат, моделирующий конечную динамическую систему.
Динамическая система - математическая модель системы, процессы в которой развиваются во времени.
Фазовые координаты - элементы фазового пространства, характеризующие состояние системы.
Краткие итоги: Дано общее определение динамической системы. Реализованы классы для моделирования динамических систем и проведены вычислительные эксперименты. Промоделировано отображение Хенона и нелинейный осциллятор Ван-дер-Поля.