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

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

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

Посмотрим как на C# выглядят нормированные (банаховы) пространства.

\begin{verbatim}
abstract class TNormSpace
{
    public abstract double norm(object x);
}

class TCNormSpace : TNormSpace
{
    public override double norm(object x)
    {
        double res = 0;

        TRFunc F = (TRFunc)x;

        double t = 0;

        // задаем шаг для расчета max
        double dt = (F.Get_b() - F.Get_a()) / 1000;

        while (t < F.Get_b())
        {
            if (Math.Abs(F.CalcY(t)) > res)
            {
                res = Math.Abs(F.CalcY(t));
            }

            t += dt;
        }

        return res;
    }
}
\end{verbatim}
Мы реализовали абстрактное нормированное пространство TNormSpace, а потом реализуем класс-наследник для пространства C[a,b]. Чтобы вычислить нормы некоторых функций реализуем эти функции.
\begin{verbatim}
    class TXSinFunc : TRFunc
    {
        public TXSinFunc(double a, double b) : base(a, b) { }
        protected override TElement CalcVal(double x)
        {
            TElement res = new TElement(x * Math.Sin(x));
            return res;
        }

    }

    class TXXFunc : TRFunc
    {
        public TXXFunc(double a, double b) : base(a, b) { }
        protected override TElement CalcVal(double x)
        {
            TElement res = new TElement(x * (1 - x));
            return res;
        }

    }
\end{verbatim}
Теперь посчитаем нормы этих функций.
\begin{verbatim}
    TXSinFunc XSin = new TXSinFunc(0, 2.0 * Math.PI);

    TXXFunc XX = new TXXFunc(0, 1);

    TCNormSpace C = new TCNormSpace();

    Console.WriteLine("||x*sin(x)||={0}", C.norm(XSin));
    Console.WriteLine("||x*(1-x)||={0}", C.norm(XX));
\end{verbatim}
После запуска мы увидим
\begin{verbatim}
||x*sin(x)||=4.81446969901559

||x*(1-x)||=0.25
\end{verbatim}

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

\begin{verbatim}
    class TSubFunc : TRFunc
    {
        TRFunc X, Y;
        public TSubFunc(TRFunc X, TRFunc Y)
        : base(X.Get_a(), X.Get_b())
        {
            this.X = X;
            this.Y = Y;
        }

        protected override TElement CalcVal(double x)
        {
            throw new NotImplementedException();
        }

        public override double CalcY(double x)
        {
            return X.CalcY(x) - Y.CalcY(x);
        }
    }
\end{verbatim}
Теперь вычислим расстояние между функциями \sin(x) и \cos(x) в пространстве C[a,b]
\begin{verbatim}
TCNormSpace C = new TCNormSpace();

TSinFunc Sin = new TSinFunc(0, 2.0 * Math.PI);
TCosFunc cos = new TCosFunc(0, 2.0 * Math.PI);

TSubFunc SinCos = new TSubFunc(Sin, cos);

Console.WriteLine("||sin(x) - cos(x)||={0}", C.norm(SinCos));
\end{verbatim}
В результате получим
\begin{verbatim}
||sin(x) - cos(x)||=1.41421356237309
\end{verbatim}
Таким образом мы видим, что расстояние между этими функциями равно \sqrt{2}. И это при том, что норма каждой из функций равна 1!

Однако в некоторых функциональных пространствах можно ввести не только расстояние между функциями, но и угол. Эти пространства называются предгильбертовым. Линейное пространство \Bbb{X} называется предгильбертовым, если в этом пространстве можно ввести скалярное произведение (x,y)_\Bbb{X}, которое должно удовлетворять следующим условиям для любых x,y,z\in\Bbb{X} и \lambda,\mu\in\Bbb{C}

  • (\lambda x+\mu y,z)=\lambda(x,z)+\mu(y,z)
  • (x,y)=\overline{(y,x)}
  • (x,x)\ge 0, причем (x,x)=0 тогда и только тогда, когда x=0

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

\|x\|=(x,x)^{1/2}.
Полное предгильбертово пространство называется гильбертовым.

