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

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

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

Цель лекции: Реализовать важный инструмент современной математики - функциональные пространства. Показать их применимость для реализации вычислительных процедур.

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

Метрическим пространством называется пара $$(\Bbb{X},\varrho)$$, где $$\Bbb{X}$$ некоторое множество произвольной природы, а $$\varrho$$ числовая функция$$\varrho:\Bbb{X}\times\Bbb{X}\to\Bbb{R},$$ удовлетворяющая следующим условиям для любых $$x,y,z\in\Bbb{X}$$:

  • $$\varrho(x,y)\ge0$$
  • $$\varrho(x,y)=0$$ тогда и только тогда, когда $$x=y$$
  • $$\varrho(x,z)\le\varrho(x,y)+\varrho(y,z)$$
  • В этом случае функция $$\varrho$$ называется метрикой или расстоянием.

    Метрика позволяет ввести фундаментальное понятие сходимости в метрическом пространстве. Пусть задано метрическое пространство $$(\Bbb{X},\varrho)$$, которое мы будем обозначать $$\Bbb{X}_\varrho$$ или просто $$\Bbb{X}$$, если это не приводит к недоразумению. Последовательность $$x_n$$ сходиться к элементу $$x_0$$, если для любого $$\varepsilon>0$$ существует такое $$N=N(\varepsilon)$$, что$$\varrho(x_n,x_0)<\varepsilon,$$ для всех $$n>N$$. В этом случае пишут$$x_0=\lim\limits_{n\to\infty}x_n.$$ Последовательность $$x_n$$ называется фундаментальной, если для любого $$\varepsilon >0$$ существует такое $$N=N(\varepsilon)$$, что$$\varrho(x_p,x_q) <\varepsilon,$$ для всех $$p,q>N$$. Если метрическое пространство такое, что любая фундаментальная последовательность имеет предел, то такое пространство называется полным метрическим пространством.

    Приведем некоторые примеры метрических пространств.

    Пространство $$\Bbb{R}^n$$ с евклидовой метрикой$$\varrho(x,y)=|x-y|=\sqrt{(x_1-y_1)^2+\cdots+(x_n-y_n)^2}$$ является полным метрическим пространством.

    Пространство непрерывных на $$[a,b], -\infty<a<b<\infty$$ функций $$C[a,b]$$ является полным метрическим пространством с метрикой$$\varrho(f,g)=\max\limits_{x\in[a,b]}|f(x)-g(x)|.$$ Это пространство в отличии от $$\Bbb{R}^n$$ является бесконечномерным функциональным пространством.

    Во множестве непрерывных на $$[a,b]$$ функций можно ввести другую метрику$$\varrho(f,g)=\int\limits_a^b|f(x)-g(x)|dx.$$ Это метрическое пространство мы обозначим через $$L[a,b]$$. Пространство $$L[a,b]$$ не является полным. Например последовательность $$f_n(x)=x^n$$ является фундаментальной на в $$C[0,1]$$, но не имеет предела в пространстве $$L[0,1]$$.

    Реализуем теперь абстрактное метрическое пространство на C#.$$\begin{verbatim} abstract class TMetricSpace { public abstract double rho(object x, object y); } \end{verbatim}$$ Это класс-заготовка для произвольного метрического пространства. Реализуем метрическое пространство $$\Bbb{R}^n$$. Для этого сначала нам потребуется создать класс, представляющий $$n$$ -мерный вектор.$$\begin{verbatim} class TRn { double[] A; int N = 0; public TRn(int N) { this.N = N; A = new double[N + 1]; } public double this[int index] { get { return A[index]; } set { A[index] = value; } } public int GetN() { return N; } } \end{verbatim}$$ А теперь создадим класс являющийся наследником от $$TMetricSpace$$.$$\begin{verbatim} class TRnMetric : TMetricSpace { public override double rho(object x, object y) { TRn X, Y; X = (TRn)x; Y = (TRn)y; double res = 0; for (int i = 1; i <= X.GetN(); i++) { res += (X[i] - Y[i]) * (X[i] - Y[i]); } return Math.Sqrt(res); } } \end{verbatim}$$

    Проверим "в бою" наши классы. Попробуем вычислить длину диагонали единичного куба.$$\begin{verbatim} TRn A = new TRn(3); TRn B = new TRn(3); A[1] = 0; A[2] = 0; A[3] = 0; B[1] = 1; B[2] = 1; B[3] = 1; TRnMetric M = new TRnMetric(); Console.WriteLine("R = {0}", M.rho(A, B)); \end{verbatim}$$ Запустим и увидим:$$\begin{verbatim} R = 1.73205080756888 \end{verbatim}$$ Длина диагонали единичного куба, как раз, и равна $$R=\sqrt{3}$$.

    Среди метрических пространств есть такие пространства, в которых можно ввести не только расстояние между элементами, но и длину каждого элемента. Эта длина называется нормой. Линейное пространство $$\Bbb{X}$$ называется нормированным, если в нем можно ввести норму для каждого элемента, обозначаемую $$\|x\|_\Bbb{X}$$, удовлетворяющую следующим условиям для всех $$x,y\in\Bbb{X}$$ и $$\lambda\in\Bbb{C}$$

  • $$\|x\|\ge0$$
  • $$\|x\|=0$$ тогда и только тогда, когда $$x=0$$
  • $$\|\lambda x\|=|\lambda|\|x\|$$
  • $$\|x+y\|\le\|x\|+\|y\|$$
  • Сразу заметим, что любая норма порождает в нормированном пространстве метрику по формуле$$\varrho(x,y)=\|x-y\|.$$ Нормированное пространство, являющаяся полным, называется банаховым пространством. Рассмотренные ранее примеры метрических пространств являются также и нормированными пространствам:$$\|x\|_{\Bbb{R}^n}=\sqrt{x_1^2+\cdots+x_n^2},$$ $$\|f\|_{C[a,b]}=\max\limits_{x\in[a,b]}|f(x)|,$$ $$\|f\|_{L[a,b]}=\left(\int\limits_a^b|f(x)|^2dx\right)^{1/2}.$$ Соответственно пространства $$\Bbb{R}^n$$ и $$C[a,b]$$ являются банаховыми пространствами, а пространство $$L[a,b]$$ только нормированным.

    Посмотрим как на 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)$$ равен нулю, что предсказуемо.

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

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

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

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

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

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

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

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

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

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

    Страницы:

    Цель лекции: Реализовать важный инструмент современной математики - функциональные пространства. Показать их применимость для реализации вычислительных процедур.

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

    Метрическим пространством называется пара $$(\Bbb{X},\varrho)$$, где $$\Bbb{X}$$ некоторое множество произвольной природы, а $$\varrho$$ числовая функция$$\varrho:\Bbb{X}\times\Bbb{X}\to\Bbb{R},$$ удовлетворяющая следующим условиям для любых $$x,y,z\in\Bbb{X}$$:

  • $$\varrho(x,y)\ge0$$
  • $$\varrho(x,y)=0$$ тогда и только тогда, когда $$x=y$$
  • $$\varrho(x,z)\le\varrho(x,y)+\varrho(y,z)$$
  • В этом случае функция $$\varrho$$ называется метрикой или расстоянием.

    Метрика позволяет ввести фундаментальное понятие сходимости в метрическом пространстве. Пусть задано метрическое пространство $$(\Bbb{X},\varrho)$$, которое мы будем обозначать $$\Bbb{X}_\varrho$$ или просто $$\Bbb{X}$$, если это не приводит к недоразумению. Последовательность $$x_n$$ сходиться к элементу $$x_0$$, если для любого $$\varepsilon>0$$ существует такое $$N=N(\varepsilon)$$, что$$\varrho(x_n,x_0)<\varepsilon,$$ для всех $$n>N$$. В этом случае пишут$$x_0=\lim\limits_{n\to\infty}x_n.$$ Последовательность $$x_n$$ называется фундаментальной, если для любого $$\varepsilon >0$$ существует такое $$N=N(\varepsilon)$$, что$$\varrho(x_p,x_q) <\varepsilon,$$ для всех $$p,q>N$$. Если метрическое пространство такое, что любая фундаментальная последовательность имеет предел, то такое пространство называется полным метрическим пространством.

    Приведем некоторые примеры метрических пространств.

    Пространство $$\Bbb{R}^n$$ с евклидовой метрикой$$\varrho(x,y)=|x-y|=\sqrt{(x_1-y_1)^2+\cdots+(x_n-y_n)^2}$$ является полным метрическим пространством.

    Пространство непрерывных на $$[a,b], -\infty<a<b<\infty$$ функций $$C[a,b]$$ является полным метрическим пространством с метрикой$$\varrho(f,g)=\max\limits_{x\in[a,b]}|f(x)-g(x)|.$$ Это пространство в отличии от $$\Bbb{R}^n$$ является бесконечномерным функциональным пространством.

    Во множестве непрерывных на $$[a,b]$$ функций можно ввести другую метрику$$\varrho(f,g)=\int\limits_a^b|f(x)-g(x)|dx.$$ Это метрическое пространство мы обозначим через $$L[a,b]$$. Пространство $$L[a,b]$$ не является полным. Например последовательность $$f_n(x)=x^n$$ является фундаментальной на в $$C[0,1]$$, но не имеет предела в пространстве $$L[0,1]$$.

    Реализуем теперь абстрактное метрическое пространство на C#.$$\begin{verbatim} abstract class TMetricSpace { public abstract double rho(object x, object y); } \end{verbatim}$$ Это класс-заготовка для произвольного метрического пространства. Реализуем метрическое пространство $$\Bbb{R}^n$$. Для этого сначала нам потребуется создать класс, представляющий $$n$$ -мерный вектор.$$\begin{verbatim} class TRn { double[] A; int N = 0; public TRn(int N) { this.N = N; A = new double[N + 1]; } public double this[int index] { get { return A[index]; } set { A[index] = value; } } public int GetN() { return N; } } \end{verbatim}$$ А теперь создадим класс являющийся наследником от $$TMetricSpace$$.$$\begin{verbatim} class TRnMetric : TMetricSpace { public override double rho(object x, object y) { TRn X, Y; X = (TRn)x; Y = (TRn)y; double res = 0; for (int i = 1; i <= X.GetN(); i++) { res += (X[i] - Y[i]) * (X[i] - Y[i]); } return Math.Sqrt(res); } } \end{verbatim}$$

    Проверим "в бою" наши классы. Попробуем вычислить длину диагонали единичного куба.$$\begin{verbatim} TRn A = new TRn(3); TRn B = new TRn(3); A[1] = 0; A[2] = 0; A[3] = 0; B[1] = 1; B[2] = 1; B[3] = 1; TRnMetric M = new TRnMetric(); Console.WriteLine("R = {0}", M.rho(A, B)); \end{verbatim}$$ Запустим и увидим:$$\begin{verbatim} R = 1.73205080756888 \end{verbatim}$$ Длина диагонали единичного куба, как раз, и равна $$R=\sqrt{3}$$.

    Среди метрических пространств есть такие пространства, в которых можно ввести не только расстояние между элементами, но и длину каждого элемента. Эта длина называется нормой. Линейное пространство $$\Bbb{X}$$ называется нормированным, если в нем можно ввести норму для каждого элемента, обозначаемую $$\|x\|_\Bbb{X}$$, удовлетворяющую следующим условиям для всех $$x,y\in\Bbb{X}$$ и $$\lambda\in\Bbb{C}$$

  • $$\|x\|\ge0$$
  • $$\|x\|=0$$ тогда и только тогда, когда $$x=0$$
  • $$\|\lambda x\|=|\lambda|\|x\|$$
  • $$\|x+y\|\le\|x\|+\|y\|$$
  • Сразу заметим, что любая норма порождает в нормированном пространстве метрику по формуле$$\varrho(x,y)=\|x-y\|.$$ Нормированное пространство, являющаяся полным, называется банаховым пространством. Рассмотренные ранее примеры метрических пространств являются также и нормированными пространствам:$$\|x\|_{\Bbb{R}^n}=\sqrt{x_1^2+\cdots+x_n^2},$$ $$\|f\|_{C[a,b]}=\max\limits_{x\in[a,b]}|f(x)|,$$ $$\|f\|_{L[a,b]}=\left(\int\limits_a^b|f(x)|^2dx\right)^{1/2}.$$ Соответственно пространства $$\Bbb{R}^n$$ и $$C[a,b]$$ являются банаховыми пространствами, а пространство $$L[a,b]$$ только нормированным.

    Посмотрим как на 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)$$ равен нулю, что предсказуемо.

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

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

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

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

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

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

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

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

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

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

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