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

Объектно-ориентированный подход к реализации линейных операторов

< Лекция 10 || Лекция 11 || Лекция 12 >
Аннотация: Рассмотрены линейные операторы в функциональных пространствах. Приведены примеры линейных неограниченных операторов. Даны их конструктивные реализации в гильбертовых пространствах в виде классов на языке C#.

Цель лекции: Показать как работать с неограниченными линейными операторами в бесконечномерных пространствах.

В функциональном анализе большое значения играют линейные операторы. Пусть \Bbb{X} и \Bbb{Y} - линейные пространства, D\subset\Bbb{X} - линейное подпространство. Линейным оператором A:\Bbb{X}\to\Bbb{Y} называется такое отображение, что для любых x,y\in{\cal D} и \lambda\in\Bbb{C} верно

A(\lambda x+y)=\lambda Ax+Ay.
Множество {\cal D} называется областью определения оператора A, и мы часто будем обозначать {\cal D}(A).

Если пространства \Bbb{X} и \Bbb{Y} банаховы пространства, то можно рассматривать непрерывные операторы. Оператор A называется непрерывным, если {\cal D}(A)=\Bbb{X} и для любой сходящейся в \Bbb{X} последовательности x_n имеет место

\lim\limits_{n\to\infty}Ax_n=A\lim\limits_{n\to\infty}x_n.
Для любого ограниченного оператора можно ввести конечную норму этого оператора по формуле
\|A\|=\sup\limits_{x\in\Bbb{X},x\ne0}\frac{\|Ax\|_\Bbb{Y}}{\|x\|_\Bbb{X}}=
\sup\limits_{x\in\Bbb{X},\|x\|_\Bbb{X}\le1}\|Ax\|_\Bbb{Y}.
Соответственно, любой линейный непрерывный оператор является ограниченным (верно и обратное).

В конечномерном случае, когда \Bbb{X}=\Bbb{R}^n, \Bbb{Y}=\Bbb{R}^n линейные операторы являются матрицами n\times n. Примером неограниченного оператора является оператор дифференцирования. Пусть \Bbb{X}=\Bbb{Y}=C[a,b], множество D состоит из непрерывных на [a,b] функций, имеющих непрерывную производную, тогда оператор

A[f]=\frac{df}{dx}
является линейным оператором.

Мы будем рассматривать линейные операторы в бесконечномерных гильбертовых пространствах. Пусть \Bbb{H} - такое гильбертово пространство, что существует бесконечная последовательность линейно независимых элементов e_k\in\Bbb{H} таких, что

(e_k,e_l)_\Bbb{H}=0,\quad k\ne l
и
(e_k,e_k)_\Bbb{H}=1.
Также будем предполагать, что любой элемент пространства \Bbb{H} однозначно представляется рядом
u=\sum\limits_{k=1}^\infty u_ke_k,
где ряд сходится по метрике пространства \Bbb{H}. Элементы \{e_k\} называются ортонормированным базисом, а сам ряд - абстрактными рядом Фурье. Числа u_k называются коэффициентами Фурье, и для них имеет место следующая формула
u_k=(u,e_k)_\Bbb{H}.
Имеет место следующее равенство, называемое равенство Парсеваля
\|u\|_\Bbb{H}=\left(\sum\limits_{k=1}^\infty|u_k|^2\right)^{1/2}.

Таким образом, чтобы задать любой элемент пространства \Bbb{H} достаточно задать последовательность коэффициентов Фурье, т.е. таких чисел, что

\sum\limits_{k=1}^\infty|u_k|^2<\infty.

Иногда удобно рассматривать ряды, где k=0,1,\cdots или k=0,\pm1,\pm2,\cdots. Для этих случаев все аналогично.

Любой оператор в гильбертовом пространстве можно задать как преобразование последовательности коэффициентов Фурье. Для линейного оператора это преобразование должно быть линейным.

