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

Эволюционные уравнения в частных производных

< Лекция 17 || Лекция 18: 12345 || Лекция 19 >
Аннотация: Лекция посвящена вопросам построения приближенных методов для эволюционных уравнений в частных производных. Рассматриваются явные методы построения приближенных решений эволюционных уравнений.

Цель лекции: Рассмотреть методы построения приближенных решений для линейных и нелинейных эволюционных уравнений.

В предыдущей лекции мы рассматривали системы обыкновенных дифференциальных уравнений конечной размерности. Однако многие процессы в нашем мире описываются бесконечными системами дифференциальных уравнений. Такие системы иногда называют распределенными системами или уравнениями в частных производных. Решением уравнений в частных производных является функция многих переменных. Простейшими уравнениями в частных производных второго порядка являются следующие уравнения

\Delta u(x)=f(x)\quad\mbox{- уравнение Лапласа}
u_t(t,x)=\Delta u(t,x)+f(t,x)\quad\mbox{- уравнение
теплопроводности}
u_{tt}(t,x)=\Delta u(t,x)+f(t,x)\quad\mbox{- волновое уравнение}
Уравнение Лапласа является примером эллиптического уравнения, уравнение теплопроводности является примером параболического уравнения, а волновое уравнение является примером гиперболического уравнения. С математической точки зрения дифференциальные уравнения в частных производных представляют собой весьма сложную тему, которая имеет принципиальные отличия от обыкновенных дифференциальных уравнений. С вычислительной точки зрения, часто, дифференциальные уравнения в частных производных могут быть аппроксимированы конечномерными уравнениями. Эллиптические уравнения могут быть аппроксимированы системами линейных алгебраических уравнений, а эволюционные уравнения аппроксимируются системами обыкновенных дифференциальных уравнений.

Мы будем рассматривать эволюционные уравнения относительно функций заданных на отрезке [0,T] со значениями в банаховом пространстве, например, в пространстве C[a,b]. Численные методы, которые мы будем рассматривать могут быть одинаково эффективно применены как для линейных, так и для нелинейных уравнений. Рассмотрим математическую постановку начальной задачи. Пусть X есть некоторое банахово пространство. Пусть в этом в этом пространстве задано множество {\cal D}\subset X, на котором определен оператор {\cal A} (линейный или нелинейный).

Будем рассматривать уравнение

u_t(t)={\cal A} u(t),\quad t\in[0,T] ( 16.5)
с начальным условием
u(0)=\varphi. ( 16.6)
Искомой функцией в задаче 16.5-16.6 является функция u\in C^1([0,T];X) такая, что u(t)\in{\cal D} при всех t\in[0,T] и, удовлетворяющая 16.5-16.6. Элемент \varphi\in{\cal D} называется начальным условием, а задача 16.5-16.6 называется абстрактной задачей Коши.

Приведем два характерных примера таких задач. В качестве пространства X мы возьмем пространство непрерывных функций C[0,2\pi] в качестве множества {\cal D} возьмем множество непрерывно дифференцируемых функций на отрезке [0,2\pi] и являющихся 2\pi -периодическими. Будем рассматривать два модельных уравнения. Первое - уравнение линейного переноса

u_t(t,x)=cu_x(t,x), ( 15.7)
где c\neq0 - постоянная, имеющая смысл "скорости" распространения волны. Второе уравнение - уравнение нелинейного переноса
u_t(t,x)=u(t,x)u_x(t,x). ( 15.8)

Опишем построение численной схемы. Мы будем использовать проекционный метод для приближенного решения абстрактной задачи Коши. Этот метод позволяет свести задачу к системе обыкновенных дифференциальных уравнений. Пусть для любого n>0 существует пара отображений

