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

Подпрограмма:  MNN1R (модуль MNN1R_p)

Назначение

Решение задачи минимизации функции многих переменных без вычисления производных при наличии двухсторонних ограничений на переменные методом покоординатного спуска с построением аппроксимирующей параболы с использованием метода Хука - Дживса.

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

 Для решения задачи
      min  f (x) ,

   Q  =  { x:  x  En ,  aj ≤ xj ≤ bj ,   aj > - ∞ ,   bj < ∞ ,  j = 1, ..., n } , 

используется метод покоординатного спуска с построением аппроксимирующей параболы.

Точка  xk  Q считается точкой минимума  f (x) на  Q, если выполнено хотя бы одно из следующих условий:

1.  | xjk - xjk - 1 | ≤ EPSX j  для всех  j  = 1, ..., n, где  xk = (x1k, ..., xnk) - точка, полученная на  k - ой итерации метода, а EPSX - заданный вектоp точности решения задачи по аргументу;
2.  | f (xk) - f (xk - 1) | ≤ EPSF, где  xk - точка, вычисленная на  k - ой итерации метода, а EPSF - заданная точность решения задачи по функционалу;
3.  NF > KMAX, где NF - фактически выполненное число вычислений функции, KMAX - заданное максимально допустимое число вычислений функции.

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

procedure MNN1R(var N :Integer; var X :Array of Real;
                var XE :Array of Real; var A :Array of Real;
                var B :Array of Real; FUN :Proc_F1_MN; var F :Real;
                var FE :Real; var UP :Array of Real;
                var I0 :Array of Integer; var IRM :Array of Integer;
                var RM :Array of Real; var IERR :Integer);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N, содержащий на входе заданную начальную точку поиска, на выходе - точку минимума функции  f (x);
XE - вещественный вектоp длины  N, содержащий заданную абсолютную точность решения задачи по аргументу;
A - вещественный вектоp длины  N, задающий ограничения снизу на переменные;
B - вещественный вектоp длины  N, задающий ограничения свеpху на переменные;
FUN - имя подпрограммы вычисления функции  f (x);
F - вещественная переменная, содержащая вычисленное минимальное значение  f (x);
FE - заданная абсолютная точность решения задачи по функционалу;
UP - вещественный вектоp длины 11, задающий управляющие параметры алгоритма:
UP(1) - заданная вещественная константа, участвующая в формировании начальной точности вычисления по аргументу (UP (1) ≥ 1);
UP(2) - заданная вещественная константа, участвующая в формировании начальной точности вычисления по функционалу (UP (2) ≥ 1);
UP(3) - заданная вещественная константа, используемая при сравнении разностных производных (0 < UP (3) < 1);
UP(4) - заданная вещественная константа, участвующая в формировании начального шага (UP (4) > 1);
UP(5) - заданная вещественная константа, используемая для изменения величины шага (константа дробления) (UP (5) > 1);
UP(6) - вещественная константа, участвующая в изменении точности по аргументу, 0 < UP (6) < 1;
UP(7) - вещественная константа, участвующая в изменении точности вычисления по функционалу, 0 < UP (7) < 1;
UP(8) - вещественная константа, используемая в качестве "машинного нуля" (UP (8) ≈ 103 * min, где  min - минимально представимое число с плавающей запятой в машине);
UP(9) - вещественная константа, используемая для изменения величины шага (для увеличения шага) (UP > 1);
UP(10) - заданная вещественная константа, указывающая максимальное время работы подпрограммы;
UP(11) - вещественная константа, влияющая на величину шага в подпрограмме MNN09 (0.1 < < UP (11) < 1);
I0 - целый вектоp длины  N, задающий фиксированные компоненты вектоpа переменных (если  I0 (I)= 0, то  X (I) - фиксируется, в противном случае  I0 (I) = 1);
IRM - целый вектоp длины  N, используемый в подпрограмме как рабочий;
RM - вещественный вектоp длины 4N;
на входе:
RM(1) - заданное максимально допустимое число итераций метода;
RM(2) - заданное максимально допустимое число вычислений функции;
  на выходе:
