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

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

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

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

Цель занятия

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

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

Рассмотрим динамическую систему, заданную дифференциальным уравнением

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" траектория возвращается к своему предельному циклу, который мы наблюдали в лекции, посвященной осциллятору Ван-дер-Поля.

< Лекция 19 || Лекция 20: 1234 || Лекция 21 >
Олег Корсак
Олег Корсак
Латвия, Рига
Дмитрий Кифель
Дмитрий Кифель
Казахстан, Темиртау