Большой интерес представляют такие линейные операторы, которые можно представить последовательностью чисел (вообще говоря, комплексных) \alpha_k, а действие этого оператора на элемент следующим образом. Для любого

u=\sum\limits_{k=1}^\infty u_ke_k
имеем
A[u]=\sum\limits_{k=1}^\infty \alpha_ku_ke_k.
Если имеет место оценка |\alpha_k|\le M, то такой оператор будет ограниченным (и непрерывным). Такие операторы мы будем называть диагональными.

Классическим примером гильбертова пространства является пространство L_2(0,2\pi) - измеримых на [0,2\pi] функций и имеющих интегрируемый по Лебегу квадрат модуля на [0,2\pi]. Скалярное произведение задается формулой

(f,g)_{L_2(0,2\pi)}=\int\limits_0^{2\pi}f(x)\overline{g(x)}dx.
Базис в этом пространстве можно задать с помощью следующих функций
e_k=\frac{1}{\sqrt{2\pi}}e^{ikx},\quad k=0,\pm1,\pm2,\cdots.
Зададим в это пространстве линейный оператор с помощью последовательности \alpha_k=ik, тогда этот оператор будет оператором дифференцирования. Как мы видим, этот оператор не будет ограниченным и будет определен не на всех функциях, а только на тех функциях, на которых будет сходится ряд
\sum\limits_{k=0}^\infty|\alpha_ku_k|^2<\infty.
С помощью разложения по базису достаточно легко можно вычислять действие оператора. Разумеется, что такое разложение оператора зависит от выбора базиса, который можно выбирать многими способами.

Обратимся к вопросу об объектно-ориентированнной реализации элементов гильбертовых пространств и линейных диагональных операторов.

\begin{verbatim}
    abstract class THElement
    {
        abstract public double a(int k);
    }

    abstract class THOperator
    {
        THElement u;
        public THOperator(THElement u)
        {
            this.u = u;
        }

        abstract protected double alpha(int k);

        public double a(int k)
        {
            return alpha(k) * u.a(k);
        }
    }
\end{verbatim}
Здесь мы описали два абстрактных класса. Первый THElement предназначен для описания коэффициентов Фурье элементов гильбертовых пространств, а второй класс THOperator описывает диагональный оператор.

Рассмотрим пространство L_2(0,\pi) в котором выберем следующий базис

e_k=\sqrt{\frac{2}{\pi}}\sin kx,\quad k=1,2,\cdots.
Рассмотрим функцию
f(x)=x(\pi-x).
В разложении по нашему базису эта функция имеет следующий вид
f(x)=\sum\limits_{k=1}^\infty
-\frac{4}{\pi}\frac{(-1)^k-1}{k^3}\sin kx.
Здесь коэффициенты Фурье имеют вид
f_k=-2\sqrt{\frac{2}{\pi}}\frac{(-1)^k-1}{k^3}.
Введем в нашем пространстве диагональный оператор D^2 со следующими числами \alpha_k
\alpha_k=-k^2.
Для вычисления D^2[f] нам даже не потребуется компьютер, можно сразу записать
g(x)={\cal D}^2[f](x)=\sum\limits_{k=1}^\infty
\frac{4}{\pi}\frac{(-1)^{k+1}-1}{k}\sin kx.
Поскольку мы имеем сходящийся ряд
\frac{4}{\pi}\sum\limits_{k=1}^\infty\frac{1}{k^2}<\infty,
то можно утверждать, что функция f(x)=x(\pi-x) принадлежит области определения оператора {\cal D}^2. А теперь заметим, что разложение функции h=-2 по нашему базису имеет вид
-2=\sum\limits_{k=1}^\infty
\frac{4}{\pi}\frac{(-1)^{k+1}-1}{k}\sin kx.
Поэтому мы получаем, что
{\cal D}^2f(x)=-2,
Функция -2 является второй производной по переменной x от функции f(x). И это не совпадение - наш оператор {\cal D}^2, действительно, является оператором дважды дифференцирования. В этом несложно убедиться, если заметить, что
{\cal D}^2\sin kx=-k^2\sin kx.
Однако не каждая дважды дифференцируемая функция принадлежит области определения нашего оператора. Например функция f(x)=1 имеет разложение по базису в нашем пространстве
1=\sum\limits_{k=1}^\infty-\frac{2}{\pi}\frac{1}{k}((-1)^k-1).
Коэффициенты Фурье функции D^2[1] имеют вид
g_k=\sqrt{\frac{2}{\pi}}k((-1)^k-1).
Однако ряд
\sum\limits_{k=1}^\infty\frac{2}{\pi}k^2((-1)^k-1)^2
расходится. Дело в том, что область определения оператора {\cal D}^2 накладывает условия не только на гладкость, но и на краевые условия - необходимо, чтобы функция принимала нулевые значения при x=0 и x=\pi.

