Текст подпрограммы и версий
ef03r_p.zip
Тексты тестовых примеров
tef03r_p.zip

Подпрограмма:  EF03R (модуль EF03R_p)

Назначение

Решение интегрального уравнения Фредгольма I рода методом поточечной невязки.

Математическое описание

Решение интегрального уравнения Фредгольма I рода

                    b
(1)    Au  ≡   ∫  K(x, y) u(y) dy  =  f(x)  ,    c ≤ x ≤ d ,
                   a 

с известными ядром  K (x, y) и правой частью  f (x) сводится методом поточечной невязки [1,2] к минимизации функционала

                      b
(2)    Ω(u)  =  ∫ ( p1 u2 + p2 (du/dy)2 + p3 (d2u/dy2) ) dy
                     a
при условии

(3)     | Au - f(x) | ≤ δ(x) , 

где  δ (x) - заданная погрешность правой части уравнения (1), 
p1 > 0,  p2 ≥ 0,  p3 ≥ 0 - заданные параметры.

Дискретный аналог задачи (2), (3) состоит в определении вектоpа  u = (u1, ..., uN EN, обладающего наименьшей  C - нормой

(4)      || u ||c2  =  (C u, u)  =  min u (C u, u) 

среди всех  u = (u1, ..., uN EN, для которых выполнены неpавенства

(5)      | (K D u)i - fi | ≤ δi ,    i  1, M 

Здесь  C - ленточная положительно определенная матрица квадратичной формы, аппроксимирующей функционал  Ω (u) на сетке  { yj } :

a = y1 < y2 < ... < yj < ... < yN  =  b ,  yj + 1 - yj = hj  с помощью разностных отношений:

 du/dy [ в точке yj+1/2 ]  =  [ u(yj+1) - u(yj) ] / hj ,

 d2u/dy2 [ в точке yj ]  = [ du/dy [ в точке yj+1/2 ]  -
                                    -   du/dy [ в точке yj-1/2 ]  ] / 0.5(hj + hj-1) 

и квадратурной формулы трапеций.  K - известная матрица порядка  M * N с элементами  ki j = k (xi, yj),  {xi} - сетка узлов на [c, d]:

c = x1 < ... < xi < ... < xM = d ,  D - диагональная матрица коэффициентов квадратурной формулы  dj ( j  1, N ),  fi = f (xi) и  δi = δ (xi) - значения правой части погрешности в узлах  xi.

Для приближенного решения задачи (4), (5) в подпрограмме применяется метод последовательного проектирования [3], позволяющий определить элемент  w = (w1, ..., wn EN такой, что

     || u ||c ≤ || w ||c ≤ 2 || u ||c . 

В случае пустоты множества (5) при заданных  δi в подпрограмме находятся значения  δi = δi + p4 δi (p4 > 0 - заданный параметр), при котоpом множество (5) непусто.

При необходимости повторного решения интегрального уравнения (1) с тем же ядром и функционалом  Ω (u), но с другой правой частью подпрограмма реализует алгоритм численного решения задачи (4), (5) быстрее.

1.  Морозов B.A. O выборе параметра при решении функциональных уравнений методом регуляризации. ДАН CCCP 175, N 6, 1967.
2.  Морозов B.A., Гольдман Н.Л. Численный алгоритм решения интегральных уравнений Фредгольма I рода методом поточечной невязки. B сб.: Методы и алгоритмы в численном анализе. - M.: Изд - во МГУ, 1981, стp.28 - 43.
3.  Гурин Л.Г., Поляк Б.Т., Райк Э.В. Методы проекций для отыскания общей точки выпуклых множеств. ЖВМ и МФ 7, N 6, 1967.

Использование

procedure EF03R(var M :Integer; var N :Integer; var A :Array of Real;
                var F :Array of Real; var DELTA :Array of Real;
                var H :Array of Real; var D :Array of Real; var P1 :Real;
                var P2 :Real; var P3 :Real; P4 :Real; L :Integer;
                var U :Array of Real; var B :Array of Real);

Параметры

M - заданная размерность вектоpа правой части  f (тип: целый);
N - заданная размерность вектоpа искомого решения (тип: целый);
A - заданный вещественный двумерный массив размеpа  M * N, содержащий элементы матрицы  K:  A (I, J) = ki j;
F - заданный вещественный вектоp длины M, содержащий компоненты вектоpа правой части:  F (I) = fi;
DELTA - заданный вещественный вектоp длины  M, содержащий компоненты вектоpа погрешности  DELTA (I) = δi;
H - заданный вещественный вектоp длины  N, первые  N - 1 компонент которого содержат шаги  hj разностной сетки на отрезке [a, b];
D - заданный вещественный вектоp длины  N, содержащий коэффициенты квадратурной формулы  dj;
          P1 -
         P2  
         P3  
параметры, определяющие стабилизирующий функционал  Ω (u) (тип: вещественный);
P4 - параметр, задающий уровень погрешности  δi в случае пустоты множества (5) при исходном уpовне погрешности (тип: вещественный);
L - параметр, определяющий режим использования подпрограммы (тип: целый);
L = 1 - при первом обращении к подпрограмме,
L = 2 - при повторном обращении к подпрограмме;
U - вещественный вектоp длины  N; в результате работы подпрограммы содержит вычисленное pешение  w;
B - вещественный вектоp длины  5N + 3M, используемый как рабочий.

Версии: нет

Вызываемые подпрограммы

AVZ2R - нахождение максимальной по модулю компоненты и ее индекса из всего вектоpа или из заданного подмножества компонент этого вектоpа.

Замечания по использованию

  1. 

Подпрограмма EF03R обращается к вспомогательным подпрограммам с именами EF03R1, EF03R2, EF03R3, EF03R4.

  2. 

B результате работы подпрограммы исходная информация, расположенная в массиве  A, не сохраняется.

  3. 

B результате работы подпрограммы массив DELTA содержит значения параметров  δi, при которых фактически решена задача, т.е. обеспечивающих непустоту множества ограничений (5).

  4.  При повторных обращениях к подпрограмме (L = 2) можно менять только значения  F. Значения остальных паpаметpов должны сохраняться теми, какими они получены после первого обращения.

Пример использования

Рассматривается интегральное уравнение

               1
               ∫  K(x, y) u(y) dy  =  F(x)
             -1 

с ядром  K (x, y) = ( 1 + (x - y)2 )- 1 , правой частью

   F(x)  =  (2 - x2) ( arctg(1 - x) + arctg(1 + x) ) - 2 -
                             - x ln( (1 + (1 - x)2) / (1 + (1 + x)2) ) 

и точным решением  u (y) = 1 - y2.

Ниже приводится фрагмент программы, вычисляющей приближенное решение.

Для аппроксимации интеграла применяется квадратурная формула трапеции с использованием равномерной сетки по  x на отрезке [- 2, 2] с шагом  hi = 0.1 (число узлов  M = 41) и равномерной сетки по  y на отрезке [- 1, 1] с шагом  hj = 0.05 (число узлов  N = 41).

Unit TEF03R_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, EF03R_p;

function TEF03R: String;

implementation

function TEF03R: String;
var
J,K,I :Integer;
W,W1 :Real;
A :Array [0..1680] of Real;
F :Array [0..40] of Real;
U :Array [0..40] of Real;
B :Array [0..327] of Real;
const
DELТА :Array [0..40] of Real = ( 0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001 );
HJ :Array [0..40] of Real = ( 0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.0 );
HI :Array [0..40] of Real = ( 0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,
0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,
0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,
0.1,0.1,0.1,0.1,0.0 );
M :Integer = 41;
N :Integer = 41;
D :Array [0..40] of Real = ( 0.025,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,
0.05,0.025 );
P1 :Real = 1.0;
P2 :Real = 0.0;
P3 :Real = 0.0;
P4 :Real = 1.0;
L :Integer = 1;
label
_1,_2,_3,_4,_6;
begin
Result := '';
B[0] := -2.0;
B[M+0] := -1.0;
for J:=2 to N do
 begin
  K := M+J;
_1:
  B[K-1] := B[K-2]+HJ[J-2];
 end;
for I:=2 to M do
 begin
_2:
  B[I-1] := B[I-2]+HI[I-2];
 end;
for I:=1 to M do
 begin
  for J:=1 to N do
   begin
    K := M+J;
    A[(I-1)+(J-1)*41] := 1.0/(1.0+IntPower(B[K-1]-B[I-1],2));
_3:
   end;
 end;
for I:=1 to M do
 begin
  W := 1.0+B[I-1];
  W1 := 1.0-B[I-1];
  F[I-1] := (1.0+W*W1)*(ArcTan(W)+ArcTan(W1))-2.0-B[I-1]*Ln((1.0+W1*W1)/
          (1.0+W*W));
_4:
 end;
EF03R(M,N,A,F,DELTA,HJ,D,P1,P2,P3,P4,L,U,B);
J := 1;
WHILE ( J<=41 ) do
 begin
  I := 42-J;
  Result := Result + Format('%s',['     I=']);
  Result := Result + Format('%3d',[I]) + #$0D#$0A;
  Result := Result + Format('%s',['   U[I-1]=']);
  Result := Result + Format('%20.16f',[U[I-1]]) + #$0D#$0A;
_6:
  inc(J,5);
 end;
UtRes('TEF03R',Result);  { вывод результатов в файл TEF03R.res }
exit;
end;

end.

Результаты:

       при  J = 1 + 5K ,    K = 0, 1, ..., 8

       U(J)  =  ( 0.104,  0.411,  0.715,  0.952,  1.041,  0.944,  0.707, 
                      0.411,  0.119 )