P_N:X\to\Bbb{R}^n,\quad I_N:\Bbb{R}^n\to {\cal D}.
Как правило на эти отображения накладываются условия
P_nI_nx=x,\quad\mbox{для любого\ }x\in\Bbb{R}^n
и
\lim\limits_{n\to\infty}I_NP_Nx=x,\quad\mbox{для любого\ }x\in{\cal D},
где предел понимается в метрике пространства X. Задача 16.5-16.6 заменяется следующей задачей
u^n_t(t)=P_n{\cal A} I_nu^n(t), ( 16.9)
u^n_t(0)=P_n\\varphi. ( 16.10)
Задача 16.9-16.10 представляет собой задачу Коши для системы обыкновенных дифференциальных уравнений n -го порядка. Далее эта система решается стандартными численными методами, например, методом Рунге-Кутта, который мы рассматривали на прошлой лекции. После нахождения решения задачи 16.9-16.10 то есть функции u^n(t), в качестве приближенным решением исходной задачи можно выбрать функцию I_nu^n(t).

Хотя описанный проекционный метод является, как правило, легко реализуемым, но при его использовании необходимо иметь в виду вопросы, связанные с его сходимостью и устойчивостью. Дело в том, что даже для простейших уравнений при использовании проекционного метода следует согласовывать шаг по времени, то есть тот шаг, который используется в численном методе при решении задачи 16.9-16.10, с шагом, который имеет место при построении аппроксимации пространства X.

Для уравнений 16.7 и 16.8 мы будем использовать следующие операторы P_n и I_n

P_nf(x)=\left(%
\begin{array}{c}
  f_1 \\
  f_2 \\
  \vdots \\
  f_n \\
\end{array}%
\right)
где f_i=f((i-1)\frac{2\pi}{n}), i=1,2,\dots,n. Для реализации оператора I_n необходимо использовать подходящую интерполяцию. Мы будем рассматривать кусочно-линейную интерполяцию. Покажем, как таким образом можно определить операцию
P_n\frac{d}{dx}I_nf=g=\left(%
\begin{array}{c}
  g_1 \\
  g_2 \\
  \vdots \\
  g_n \\
\end{array}%
\right)
где
g_i=\frac{f_{i+1}-f_i}{h},\quad i=1,2\dots,n-1,
g_n=\frac{f_{1}-f_n}{h},
где h=\frac{2\pi}{n}.

Реализуем этот метод для линейного уравнения переноса. Для этого мы создадим класс, являющийся наследником от класса TRungeKutta.

\begin{verbatim}
class TCUEvol : TRungeKutta
{
    double c; // скорость волны
    double h;

    public TCUEvol(int N, double c) : base(N)
    {
        this.c = c;
        h = 2.0 * Math.PI / N;
    }

    public override void F(double t, double[] Y, ref double[] FY)
    {
        int i;
        for (i = 0; i < N - 1; i++)
        {
            FY[i] = c * (Y[i + 1] - Y[i]) / h;
        }
        FY[N - 1] = c * (Y[0] - Y[N - 1]) / h;
    }
}
\end{verbatim}

Испытаем наш класс, учитывая, что для начальной функции вида \sin
kx это уравнение имеет точное решение в виде бегущей волны u(t,x)= sin(k(t+x)).

\begin{verbatim}
int N = 1000;
double h = 0.0001;

double[] Y0 = new double[N];

TCUEvol CU = new TCUEvol(N, 1);

double x;
int i;
for (i = 0; i < N; i++)
{
    x = (double)i * (2.0 * Math.PI) / (double)N;
    Y0[i] = Math.Sin(5.0 * x);
}

CU.SetInit(0, Y0);

double t = 0;

while (CU.GetCurrent() < (1.0 + h / 2.0))
{
    t = CU.GetCurrent();

    CU.NextStep(h); // рассчитать на следующем шаге
}

StreamWriter Fout = File.CreateText("cu.txt");

for (i = 0; i < N; i++)
{
    x = (double)i * (2.0 * Math.PI) / (double)N;
    Fout.WriteLine("{0}\t{1}\t{2}\t{3}", x, CU.Y[i],
    Math.Sin(5.0 * (t + x)), Math.Sin(5.0 * (t + x)) - CU.Y[i]);
}

Fout.Close();
\end{verbatim}

Мы решали задачу:

u_t(t,x)=u_x(t,x)
u(0,x)=\sin 5x.
Эта задача с 2\pi -периодическими по переменной x условиями имеет единственное решение
u(t,x)=\sin(5(t+x)),

< Лекция 17 || Лекция 18: 12345 || Лекция 19 >
Рахматулло Турсунов
Рахматулло Турсунов
Таджикистан, Душанбе