|
Текст подпрограммы и версий ( Фортран ) mna6r.zip , mna6d.zip |
Тексты тестовых примеров ( Фортран ) tmna6r.zip , tmna6d.zip |
|
Текст подпрограммы и версий ( Си ) mna6r_c.zip , mna6d_c.zip |
Тексты тестовых примеров ( Си ) tmna6r_c.zip , tmna6d_c.zip |
Поиск локального минимума функции многих переменных методом Пауэлла.
Пусть задана функция 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