Проверим наши теоретические выкладки с помощью компьютерного моделирования на C#. Для этого мы реализуем следующие классы.

\begin{verbatim}
    abstract class TL2Element : THElement
    {
        public double Calc(double x)
        {
            double res = 0;

            for (int k = 1; k <= 1000; k++)
            {
                res += a(k) * Math.Sin((double)k * x);
            }

            res *= Math.Sqrt(2.0 / Math.PI);

            return res;
        }
    }

    class TL2F1 : TL2Element
    {
        public override double a(int k)
        {
            double kx = (double)k;

            if ((k % 2) == 0)
            {
                return 0;
            }
            else
            {
                return -2.0 * Math.Sqrt(2.0 / Math.PI) *
                (-2.0) * (1.0 / (kx * kx * kx));
            }
        }
    }
\end{verbatim}
\begin{verbatim}
    class TL2F2 : TL2Element
    {
        public override double a(int k)
        {
            double kx = (double)k;

            if ((k % 2) == 0)
            {
                return 0;
            }
            else
            {
                return - Math.Sqrt(2.0 / Math.PI) *
                (-2.0) * (1.0 / kx);
            }
        }
    }
\end{verbatim}
\begin{verbatim}
    abstract class TL2Operator : THOperator
    {
        public TL2Operator(THElement u) : base(u) { }

        public double Calc(double x)
        {
            double res = 0;

            for (int k = 1; k <= 1000; k++)
            {
                res += a(k) * Math.Sin((double)k * x);
            }

            res *= Math.Sqrt(2.0 / Math.PI);

            return res;
        }

    }

    class TD2Operator : TL2Operator
    {
        public TD2Operator(THElement u) : base(u) { }

        public override double alpha(int k)
        {
            double kx = (double)k;

            return -(kx * kx);
        }
    }
\end{verbatim}
Теперь попробуем вычислить значения действия оператора в заданной точке.
\begin{verbatim}
    TL2F1 F1 = new TL2F1();
    TL2F2 F2 = new TL2F2();

    TD2Operator D2 = new TD2Operator(F1);
    Console.WriteLine("D2[x(pi-x)](1) = {0}", D2.Calc(1.0));

    D2 = new TD2Operator(F2);
    Console.WriteLine("D2[1](1) = {0}", D2.Calc(1.0));
\end{verbatim}
В итоге получим:
\begin{verbatim}
D2[x(pi-x)](1) = -1.99914825586894
D2[1](1) = 425.069483543905
\end{verbatim}
Как видим, первое значение довольно точно совпадает с точным, а второе значение показывает, что применять оператор {\cal D}^2 к функции f(x)=1 нельзя.

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

Абстрактный ряд Фурье - аналог ряда Фурье в гильбертовом пространстве.

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

Линейный оператор - линейное отображение одного линейного пространства в другое.

Непрерывный оператор - непрерывное отображение одного метрического пространства в другое.

Краткие итоги: Приведена конструкционная реализация линейных неограниченных операторов в гильбертовом пространстве. Реализованы классы операторов, для представления линейных операторов на языке C#.

< Лекция 10 || Лекция 11 || Лекция 12 >