Текст подпрограммы и версий ( Фортран )
mna6r.zip , mna6d.zip
Тексты тестовых примеров ( Фортран )
tmna6r.zip , tmna6d.zip
Текст подпрограммы и версий ( Си )
mna6r_c.zip , mna6d_c.zip
Тексты тестовых примеров ( Си )
tmna6r_c.zip , tmna6d_c.zip

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

Назначение

Поиск локального минимума функции многих переменных методом Пауэлла.

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

Пусть задана функция  N переменных F (x1, x2, ..., xN) и пусть известны координаты начальной точки X = (x*1, x*2, ..., x*N) поиска локального минимума (N ≤ 50).

Подпрограмма MNA6R выполняет итерационный процесс, состоящий в проведении последовательных одномерных поисков минимумов, начиная с точки  X, вдоль системы определяемых в самой подпрограмме сопряженных направлений. В качестве начальных направлений поиска выбираются направления координатных осей в пространстве En.

Итерационный процесс продолжаетася до тех пор, пока модуль разности между значениями функции  F в точках приближения к минимуму на двух последних итерациях не станет меньше EPS.

Предполагается, что составляемая пользователем подпрограмма - функция вычисления  F в текущей точке XTEC всегда имеет имя FUNC и оформляется с двумя формальными параметрами:

XTEC - вещественный вектор длины  N, содержащий координаты точки, в которой вычисляется значение функции  F;

N - количество переменных (тип: целый).

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

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

    SUBROUTINE  MNA6R (N, X, Y, P, EPS, IFLAG, ITMAX) 

Параметры

N - количество переменных; N ≤ 50 (тип: целый);
X - вещественный вектор длины  N, содержащий на входе координаты начальной точки поиска локального минимума, а на выходе - координаты этого минимума;
Y - вещественная переменная, содержащая на выходе значение функции  F в полученной точке минимума;
P - вещественный двумерный массив размеров N на N, используемый в подпрограмме в качестве рабочего;
EPS - заданное допустимое отклонение между значениями функции  F на двух последовательных итерациях (тип: вещественный);
IFLAG - целая переменная, служащая для сообщения о том, удалось ли найти локальный минимум за ITMAX итераций; при этом:
IFLAG=0 - когда минимум функции  F не найден; тогда вектор  X содержит приближение к минимуму на последней итерации, а Y - значение  F в этой точке;
IFLAG=1 - когда точка минимум найдена;
ITMAX - заданное максимальное число итераций (тип: целый).

Версии

MNA6D - поиск локального минимума функции многих переменных методом Пауэлла в режиме удвоенной точности; при этом параметры X, Y, P и EPS должны иметь тип DOUBLE PRECISION, а подпрограмма - функция FUNC должна быть описана как DOUBLE PRECISION  FUNCTION.

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

       MNA1R -
       MNA1D  
локализация минимума функции одной переменной в режимах одинарной и удвоенной точности; используются в подпрограммах MNA6R и MNA6D соответственно;
       MNA3R -
       MNA3D  
поиск локального минимума функции одной переменной методом Брента (методом обратной параболической интерполяции) в режимах одинарной и удвоенной точности; используются в подпрограммах MNA6R и MNA6D соответственно.

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

 

В подпрограммах MNA6R и MNA6D имеется общий блок COMMON /MNA6RR/ ITER. Переменная ITER полагается равной количеству итераций, выполненных при поиске минимума функции. Если IFLAG = 0, то ITER = ITMAX. В этом случае следует либо увеличить ITMAX, либо увеличить EPS.

В качестве рабочих используются подпрограммы MNA6R1 (MNA6D1) и MNA6R2 (MNA6D2), в которых имеется общий блок с именем MNA6RC.

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

       REAL  X1(2), P1(2, 2), X2(2), P2(2, 2) 
       COMMON  NTEST 
       COMMON /MNA6RR/ ITER 
       NTEST = 1 
       N = 2 
       X1(1) = 8.0 
       X1(2) = 9.0 
       EPS = 1.E - 6 
       ITMAX = 500 
       CALL  MNA6R (N, X1, Y, P1, EPS, IFLAG, ITMAX) 
       NTEST = 2 
       X2(1) = 1.2 
       X2(2) = 1.0 
       CALL  MNA6R (N, X2, Y, P2, EPS, IFLAG, ITMAX) 

       REAL FUNCTION  FUNC (X, N) 
       DIMENSION  X(N) 
       COMMON  NTEST 
       IF(NTEST .NE. 1) GO TO 1 
       FUNC = 4.0*(X(1) - 0.5)**2 + (X(2) - 6.0)**2 
       RETURN 
    1 FUNC = 100.0*(X(2) - X(1)**2)**2 + (1.0 - X(1))**2 
       RETURN 
       END 

Результаты: 

      X1(1) = 0.5 ;            X1(2) = 6.0 ;   Y = 0.0 
      IFLAG = 1 ;             ITER = 3 

      X2(1) = 1.00001 ;     X2(2) = 1.0 ;   Y = 0.295415E - 7 
      IFLAG = 1 ;              ITER = 2