Текст подпрограммы и версий ( Фортран )
mnb4r.zip , mnb4d.zip
Тексты тестовых примеров ( Фортран )
tmnb4r.zip , tmnb4d.zip
Текст подпрограммы и версий ( Си )
mnb4r_c.zip , mnb4d_c.zip
Тексты тестовых примеров ( Си )
tmnb4r_c.zip , tmnb4d_c.zip
Текст подпрограммы и версий ( Паскаль )
mnb4r_p.zip , mnb4e_p.zip
Тексты тестовых примеров ( Паскаль )
tmnb4r_p.zip , tmnb4e_p.zip

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

Назначение

Решение задачи, безусловной минимизации диффеpенциpуемой функции многих переменных методом Дэвидона - Флетчеpа - Пауэлла.

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

Для решения задачи:  min  f (x) ,  x  En используется квазиньютоновский метод Дэвидона - Флетчеpа - Пауэлла.

Некоторая вычисленная точка  x* En считается точкой безусловного минимума функции  f (x), если || f ' (x*)||2 ≤ EPS , где  f ' (x*) - градиент функции  f (x) в точке  x*, а EPS - заданная точность вычисления минимума по гpадиенту. Если

       n 
      ∑   | xjk - xjk-1 |   ≤ EPS ,
     j= 1 

где  k - номеp итерации метода, и в то же время || f ' (x k)||2 > EPS , то считается, что для заданной функции алгоритм не может обеспечить сходимость с точностью EPS.

Для одномерной минимизации функции  f (x) вдоль направления спуска используется метод кубической аппроксимации.

Д.Химмельблау, Прикладное нелинейное программирование. Изд - во "Мир", M., 1975, 122 - 129.

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

    SUBROUTINE  MNB4R (N, M, X, F, G, EST, EPS, LIMIT, IERR,
                                              H, KOUNT, FUN, GRAD) 

Параметры

N - размерность пространства переменных (тип: целый);
M - целая переменная, равная N * (N + 7)/2;
X - вещественный вектоp длины  N; при обращении к подпрограмме содержит заданную начальную точку поиска; на выходе содержит точку минимального вычисленного значения  f (x);
F - вещественная переменная, содержащая минимальное значение функции  f (x);
G - вещественный вектоp длины  N, содержащий градиент функции  f (x) в вычисленной точке минимума;
EST - заданное приближенное значение безусловного минимума функции  f (x) (см. замечания по использованию) (тип: вещественный);
EPS - заданная точность вычисления минимума по градиенту (тип: вещественный);
LIMIT - заданное максимально допустимое число итераций метода (тип: целый);
IERR - целочисленная переменная, указывающая пpичину окончания процесса:
IERR= -1 - нет сходимости;
IERR=  0 - найден минимум с заданной точностью;
IERR=  1 - выполнено LIMIT итераций;
IERR=  2 - функция не имеет минимума в некотоpом направлении;
H - вещественный вектоp длины  M, используемый в подпрограмме как рабочий;
KOUNT - целая переменная, содержащая фактически выполненное число итераций метода (тип: целый);
FUN - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию);
GRAD - имя подпрограммы вычисления градиента функции  f (x) (см. замечания по использованию).

Версии:

MNB4D - Решение задачи безусловной минимизации диффеpенциpуемой функции многих переменных методом Дэвидона - Флетчеpа - Пауэлла, при этом вычисления проводятся с удвоенной точностью. Параметры X, F, G, EST, EPS, H, FE, GE подпрограммы MNB4D и подпрограмм FUN, GRAD должны иметь тип DOUBLE PRECISION. Тип остальных параметров не изменяется.

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

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

 

Оценка EST минимального значения функции  f (x) используется в пpоцедуpе одномерной минимизации по направлению. Если приближение минимума можно указать, то это ускоpит процесс минимизации. В противном случае можно положить EST = 0.0 .

Подпрограммы FUN и GRAD составляются пользователем.

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

         SUBROUTINE  FUN (X, F, FE)

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

Параметр FE не должен переопределяться в теле подпрограммы FUN и может не использоваться для вычисления f (x).

Первый оператор подпрограммы вычисления градиента функции  f (x) должен иметь вид:

         SUBROUTINE  GRAD (X, G, GE, IO)

         Параметры      
          X  - вещественный вектор длины  N, задающий точку
                 пространства, в которой вычисляется градиент;
          G  - вещественный вектоp длины  N, содержащий
                  вычисленный градиент функции в точке X;
         GE - заданная точность вычисления компонент
                  градиента (тип: вещественный);
         IO - целочисленная  переменная,  используемая  как рабочая. 

Параметры GE и IO не должны переопределяться в теле подпрограммы GRAD и могут не использоваться для вычисления градиента.

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

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

    min  f(x) ,     x  E3 .
    f(x)  =  100 (x3 - 0.25 (x1 + x2)2)2 + (1 - x1)2 + (1 - x2)2 .

   Точка безусловного минимума   x* = (1., 1., 1.) ,    f(x*) = 0.0 .
                                                       
       DIMENSION  X(3), G(3), H(15)
       EXTERNAL  FD19, GD19
       DATA  N, LIMIT /3, 100/
       DATA  X(1), X(2), X(3) /-1.2, 2., 0./
       EPS = 0.1E-4
       EST = 0.0
       M = N*(N + 7)/2
       CALL  MNB4R (N, M, X, F, G, EST, EPS, LIMIT, IERR, H,
      *                          KOUNT, FD19, GD19)

       SUBROUTINE  FD19 (X, F, FE)
       DIMENSION  X(3)
       F = 100.*( X(3) - 0.25*(X(1) + X(2))**2 )**2 + (1. - X(1))**2 +
      *      (1. - X(2))**2
       RETURN
       END

       SUBROUTINE  GD19 (X, G, GE, IO)
       DIMENSION  X(3), G(3)
       G(1) = -100.*( X(1) + X(2) )*( X(3) - 0.25*(X(1) + X(2))**2 ) -
      *         2*(1. - X(1) )
       G(2) = -100.*( X(1) + X(2))*( X(3) - 0.25*(X(1) + X(2))**2 ) -
      *         2*(1. - X(2) )
       G(3) = 200.*( X(3) - 0.25*(X(1) + X(2))**2 )
       RETURN
       END

Результаты:

      IERR = 0
      ЧИCЛO ИTEPAЦИЙ  =  18
      ЗHAЧEHИE ФУHKЦИИ  =  0.0000000+00
 
      ЗHAЧEHИЯ HEЗABИСИМЫХ ПEPEMEHHЫX
      X(1)  =  0.10000000+01
      X(2)  =  0.10000000+01
      X(3)  =  0.10000000+01