Принципы организации вычислительных процедур
Обратимся к способам построения операторов . Мы рассмотрим
два принципиальных метода построения приближенных решений.
Во-первых, это метод дискретизации. Как правило, пространство
состоит из бесконечного числа элементов, более того, часто это
пространство является бесконечномерным линейным пространством. А
на компьютере мы можем работать только с конечными множествами.
Поэтому для каждого целого
вводится конечное множество
и
два отображения:
![D_n:X\to X_n](/sites/default/files/tex_cache/e9455e5e04dc32ef0788df0b410f9414.png)
![I_n:X_n\to X.](/sites/default/files/tex_cache/ceccb4d635959ea019e2d5128766aa46.png)
![D_nI_n\tilde x=\tilde x,](/sites/default/files/tex_cache/37e19a0baabb0c181ef34cd2909de32e.png)
![\tilde x\in X_n](/sites/default/files/tex_cache/c893dd3cad949d2f9dde7a1f954c4c74.png)
Далее решается следующая задача
![]() |
( 5.2) |
![\tilde x_n\in X_n](/sites/default/files/tex_cache/51ddb8f9a30d68ca39b692f881932ebd.png)
![T](/sites/default/files/tex_cache/b9ece18c950afbfa6b0fdbfa4ff731d3.png)
![T[n]=I_n\tilde x_n.](/sites/default/files/tex_cache/cd9790e03276aebb0c83e915440fca06.png)
![\tilde x_n](/sites/default/files/tex_cache/51f8b42234204c6583568a40b696921b.png)
![n](/sites/default/files/tex_cache/7b8b965ad4bca0e41ab51de7b31363a1.png)
Вычислительные процедуры, основанные на методе дискретизации пространства, как правило, применяются для нахождения приближенных решений дифференциальных и интегральных уравнений. В том числе и для приближенного решения уравнений в частных производных.
Другим часто применяемым принципом построения вычислительных
процедур является использование принципа неподвижной точки
отображения. Предположим, что решение уравнения 5.1
является неподвижной точкой некоторого другого отображения , то есть если
- решение задачи 5.1, то имеет
место:
![]() |
( 5.3) |
![B](/sites/default/files/tex_cache/9d5ed678fe57bcca610140957afab571.png)
Во многих случаях для конструктивного нахождения неподвижной точки
оператора или, соответственно, решения уравнения 5.3
используется метод простых итераций. Пусть задано начальное
приближение
, тогда последующие приближения строятся по
формуле:
![x_n=Bx_{n-1},\quad n=1,2,\dots](/sites/default/files/tex_cache/3a4f37e8813683d951cf73d9e4451eb0.png)
![B](/sites/default/files/tex_cache/9d5ed678fe57bcca610140957afab571.png)
![B](/sites/default/files/tex_cache/9d5ed678fe57bcca610140957afab571.png)
![x_n](/sites/default/files/tex_cache/5bef92b1854f9c388d11bfbb1720c05d.png)
Напомним, что отображение называется сжимающим, если
существует такое число
, что для любых
имеет место
![\rho(Bx',Bx'')\le\alpha\rho(x',x'').](/sites/default/files/tex_cache/8ff3e297008ee8a639c3833e9482cf59.png)
Рассмотрим пример на применение метода неподвижных точек. Пусть
пространства и
являются пространствами
с
евклидовой метрикой. В качестве оператора
возьмем квадратную
матрицу:
![A=\left(%
\begin{array}{cc}
0.9 & -0.4 \\
-0.2 & 0.8 \\
\end{array}%
\right)](/sites/default/files/tex_cache/0319feac45baa473a262dc41fb836452.png)
![]() |
( 5.4) |
![f=\left(%
\begin{array}{c}
1 \\
1 \\
\end{array}%
\right)](/sites/default/files/tex_cache/e265162469b3e5a2a3861cbf0a836f26.png)
![B](/sites/default/files/tex_cache/9d5ed678fe57bcca610140957afab571.png)
![Bx=\left(%
\begin{array}{cc}
0.1 & 0.4 \\
0.2 & 0.2 \\
\end{array}%
\right)x+\left(%
\begin{array}{c}
1 \\
1 \\
\end{array}%
\right)](/sites/default/files/tex_cache/c76459c7940249fbbe6fa28ed31f600f.png)
![B](/sites/default/files/tex_cache/9d5ed678fe57bcca610140957afab571.png)
![x^*=\left(%
\begin{array}{c}
1.875 \\
1.71875 \\
\end{array}%
\right)](/sites/default/files/tex_cache/2b936cf61421c043e5a6e4000537e2b8.png)
![x_n=Bx_{n-1},\quad n=1,2,\dots](/sites/default/files/tex_cache/3a4f37e8813683d951cf73d9e4451eb0.png)
![x_0=0](/sites/default/files/tex_cache/a578905d96770d30a5040bbb9ff01cde.png)
![\delta(x_n)](/sites/default/files/tex_cache/70374ebf113811b36971adbc7770ffd2.png)
![\begin{verbatim}
// Класс - двумерный вектор
class TR2
{
public double x1; // координаты
public double x2;
// конструктор по умолчанию
public TR2()
{
x1 = 0;
x2 = 0;
}
// конструктор с заданными значениями
public TR2(double x1, double x2)
{
this.x1 = x1;
this.x2 = x2;
}
// вычислить метрику до точки A
public double rho(TR2 A)
{
return Math.Sqrt((x1 - A.x1) * (x1 - A.x1) +
(x2 - A.x2) * (x2 - A.x2));
}
}
\end{verbatim}](/sites/default/files/tex_cache/ff83d14a1c7b50921ad6813fc5ffce5c.png)
![\begin{verbatim}
// Класс - матрица 2x2
class TMatrix2
{
double a11, a12, a21, a22;
public TMatrix2(double a11, double a12,
double a21, double a22)
{
this.a11 = a11;
this.a12 = a12;
this.a21 = a21;
this.a22 = a22;
}
// вычислить вектор после применения матрицы к вектору x
public TR2 Calc(TR2 x)
{
TR2 res = new TR2();
res.x1 = a11 * x.x1 + a12 * x.x2;
res.x2 = a21 * x.x1 + a22 * x.x2;
return res;
}
}
\end{verbatim}](/sites/default/files/tex_cache/d653be1edc3996bc9793d5c8684041f1.png)
![\begin{verbatim}
// Класс для итерационного решения уравнения
class TContractingMatrix2
{
TR2 x, f; // текущее значение, правая часть
TMatrix2 Matrix; // матрица оператора
public TContractingMatrix2(TMatrix2 Matrix, TR2 x0, TR2 f)
{
this.Matrix = Matrix;
x = x0;
this.f = f;
}
// переход к следующей итерации
public TR2 Next()
{
TR2 xx = Matrix.Calc(x);
xx.x1 += f.x1;
xx.x2 += f.x2;
x = xx;
return x;
}
// текущее состояние
public TR2 GetCurent()
{
return x;
}
}
\end{verbatim}](/sites/default/files/tex_cache/e3ffe194020b6e63b1d0c2e44e8afe6a.png)
![TContractingMatrix2](/sites/default/files/tex_cache/3b6def486a1677df41e5724e9f496315.png)
![x_n=[1.000000E+000,1.000000E+000]; d_n=1.132354E+000\\
x_n=[1.500000E+000,1.400000E+000]; d_n=4.921652E-001\\
x_n=[1.710000E+000,1.580000E+000]; d_n=2.155842E-001\\
x_n=[1.803000E+000,1.658000E+000]; d_n=9.420490E-002\\
x_n=[1.843500E+000,1.692200E+000]; d_n=4.119651E-002\\
x_n=[1.861230E+000,1.707140E+000]; d_n=1.801125E-002\\
x_n=[1.868979E+000,1.713674E+000]; d_n=7.875165E-003\\
x_n=[1.872368E+000,1.716531E+000]; d_n=3.443224E-003\\
x_n=[1.873849E+000,1.717780E+000]; d_n=1.505477E-003\\
x_n=[1.874497E+000,1.718326E+000]; d_n=6.582366E-004\\
x_n=[1.874780E+000,1.718564E+000]; d_n=2.877996E-004\\
x_n=[1.874904E+000,1.718669E+000]; d_n=1.258341E-004\\
x_n=[1.874958E+000,1.718715E+000]; d_n=5.501820E-005\\
x_n=[1.874982E+000,1.718734E+000]; d_n=2.405550E-005\\
x_n=[1.874992E+000,1.718743E+000]; d_n=1.051774E-005\\
x_n=[1.874996E+000,1.718747E+000]; d_n=4.598653E-006\\
x_n=[1.874998E+000,1.718749E+000]; d_n=2.010661E-006\\
x_n=[1.874999E+000,1.718749E+000]; d_n=8.791174E-007\\
x_n=[1.875000E+000,1.718750E+000]; d_n=3.843748E-007\\
x_n=[1.875000E+000,1.718750E+000]; d_n=1.680595E-007\\
x_n=[1.875000E+000,1.718750E+000]; d_n=7.348034E-008\\
x_n=[1.875000E+000,1.718750E+000]; d_n=3.212767E-008\\
x_n=[1.875000E+000,1.718750E+000]; d_n=1.404712E-008\\
x_n=[1.875000E+000,1.718750E+000]; d_n=6.141797E-009\\
x_n=[1.875000E+000,1.718750E+000]; d_n=2.685366E-009\\](/sites/default/files/tex_cache/283bbb1c774162e5ab0f45bf67107458.png)
Мы видим, что величина стремится к нулю, а сама
последовательность
сходится к точному решению.
Классический подход вычислительной математики состоит в том, что строится некоторая эффективно выполняемая вычислительная процедура позволяющая получать приближенные решения, которые сходятся (в том или ином смысле) к точному решению. Такой подход подразумевает, что исходная задача является корректной. Корректность задачи по Адамару означает выполнения следующих трех условий:
- Существование решения
- Единственность решения
- Непрерывная зависимость решения от оператора задач, правой части, начального условия
В начале прошлого века могло показаться, что эти условия всегда должны быть выполнены для имеющих физический смысл задач. Однако довольно быстро выяснилось, что наука и техника предъявляют большой класс задач, для которых условия некоторые из условий 1--3 не выполнены. К таким задачам относятся уравнения Фредгольма первого рода, обратные задачи для дифференциальных уравнений, задачи аналитического продолжения функций и многие другие. Задачи, для которых не выполнены какие-либо из условий 1--3, называются некорректными задачами. Некорректные задачи возникают в физике, например, неустойчивость Релея-Тейлора.
Как правило, применять классические вычислительные процедуры для решения некорректных задач не удается. В середине XX-го века известным математиком А.Н.Тихоновым были заложены основы теории регуляризации некорректных задач. Эти результаты нашли свое эффективное применение во многих научно-технических областях.
Изучение теории регуляризации некорректных задач выходит за рамки нашего курса.
Ключевые термины
Корректность задачи по Адамару - существование единственного решения у задачи и непрерывная зависимость решения от данных задачи.
Невязка приближенного решения - количественная мера неудовлетворения приближенным решением уравнению.
Операторное уравнение - уравнение в абстрактных пространства записанное с помощью операторов в этих пространствах.
Принцип неподвижной точки отображение - существование такого элемента для оператора, который отображается этим оператором в себя.
Краткие итоги: Рассмотрены различные способы организации вычислительных процедур для решения операторных уравнений. Рассмотрены вопросы связи невязки и точности решений. Приведен пример организации итерационной процедуры.