Текст подпрограммы и версий ( Фортран )
mnn1r.zip
Тексты тестовых примеров ( Фортран )
tmnn1r.zip
Текст подпрограммы и версий ( Си )
mnn1r_c.zip
Тексты тестовых примеров ( Си )
tmnn1r_c.zip
Текст подпрограммы и версий ( Паскаль )
mnn1r_p.zip
Тексты тестовых примеров ( Паскаль )
tmnn1r_p.zip

Подпрограмма:  MNN1R

Назначение

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

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

 Для решения задачи
      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 - заданное максимально допустимое число вычислений функции.

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

    SUBROUTINE  MNN1R (N, X, XE, A, B, FUN, F, FE, UP, I0,
                                              IRM, RM, IERR) 

Параметры

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 составляется пользователем.
Первый оператор вычисления функции должен иметь вид:

           SUBROUTINE  FUN (X, F, FE)

      Параметры
      X   - вещественный вектор длины  N, содержащий
              текущую точку пространства, в которой
              вычисляется значение функции;
      F   - вещественная переменная, содержащая
              вычисленное значение функции в точке  X;
      FE - вещественная переменная, содержащая заданную
              точность вычисления значения функции в точке X. 

Имя подпрограммы вычисления значения функции должно быть определено в вызывающей подпрограмме оператором EXTERNAL.

Используются служебные подпрограммы MNN02, MNN04, MNN05, MNN06, MNN07, MNN08, MNN09, UTMN05, MMKRIT и СОММОN - блок 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 )

       DIMENSION  X(4), A(4), B(4), I0(4), UP(11), XE(4), IRM(4), RM(30)
       COMMON  /MNKRIC/ZF, KR, AKR, DF(15)
       REAL  X, XE, A, B, UP, RM, FE
       EXTERNAL  FUNC
       DATA  X /- 1., - 2., - 3., - 4./
       DATA  A /4* - 4./, B /4*4./, XE/4*0.1E - 4/, FE /0.1E - 4/
       DATA  I0 /1, 1, 1, 1/
       DATA  UP /2*0.1E + 3, 1.E - 1, 0.1E + 2, 2., 2*1.E - 1, 0.1E - 15,
      *             0.2E + 1, 0.2E + 2, 0.8/
       DATA  RM(1), RM(2) /200., 200./
       N = 4
       CALL  MNN1R (N, X, XE, A, B, FUNC, F, FE, UP, I0, IRM, RM, IERR)
       STOP
       END

       SUBROUTINE FUNC (X, F, FE)
       REAL  X(4), F, FE
       F = (X(1) - 1.)**2 + 10.0*(X(2) - 1.0)**2 + 100.*
      *(X(3) - 1.0)**2 + 1000.*(X(4) - 1.)**2
       RETURN
       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.