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

Подпрограмма:  EF01R (модуль EF01R_p)

Назначение

Приближенное решение интегрального уравнения Фредгольма I рода в классе ограниченных кусочно - монотонных функций.

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

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

            b
           ∫ k(x, y) u(y) dy  =  f(x)  ,  c ≤ x ≤ d ,
          a 

при априорно известной информации о качественном поведении искомого решения  u = u (y) осуществляется методом квазирешений В.К.Иванова путем сведения к решению задачи квадратичного программирования с линейными ограничениями

(1)     || K D u - f ||p2  =   inf   || K D v - f ||p2 ,
                                      vG 

где  K - известная матрица порядка  M * N с элементами  ki j , которая в зависимости от ядра  k (x, y) и способа его аппроксимации может быть матрицей общего вида, либо симметричной, циркулянтной, теплицевой и т.п.,

f = ( f1, ..., fM ) - известный  M -  мерный вектор ,

u = ( u1, ..., uN ) - искомый  N - мерный вектор приближенного решения,

D - диагональная матрица коэффициентов квадратурной формулы  dj ,  j = 1, ..., N,

                        M 
       || Z ||p2  =  ∑  pi zi2 ,      pi > 0  -  весовые коэффициенты.
                       i=1 

Линейные ограничения  G представляют собой одно из множеств  G1,  G2 или  G1  G2, где

 G1 = { v = (v1, ..., vN) :  aj ≤ vj ≤ bj ,  j = 1, ..., N } ,
 G2 = { v = (v1, ..., vN) :  mj (vj + 1 - vj) ≥ 0 ,  j = 1, ..., N - 1 } , 

a = (a1, ..., aN),  b = (b1, ..., bN) - заданные  N - мерные векторы нижних и верхних ограничений в  G1; параметры  mj определяются условиями кусочной монотонности и принимают значения 1, 0 или -1.

B случае отсутствия ограничений решается задача безусловной минимизации.

Численное решение задачи (1) основано на методе проекции сопряженных градиентов, который позволяет проводить итерационный процесс в конечномерном пространстве  W2, ρ1 с нормой

                                    N
 || v ||   =  ( || v || 2Q  +  ∑   ρj (vj - vj - 1)2 )1/2 ,
                                   j=2
                     N
 || v || Q  =  (  ∑   q j vj2 )1/2 ,
                    j=1 

q j > 0 и  ρj ≥ 0 - заданные числа. Если априори известно, что искомое решение достаточно гладкое, то задание параметров  ρj > 0, связанных с конкретной нормировкой  W2, ρ1 ( при  ρj≡0 эта ноpма  v  совпадает с  || v || Q ), позволяет увеличить точность и улучшить качество приближенного решения.

Итерационный процесс считается оконченным после выполнения заданного числа итераций или после достижения заданной точности.

B используемом алгоритме матрица  K участвует лишь в операциях умножения матрицы на вектоp и умножения транспонированной матрицы на вектоp. Эти операции выделены в отдельную подпрограмму, благодаря чему пользователь может максимально полно учесть специфику матрицы  K.

B самой подпрограмме EF01R матрица  K не используется, поэтому способ ее представления не регламентируется.

1.  А.Н.Тихонов, В.Я.Арсенин, Методы решения некорректных задач, M., "Hаука", 1974.
2.  В.А.Морозов, Н.Л.Гольдман, М.К.Самарин. Метод дескриптивной регуляризации и качество приближенных решений, ИФЖ, т. 33, N 6, 1977.
3.  Ф.П.Васильев, Лекции по медодам решения экстремальных задач. Изд - во МГУ, 1974.

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

procedure EF01R(var M :Integer; var N :Integer; var A :Array of Real;
                var F :Array of Real; NG :Integer; var AU :Array of Real;
                var BU :Array of Real; var MU :Array of Integer;
                var P :Array of Real; var Q :Array of Real;
                var D :Array of Real; var R :Array of Real; E :Real;
                ISP :Integer; var U :Array of Real; var FU :Real;
                var KN :Integer; var B :Array of Real; EF01R0 :Proc_EF01R);

Параметры

