Современные численные методы в объектно-ориентированном изложении на C#

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

Разбить на страницы
Показывать лекцию целиком

Цель лекции: Показать эффективность объктно-ориентированного подхода для моделирования динамических систем. Создать классы на языке C# для моделирования динамических систем с непрерывным и дискретным временем.

Динамической системой называют математическую модель системы, процессы в которой развиваются во времени. Состояние динамической системы характеризуется фазовыми координатами, которые принадлежат фазовому пространству. Время в динамической системе может быть как непрерывным, так и дискретным. Фазовое множество может быть конечным или бесконечным.

Пусть дано непустое множество $${\cal A}$$, которое мы будем называть фазовым пространством, а каждый элемент этого множества $$a\in{\cal A}$$ описывает состояние рассматриваемой системы. Через $${\rm T}$$ мы будем обозначать либо множество $${\rm R}_+=\{t\in\Bbb{R}:t\ge0\}$$, либо множество натуральных чисел $$\Bbb{N}=\{0,1,2,\dots\}$$. Это множество будет играть роль времени. В первом случае мы будем рассматривать непрерывные динамические системы, а во втором - дискретные.

Абстрактно заданной динамической системой называется однопараметрическая полугруппа преобразований множества $${\cal A}$$$$p:{\cal A}\times{\rm T}\to{\cal A},$$ удовлетворяющее следующим условиям:

  • $$p(a,0)=a$$ для любого $$a\in{\cal A}$$,
  • $$p(p(a,t_1),t_2)=p(a,t_1+t_2)$$ для любых $$a\in{\cal A}$$, $$t_1,t_2\in{\rm T}$$.
  • Соответственно, чтобы задать динамическую систему необходимо фиксировать множества $${\cal A}$$, $${\rm T}$$ и задать отображение $$p$$, удовлетворяющее указанным выше условиям. Пусть $${\cal A}=\Bbb{R}^n$$, $${\rm T}={\rm R}_+$$. Рассмотрим систему обыкновенных дифференциальных уравнений $$n$$ -го порядка, которая имеет единственное глобальное решение для всех $$y^0\in\Bbb{R}^n$$. Тогда решение этой системы задает отображение$$y=y(y^0,t):\Bbb{R}^n\times\Bbb{R}_+\to\Bbb{R}^n.$$ Легко видеть, что это отображение удовлетворяет всем условиям непрерывной динамической системы.

    Дискретную динамическую систему можно построить следующим образом. Пусть у нас некоторое множество $${\cal A}$$ и задан оператор$$T:{\cal A}\to{\cal A}.$$ Построим полугруппу отображений $$p(a,n)$$ следующим образом$$p(a,n)=T^na,\ n\in\Bbb{N},$$ где $$T^0$$ есть единичное отображение. Таким образом мы имеем дискретную динамическую систему. Содержательные примеры конечной дискретной динамической системы строятся на основании конечных автоматов.

    Конечным автоматом называется набор $${\Bbb M}=\{\Sigma,Q,q_0,\Phi\}$$, где $$\Sigma$$ - конечное множество (входной/выходной алфавит), $$Q$$ - конечное множество (внутренние состояния), $$q_0\in Q$$ - начальное состояние, $$\Phi$$ - функция переходов$$\Phi:\Sigma\times Q\to\Sigma\times Q.$$ С помощью конечного автомата динамическая система строится следующим образом. Множество $${\cal A}=\Sigma\times Q$$, $${\rm T}=\Bbb{N}$$. Будем обозначать $${\cal A}={\cal A}_\Sigma\times{\cal A}_Q$$. Отображение $$p$$ задается по правилу:$$p(\{\sigma_0,q_0\},0)=\{\sigma_0,q_0\},$$ $$p(\{\sigma_0,q_0\},1)=\{\sigma_1,q_1\},$$ $$p(\{\sigma_1,q_1\},2)=\{\sigma_2,q_2\}$$ и так далее. Важной характерной чертой конечного автомата является то, что задаваемая им динамическая система является периодической, то есть начиная с некоторого номера состояния будут повторятся.

    Приступим к реализации класса на C# для описания абстрактной динамической системы.

    $$\begin{verbatim} class TT { public TT() { } } class TR : TT { public double t; public TR() { t = 0; } } class TN : TT { public int n; public TN() { n = 0; } } abstract class TDS { public object A; public TT T; public TDS(object A) { this.A = A; T = new TT(); } abstract public void Next(); } \end{verbatim}$$ $$\begin{verbatim} abstract class TRDS : TDS { public TRDS(object A) : base(A) { T = new TR(); } public double Get_t() { return ((TR)T).t; } protected void Set_t(double t) { ((TR)T).t = t; } public void Inc(double dt) { Set_t(Get_t() + dt); } } \end{verbatim}$$ $$\begin{verbatim} abstract class TNDS : TDS { public TNDS(object A) : base(A) { T = new TN(); } public int Get_n() { return ((TN)T).n; } protected void Set_n(int n) { ((TN)T).n = n; } public void Inc() { Set_n(Get_n() + 1); } } \end{verbatim}$$

    Мы ввели фиктивный класс $$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)

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

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

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

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

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

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

    Практическое занятие "Управляемые динамические системы"

    Цель занятия

    Провести вычислительные эксперименты с управляемыми динамическими системами, заданными дифференциальными уравнениями.

    Практическая задача

    Рассмотрим динамическую систему, заданную дифференциальным уравнением$$y''(t)+\sin(y(t))=u(t).$$ Мы будем управлять решениями этого уравнения с помощью правой части - функции $$u(t)$$. Мы будем рассматривать эту задачу с нулевыми начальными условиями. При этом решение $$y(t)=0$$ удовлетворяет однородному уравнению.

    Сначала посмотрим на решение этого уравнения, когда управление $$u(t)$$ является постоянным и имеет вид$$u(t)=1,\quad t\in[0,10].$$ Для проведения вычислительных опытом мы будем использовать следующий класс.

    $$\begin{verbatim} class TTest1RK : TRungeKutta { public TTest1RK() : base(2) { } public override void F(double t, double[] Y, ref double[] FY) { FY[0] = Y[1]; FY[1] = -Math.Sin(Y[0]) + 1; } } \end{verbatim}$$

    Работать с этим классом мы будем следующим образом.

    $$\begin{verbatim} double h = 0.01; double[] Y0 = { 0, 1.0 }; TTest1RK Test1RK = new TTest1RK(); Test1RK.SetInit(0, Y0); StreamWriter F = File.CreateText("test1.txt"); double t, Euler, RK, Sin; while (Test1RK.GetCurrent() < (10 + h / 2.0)) { t = Test1RK.GetCurrent(); RK = Test1RK.Y[0]; F.WriteLine("{0}\t{1}", t, RK); Test1RK.NextStep(h); } F.Close(); \end{verbatim}$$

    Мы видим, что в данном случае решение монотонно и довольно быстро возрастает с ростом времени.

    Теперь в качестве управления возьмем функцию$$u(t)=\sin 5t.$$ Мы видим, что в этом случае решение также совершает колебания, похожие на гармонические колебания.

    Теперь в качестве уравнения мы возьмем уравнение описывающее осцилятор Ван-дер-Поля$$y''(t)-a(1-by^2(t))y'(t)+y(t)=u(t).$$ Приведем класс, с помощью которого будем моделировать эту динамическую систему.

    $$\begin{verbatim} class TTestPoleRK : TRungeKutta { double a, b; public TTestPoleRK(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] + 0.01; } } \end{verbatim}$$

    Использование в качестве управления постоянной дает нам решение, которое совершает колебания со все увеличивающейся амплитудой.

    Теперь в качестве управляющей функции мы возьмем кратковременно действующий импульс$$u(t)=\left\{% \begin{array}{ll} 100, t\le10; \\ 0, t>10. \\ \end{array}% \right.$$ Мы видим, что во время действия нашего управления - траектория резко отклоняется, однако после отключения управления при "t>10" траектория возвращается к своему предельному циклу, который мы наблюдали в лекции, посвященной осциллятору Ван-дер-Поля.

    Лабораторная работа "Управляемые динамические системы"

    Цель занятия

    Провести вычислительные эксперименты с управляемыми динамическими системами, заданными дифференциальными уравнениями.

    Сценарий лабораторной работы

  • Рассмотреть систему дифференциальных уравнений "хищник-жертва". Эти уравнения выглядят следующим образом.$$x'(t)=(a-by(t))x(t),$$ $$y'(t)=(-c+dx(t))y(t),$$ где коэффициенты $$a,b,c,d$$ описывают взаимодействие между видами.
  • Проведите вычислительные опыты по управлению решениями этой системы. В качестве управления взять различные коэффициенты системы.
  • Выяснить значение коэффициентов в рассматриваемой системе "хищник-жертва".
  • Постройте графики, иллюстрирующие нелинейные эффекты, связанные с этой системой.
  • Указания

    Модель "хищник-жертва" имеет следующее описание. Рассматривается два вида животных, где первое животное является хищником относительно второго животного, являющегося жертвой. Функция $$x(t)$$ описывает количество хищников, а функция $$y(t)$$ описывает количество жертв.

    Эта система имеет равновесное состояние, когда число хищников и жертв. Отклонение от этого состояния приводит к периодическим колебаниям. Однако эта система может демонстрировать весьма сложное поведение.

    Страницы:

    Цель лекции: Показать эффективность объктно-ориентированного подхода для моделирования динамических систем. Создать классы на языке C# для моделирования динамических систем с непрерывным и дискретным временем.

    Динамической системой называют математическую модель системы, процессы в которой развиваются во времени. Состояние динамической системы характеризуется фазовыми координатами, которые принадлежат фазовому пространству. Время в динамической системе может быть как непрерывным, так и дискретным. Фазовое множество может быть конечным или бесконечным.

    Пусть дано непустое множество $${\cal A}$$, которое мы будем называть фазовым пространством, а каждый элемент этого множества $$a\in{\cal A}$$ описывает состояние рассматриваемой системы. Через $${\rm T}$$ мы будем обозначать либо множество $${\rm R}_+=\{t\in\Bbb{R}:t\ge0\}$$, либо множество натуральных чисел $$\Bbb{N}=\{0,1,2,\dots\}$$. Это множество будет играть роль времени. В первом случае мы будем рассматривать непрерывные динамические системы, а во втором - дискретные.

    Абстрактно заданной динамической системой называется однопараметрическая полугруппа преобразований множества $${\cal A}$$$$p:{\cal A}\times{\rm T}\to{\cal A},$$ удовлетворяющее следующим условиям:

  • $$p(a,0)=a$$ для любого $$a\in{\cal A}$$,
  • $$p(p(a,t_1),t_2)=p(a,t_1+t_2)$$ для любых $$a\in{\cal A}$$, $$t_1,t_2\in{\rm T}$$.
  • Соответственно, чтобы задать динамическую систему необходимо фиксировать множества $${\cal A}$$, $${\rm T}$$ и задать отображение $$p$$, удовлетворяющее указанным выше условиям. Пусть $${\cal A}=\Bbb{R}^n$$, $${\rm T}={\rm R}_+$$. Рассмотрим систему обыкновенных дифференциальных уравнений $$n$$ -го порядка, которая имеет единственное глобальное решение для всех $$y^0\in\Bbb{R}^n$$. Тогда решение этой системы задает отображение$$y=y(y^0,t):\Bbb{R}^n\times\Bbb{R}_+\to\Bbb{R}^n.$$ Легко видеть, что это отображение удовлетворяет всем условиям непрерывной динамической системы.

    Дискретную динамическую систему можно построить следующим образом. Пусть у нас некоторое множество $${\cal A}$$ и задан оператор$$T:{\cal A}\to{\cal A}.$$ Построим полугруппу отображений $$p(a,n)$$ следующим образом$$p(a,n)=T^na,\ n\in\Bbb{N},$$ где $$T^0$$ есть единичное отображение. Таким образом мы имеем дискретную динамическую систему. Содержательные примеры конечной дискретной динамической системы строятся на основании конечных автоматов.

    Конечным автоматом называется набор $${\Bbb M}=\{\Sigma,Q,q_0,\Phi\}$$, где $$\Sigma$$ - конечное множество (входной/выходной алфавит), $$Q$$ - конечное множество (внутренние состояния), $$q_0\in Q$$ - начальное состояние, $$\Phi$$ - функция переходов$$\Phi:\Sigma\times Q\to\Sigma\times Q.$$ С помощью конечного автомата динамическая система строится следующим образом. Множество $${\cal A}=\Sigma\times Q$$, $${\rm T}=\Bbb{N}$$. Будем обозначать $${\cal A}={\cal A}_\Sigma\times{\cal A}_Q$$. Отображение $$p$$ задается по правилу:$$p(\{\sigma_0,q_0\},0)=\{\sigma_0,q_0\},$$ $$p(\{\sigma_0,q_0\},1)=\{\sigma_1,q_1\},$$ $$p(\{\sigma_1,q_1\},2)=\{\sigma_2,q_2\}$$ и так далее. Важной характерной чертой конечного автомата является то, что задаваемая им динамическая система является периодической, то есть начиная с некоторого номера состояния будут повторятся.

    Приступим к реализации класса на C# для описания абстрактной динамической системы.

    $$\begin{verbatim} class TT { public TT() { } } class TR : TT { public double t; public TR() { t = 0; } } class TN : TT { public int n; public TN() { n = 0; } } abstract class TDS { public object A; public TT T; public TDS(object A) { this.A = A; T = new TT(); } abstract public void Next(); } \end{verbatim}$$ $$\begin{verbatim} abstract class TRDS : TDS { public TRDS(object A) : base(A) { T = new TR(); } public double Get_t() { return ((TR)T).t; } protected void Set_t(double t) { ((TR)T).t = t; } public void Inc(double dt) { Set_t(Get_t() + dt); } } \end{verbatim}$$ $$\begin{verbatim} abstract class TNDS : TDS { public TNDS(object A) : base(A) { T = new TN(); } public int Get_n() { return ((TN)T).n; } protected void Set_n(int n) { ((TN)T).n = n; } public void Inc() { Set_n(Get_n() + 1); } } \end{verbatim}$$

    Мы ввели фиктивный класс $$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)

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

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

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

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

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

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

    Практическое занятие "Управляемые динамические системы"

    Цель занятия

    Провести вычислительные эксперименты с управляемыми динамическими системами, заданными дифференциальными уравнениями.

    Практическая задача

    Рассмотрим динамическую систему, заданную дифференциальным уравнением$$y''(t)+\sin(y(t))=u(t).$$ Мы будем управлять решениями этого уравнения с помощью правой части - функции $$u(t)$$. Мы будем рассматривать эту задачу с нулевыми начальными условиями. При этом решение $$y(t)=0$$ удовлетворяет однородному уравнению.

    Сначала посмотрим на решение этого уравнения, когда управление $$u(t)$$ является постоянным и имеет вид$$u(t)=1,\quad t\in[0,10].$$ Для проведения вычислительных опытом мы будем использовать следующий класс.

    $$\begin{verbatim} class TTest1RK : TRungeKutta { public TTest1RK() : base(2) { } public override void F(double t, double[] Y, ref double[] FY) { FY[0] = Y[1]; FY[1] = -Math.Sin(Y[0]) + 1; } } \end{verbatim}$$

    Работать с этим классом мы будем следующим образом.

    $$\begin{verbatim} double h = 0.01; double[] Y0 = { 0, 1.0 }; TTest1RK Test1RK = new TTest1RK(); Test1RK.SetInit(0, Y0); StreamWriter F = File.CreateText("test1.txt"); double t, Euler, RK, Sin; while (Test1RK.GetCurrent() < (10 + h / 2.0)) { t = Test1RK.GetCurrent(); RK = Test1RK.Y[0]; F.WriteLine("{0}\t{1}", t, RK); Test1RK.NextStep(h); } F.Close(); \end{verbatim}$$

    Мы видим, что в данном случае решение монотонно и довольно быстро возрастает с ростом времени.

    Теперь в качестве управления возьмем функцию$$u(t)=\sin 5t.$$ Мы видим, что в этом случае решение также совершает колебания, похожие на гармонические колебания.

    Теперь в качестве уравнения мы возьмем уравнение описывающее осцилятор Ван-дер-Поля$$y''(t)-a(1-by^2(t))y'(t)+y(t)=u(t).$$ Приведем класс, с помощью которого будем моделировать эту динамическую систему.

    $$\begin{verbatim} class TTestPoleRK : TRungeKutta { double a, b; public TTestPoleRK(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] + 0.01; } } \end{verbatim}$$

    Использование в качестве управления постоянной дает нам решение, которое совершает колебания со все увеличивающейся амплитудой.

    Теперь в качестве управляющей функции мы возьмем кратковременно действующий импульс$$u(t)=\left\{% \begin{array}{ll} 100, t\le10; \\ 0, t>10. \\ \end{array}% \right.$$ Мы видим, что во время действия нашего управления - траектория резко отклоняется, однако после отключения управления при "t>10" траектория возвращается к своему предельному циклу, который мы наблюдали в лекции, посвященной осциллятору Ван-дер-Поля.

    Лабораторная работа "Управляемые динамические системы"

    Цель занятия

    Провести вычислительные эксперименты с управляемыми динамическими системами, заданными дифференциальными уравнениями.

    Сценарий лабораторной работы

  • Рассмотреть систему дифференциальных уравнений "хищник-жертва". Эти уравнения выглядят следующим образом.$$x'(t)=(a-by(t))x(t),$$ $$y'(t)=(-c+dx(t))y(t),$$ где коэффициенты $$a,b,c,d$$ описывают взаимодействие между видами.
  • Проведите вычислительные опыты по управлению решениями этой системы. В качестве управления взять различные коэффициенты системы.
  • Выяснить значение коэффициентов в рассматриваемой системе "хищник-жертва".
  • Постройте графики, иллюстрирующие нелинейные эффекты, связанные с этой системой.
  • Указания

    Модель "хищник-жертва" имеет следующее описание. Рассматривается два вида животных, где первое животное является хищником относительно второго животного, являющегося жертвой. Функция $$x(t)$$ описывает количество хищников, а функция $$y(t)$$ описывает количество жертв.

    Эта система имеет равновесное состояние, когда число хищников и жертв. Отклонение от этого состояния приводит к периодическим колебаниям. Однако эта система может демонстрировать весьма сложное поведение.

    Вернуться к учебному плану