RM(1) - выполненное число итераций;
RM(2) - выполненное число вычислений функции;
IERR - целочисленная переменная, указывающая причину окончания счета:
IERR= 1 - если достигнута точность по аргументу;
IERR= 2 - если достигнута точность вычисления функции;
IERR= 4 - если выполнено заданное число вычислений функции;
IERR= 5 - если истекло заданное время вычислений;
IERR= 6 - если произошло замедление счета.

Версии: нет

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

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

 

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

       procedure FUN (var X :Array of Real; var F :Real; FE :Real);

      Параметры
      X   - вещественный вектор длины  N, содержащий
              текущую точку пространства, в которой
              вычисляется значение функции;
      F   - вещественная переменная, содержащая
              вычисленное значение функции в точке  X;
      FE - вещественная переменная, содержащая заданную
              точность вычисления значения функции в точке X. 
Используются служебные подпрограммы MNN02, MNN04, MNN05, MNN06, MNN07, MNN08, MNN09, UTMN05, MMKRIT и структура - _MMKRIC.

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

Найти минимальное значение функции:

   F(x)  =  (x1 - 1)2 + 10(x2 - 1)2 + 100(x3 - 1)2 + 1000(x4 - 1)2

  - 4 ≤ x i ≤ 4 ,   i = 1, ..., 4 ;

  начальное приближение
         x0  =  ( - 1, - 2, - 3, - 4 )

Unit TMNN1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNN1R_p, MNN1R_p;

function TMNN1R: String;

implementation

function TMNN1R: String;
var
N,_i,IERR :Integer;
F :Real;
RM :Array [0..29] of Real;
IRM :Array [0..3] of Integer;
const
X :Array [0..3] of Real = ( -1.0,-2.0,-3.0,-4.0 );
A :Array [0..3] of Real = ( -4.0,-4.0,-4.0,-4.0 );
B :Array [0..3] of Real = ( 4.0,4.0,4.0,4.0 );
ХЕ :Array [0..3] of Real = ( 0.1E-4,0.1E-4,0.1E-4,0.1E-4 );
FE :Real = 0.1E-4;
I0 :Array [0..3] of Integer = ( 1,1,1,1 );
UP :Array [0..10] of Real = ( 0.1E+3,0.1E+3,1.0E-1,0.1E+2,2.0,1E-1,1E-1,
0.1E-15,0.2E+1,0.2E+2,0.8 );
begin
Result := '';  { результат функции }
{ прототип оператора DАТА на FORTRANе  }
RM[0] := 200.0;
RM[1] := 200.0;
N := 4;
MNN1R(N,X,XE,A,B,FMNN1R,F,FE,UP,I0,IRM,RM,IERR);
Result := Result + Format('%s',[' F']);
Result := Result + Format('%20.16f ',[F]);
Result := Result + Format('%s',[' FE']);
Result := Result + Format('%20.16f ',[FE]);
Result := Result + Format('%s',[#$0D#$0A + ' X']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[#$0D#$0A + ' XE']);
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%20.16f ',[XE[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' RM(1),RM(2)']);
Result := Result + Format(' %20.16f %20.16f ',[RM[0],RM[1]]);
Result := Result + Format('%s',[' IERR']);
Result := Result + Format('%4d ',[IERR]);
Result := Result + Format('%s',[' UP']);
Result := Result + Format(' %20.16f ',[UP[8]]) + #$0D#$0A;
UtRes('TMNN1R',Result);  { вывод результатов в файл TMNN1R.res }
end;

end.

Unit fmnn1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fmnn1r(var X :Array of Real; var F :Real; FE :Real);

implementation

procedure fmnn1r(var X :Array of Real; var F :Real; FE :Real);
begin
F := IntPower(X[0]-1.0,2)+10.0*IntPower(X[1]-1.0,2)+100.0*
    IntPower(X[2]-1.0,2)+1000.0*IntPower(X[3]-1.0,2);
end;

end.

Результаты:

      F    =  0.00000
      FE  =  0.000010
      X    =  1.00000,  1.00000,  1.00000,  1.00000
      XE  =  0.00001,  0.00001,  0.00001,  0.00001

      RM(1)  =  10
      RM(2)  =  60

      IERR  =  12
      UP  =  2.0000 

Примечание: IERR=12 означает, что выполнено одновременно два критерия останова 1 и 2.