Конечномерное пространство \Bbb{R}^n является гильбертовым со скалярным произведением

(x,y)_{\Bbb{R}^n}=x_1y_1+\cdots+x_ny_n.
В пространстве L[a,b] также можно ввести скалярное пространство по формуле
(f,g)_{L[a,b]}=\int\limits_a^bf(x)\overline{g(x)}dx.
Однако это пространство не будет полным, и, соответственно, гильбертовым.

Для двух ненулевых элементов вещественного предгильбертова пространства можно ввести понятие угла \varphi. Пусть x\ne0 и y\ne0, тогда углом между этими элементами является величина

\varphi=\arccos\frac{(x,y)}{\|x\|\|y\|}.
Неравенство Коши-Буняковского, верное в любом предгильбертовом пространстве, гарантирует, что \arccos существует. Действительно, согласно этому неравенству
|(x,y)|\le\|x\|\|y\|.
Создадим абстрактный класс для предгильбертовых пространств и реализуем класс для пространства L[a,b].
\begin{verbatim}
    abstract class THSpace
    {
        public abstract double inner(object x, object y);
    }

    class TLSpace : THSpace
    {
        public override double inner(object x, object y)
        {
            double res = 0;

            TRFunc F = (TRFunc)x;
            TRFunc G = (TRFunc)y;

            double t = 0;
            double dt = (F.Get_b() - F.Get_a()) / 10000;

            while (t + dt < F.Get_b())
            {
                res += F.CalcY(t) * G.CalcY(t) * dt;

                t += dt;
            }

            return res;
        }
    }
\end{verbatim}

Теперь вычислим некоторые скалярные произведения.

\begin{verbatim}
TLSpace LSpace = new TLSpace();

Console.WriteLine("(sin x, cos x) = {0}", LSpace.inner(Sin, Cos));
Console.WriteLine("(sin x, sin x) = {0}", LSpace.inner(Sin, Sin));
Console.WriteLine("(x(1-x), sin x) = {0}", LSpace.inner(XX, Sin));
\end{verbatim}
В результате получим:
\begin{verbatim}
(sin x, cos x) = 3.94784157532637E-07

(sin x, sin x) = 3.14159265334141

(x(1-x), sin x) = 0.0779244027546068
\end{verbatim}
А теперь посчитаем углы между этими функциями. Для этого добавим в класс THSpace метод для подсчета угла.
\begin{verbatim}
abstract class THSpace
{
    public abstract double inner(object x, object y);
    public double Angle(object x, object y)
    {
        return Math.Acos(inner(x, y) /
        Math.Sqrt((inner(x, x) * inner(y, y))));
    }
}
\end{verbatim}
Теперь выполним следующий код.
\begin{verbatim}
    Console.WriteLine("Angle(sin x, cos x) = {0}",
    LSpace.Angle(Sin, Cos));
    Console.WriteLine("Angle(sin x, sin x) = {0}",
    LSpace.Angle(Sin, Sin));
    Console.WriteLine("Angle(x(1-x), sin x) = {0}",
    LSpace.Angle(XX, Sin));
\end{verbatim}
И получим следующий результат.
\begin{verbatim}
Angle(sin x, cos x) = 1.57079620111863
Angle(sin x, sin x) = 0
Angle(x(1-x), sin x) = 1.32760476887546
\end{verbatim}
Мы видим, что угол между \sin(x) и \cos(x) равен \frac{\pi}{2}=90^\circ, для таких элементов говорят, что они ортогональны. А угол между \sin(x) и \sin(x) равен нулю, что предсказуемо.

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

Банахово пространство - полное нормированное пространство.

Гильбертово пространство - полное предгильбертово пространство.

Метрика - функция на паре элементов метрического пространства, соответствующий аналог расстояния между элементами.

Метрическое пространство - абстрактное пространство в котором введена метрика.

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

Нормированное пространство - линейное пространство, в котором введена норма.

Предгильбертово пространство - линейное пространство, в котором введено скалярное произведение.

Скалярное произведение - функция на паре элементов предгильбертова пространства, удовлетворяющая аксиомам скалярного произведения.

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

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