Опубликован: 18.05.2011 | Доступ: свободный | Студентов: 965 / 104 | Оценка: 4.40 / 4.20 | Длительность: 12:30:00
Лекция 20:

Общие динамические системы

< Лекция 19 || Лекция 20: 1234 || Лекция 21 >

Мы ввели фиктивный класс TT смысл, которого только в том, чтобы быть родителем для классов TR и TN - соответственно для непрерывной и дискретной динамических систем. Мы также сразу создали два наследника класса TDS для различного типа динамических систем.

В качестве первого примера динамической системы мы рассмотрим отображение Хенона. Фазовым множеством здесь является множество \Bbb{R}^2, время дискретное, а отображение задается формулой

p(x,n)=T^nx,
где отображение T определено по формуле
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),
где a>0, 0<b<1. В этой динамической системе возникает, так называемый, странный аттрактор. Движение этой динамической системы носит хаотичный характер. Реализуем и посмотрим на численные результаты.

\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}
\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}

Запустим наш класс для расчета первых 10^3 точек, и на рисунке 19.1 приведем фазовый портрет.

Множество Хенона

Рис. 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}

В качестве примера непрерывной динамической системы мы рассмотрим нелинейный осциллятор Ван-дер-Поля. Фазовое пространство этой динамической системы также двумерная плоскость: {\cal A}=\Bbb{R}^2, время непрерывное, а полугруппа преобразования задается решением задачи Коши для следующего нелинейного дифференциального уравнения второго порядка.

y''(t)-a(1-by^2(t))y'(t)+y(t)=0.
Здесь a,b\in{\rm R} --- параметры системы. Параметр a>0 называется параметром возбуждения.

Реализуем соответствующий класс на 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}
\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}
\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}

Теперь проведем вычислительный эксперимент.

\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}

В результате мы получим фазовый портрет, который представлен на рисунке 19.2. Мы видим, что наша динамическая система имеет так называемый предельный цикл.


Рис. 19.2.

Ключевые термины

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

Конечный автомат - абстрактный автомат, моделирующий конечную динамическую систему.

Динамическая система - математическая модель системы, процессы в которой развиваются во времени.

Фазовые координаты - элементы фазового пространства, характеризующие состояние системы.

Краткие итоги: Дано общее определение динамической системы. Реализованы классы для моделирования динамических систем и проведены вычислительные эксперименты. Промоделировано отображение Хенона и нелинейный осциллятор Ван-дер-Поля.

< Лекция 19 || Лекция 20: 1234 || Лекция 21 >