M - заданная размерность вектоpа правой части  f (тип: целый);
N - заданная размерность вектоpа искомого решения  u (тип: целый);
A - заданный вещественный массив, содержащий информацию о матрице  K; параметр  A используется только в подпрограмме пользователя  OP (см. дальше), и поэтому в данной подпрограмме его размерность не фиксируется;
F - вещественный вектоp длины  M, содержащий компоненты вектоpа правой части  f;
NG - заданный признак наличия ограничений на искомое решение (тип: целый):
NG = 0 - если ограничения отсутствуют,
NG = 1 - если требуется найти  u  G1,
NG = 2 - если требуется найти  u  G2,
NG = 3 - если требуется найти  u  G1  G2;
AU - вещественный вектоp длины  N, содержащий компоненты вектоpа нижних ограничений  a;
BU - вещественный вектоp длины  N, содержащий компоненты вектоpа верхних ограничений  b;
MU - целый вектоp длины  N, первые  N - 1 компоненты которого содержат параметры  mj, определяемые условиями кусочной монотонности;
P - вещественный вектоp длины  M, содержащий весовые коэффициенты  pi > 0;
Q - вещественный вектоp длины  N, содержащий весовые коэффициенты  q j > 0;
D - вещественный вектоp длины  N, содержащий коэффициенты квадратурной формулы  d j > 0;
R - вещественный вектоp длины  N + 1 значений параметров  ρj :  R (1) = 0.,  R (J) = ρj ≥ 0 ,  J = 2, ..., N ,  R (N + 1) = 0 ;
E - заданная точность вычисления по градиенту (тип: вещественный);
ISP - заданное максимально допустимое число итераций (тип: целый);
U - вещественный вектоp длины  N, задающий произвольное начальное приближение; в результате работы подпрограммы содержит вычисленное решение  u;
FU - вещественная переменная, содержащая вычисленное значение функционала невязки  || K D u - f ||p2;
KN - целая переменная, указывающая причину выхода из подпрограммы:
KN = 0 - если выполнено заданное число итераций,
KN = 1 - если достигнута точность по градиенту,
KN = 2 - если достигнута точность по функционалу,
KN = 3 - если достигнута точность по аргументу;
B - вещественный вектоp длины  M + 7N + 2, используемый как рабочий;
OP - имя подпрограммы пользователя, вычисляющей векторы  w = K v и  w = K' v (см. замечания по использованию);

первый оператор подпрограммы должен иметь вид:
procedure OP (M :Integer; N :Integer; var A :Array of Real; var V :Array of Real; var W :Array of Real; NOP :Integer);

Здесь:
M, N - параметры, описанные выше;
A - заданный вещественный массив, содержащий информацию о матрице  K; способ представления матрицы  K в массиве  A определяется пользователем;
V - вещественный вектоp длины  max (M, N), содержащий компоненты вектоpа  v;
W - вещественный вектоp длины  max (M, N), содержащий компоненты вычисленного вектоpа  w;
NOP - управляющий параметр (тип: целый);

при  NOP = 1 должен быть вычислен вектоp  w с компонентами

                N
      wi  =  ∑   ki j vj ,    i = 1, ..., M ,
               j=1 

при  NOP = 2 должен быть вычислен вектоp  w с компонентами

                M
      wj  =  ∑   kj i vi ,    j = 1, ..., N .
               i=1 

Версии: нет

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

IA01R - среднеквадратичная аппроксимация одномерной дискретной функции на множестве кусочно - монотонных функций.

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

  1. 

Различные способы аппроксимации интегрального уpавнения приводят к различному определению элементов  ki j и  d j.

Например, при гладком ядре  ki j = k (xi, yj),  xi:  c = x1 < x2 < ... < xM = d,  xi + 1 = xi + hix - узлы на отрезке  [c, d],  yj:  a = y1 < y2 < ... < yN = b,  yj + 1= yj + hjy - узлы на отрезке  [a, b],  dj - коэффициенты выбранной квадратурной формулы, а при негладком ядре

                             xi+1    yj+1
      ki j  =  1/h1x       ∫       ∫     k (x, y)  dx dy ,   dj ≡ 1 .
                              xi      yj 
  2. 

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

EF01R1 - если матрица  K имеет общий вид и задается двумерным массивом  A размерности  M * N :  A [I, J] = kI J ,  I = 1, 2, ..., M,  J = 1, 2, ..., N ;

EF01R2 - если матрица  K симметричная ( т.е. если ядро симметрично,  k (x, y) = k (y, x) и  a = c,  b = d,  hix = hjy = h ,  M = N ) и задается одномерным массивом  A в компактной форме; при работе подпрограммы EF01R2 вызывается подпрограмма AM16R - вычисление произведения вещественной симметричной матрицы на вещественный вектоp;

EF01R3 - если матрица  K теплицева ( т.е. если  k (x, y) = k (x - y) ,  a = c,  b = d,  hix = hjy = h,  M = N ) и задается одномерным массивом  A длины 2N - 1, содержащим элементы первого столбца и первой строки матрицы  K в следующем порядке :  kN1, ..., k21, k11, k12, ..., k1N ;

EF01R4 - если матрица  K циркулянтная ( т.е.  k (x, y) = k (x - y),  a = c,  b = d,  hix = hjy = h,  M = N и, кpоме того, ядро  k (t) периодично с периодом  T = b - a ) и задается одномерным массивом  A длины  N, содержащим элементы первого столбца матрицы  K :  k11, k21, ..., kN1.

  3. 

B случае  NG = 0 или  NG = 2 массивы  AU и  BU в вычислениях не используются и для них не следует резервировать память. Соответствующим фактическим параметpом может быть произвольный идентификатор. Это замечание относится и к массиву  MU в случае  NG = 0 или  NG = 1.

  4. 

Весовые коэффициенты  pi ( i = 1, ..., M ) и  qj ( j = 1, ..., N ), задаваемые векторами  P и  Q, могут быть коэффициентами квадратурных формул или задаваться из других соображений, в частности, можно положить  pi ≡ 1,  qj ≡ 1.

Если  f (xi) = fi + ξi, где  fi = f (xi) - точное значение правой части,  ξi - нормально распределенная случайная величина с дисперсией  D ξi = σi2 и  M ξi = 0, то можно положить  pi = 1 / σi2.

  5. 

Величины, определяющие точность вычисления по аргументу и по функционалу, заданы в самой подпрограмме согласовано с величиной  E.

  6.  Если выход из подпрограммы произошел через заданное число итераций (KN = 0), то для продолжения итерационного процесса (например, после выдачи на печать промежуточных результатов) можно поступить следующим образом:
  
    _1:
    EF01R (M, N, A, F, NG, AU, BU, MU, P, Q, D, R, E, ISP,
           U, FU, KN, OP);
    if (KN<0)
     then goto _2
     else if (KN=0)
           then goto _1
           else goto _2;
    _2:
     ...  

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

Матрица  K имеет общий вид

Unit tef01r_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc, UtRes_p, EF01R_p, EF01R1_p;

function tef01r: String;

implementation

function tef01r: String;
var
M,N,NG,ISP,_i,KN :Integer;
E,FU :Real;
B :Array [0..25] of Real;
const
A :Array [0..8] of Real = ( 3.0,1.0,5.0,1.0,-3.0,2.0,1.0,2.0,1.0 );
F :Array [0..2] of Real = ( 4.0,3.0,4.0 );
MU :Array [0..2] of Integer = ( 1,1,0 );
P :Array [0..2] of Real = ( 1.0,1.0,1.0 );
Q :Array [0..2] of Real = ( 1.0,1.0,1.0 );
D :Array [0..2] of Real = ( 1.0,1.0,1.0 );
R :Array [0..3] of Real = ( 0.0,0.0,0.0,0.0 );
U :Array [0..2] of Real = ( 0.0,0.0,0.0 );
AU :Array [0..2] of Real = ( -10.0,-10.0,-10.0 );
BU :Array [0..2] of Real = ( 10.0,10.0,10.0 );
label
_1,_2;
begin
Result := '';
M := 3;
N := 3;
NG := 2;
E := 1.E-7;
ISP := 20;
_1:
EF01R(M,N,A,F,NG,AU,BU,MU,P,Q,D,R,E,ISP,U,FU,KN,B,EF01R1);
Result := Result + Format('%s',['  U= ']);
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[U[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('   %20.16f',[FU]) + #$0D#$0A;
if ( KN ) < 0
 then goto _2
 else if ( KN ) > 0
       then goto _2
       else goto _1;
_2:
UtRes('tef01r',Result);  { вывод результатов в файл tef01r.res }
exit;
end;

end.


Unit ef01r1_p;
interface
uses
SysUtils, Math, { Delphi }
LStruct, Lfunc;

procedure ef01r1(M :Integer; N :Integer; var A :Array of Real;
                 var V :Array of Real; var W :Array of Real; NOP :Integer);

implementation

procedure ef01r1(M :Integer; N :Integer; var A :Array of Real;
                 var V :Array of Real; var W :Array of Real; NOP :Integer);
var
I,J :Integer;
label
_1,_2,_3,_4,_5;
begin
case NOP of
 1: goto _1;
 2: goto _3;
end;
_1:
for I:=1 to M do
 begin
  W[I-1] := 0.0;
  for J:=1 to N do
   begin
    W[I-1] := W[I-1]+A[(I-1)+(J-1)*M]*V[J-1];
_2:
   end;
 end;
goto _5;
_3:
for J:=1 to N do
 begin
  W[J-1] := 0.0;
  for I:=1 to M do
   begin
    W[J-1] := W[J-1]+A[(I-1)+(J-1)*M]*V[I-1];
_4:
   end;
 end;
_5:
end;

end.

Результат:    U  =  (-1., 2., 5.)