|
Текст подпрограммы и версий ( Фортран ) mnr5r.zip |
Тексты тестовых примеров ( Фортран ) tmnr5r.zip |
|
Текст подпрограммы и версий ( Си ) mnr5r_c.zip |
Тексты тестовых примеров ( Си ) tmnr5r_c.zip |
|
Текст подпрограммы и версий ( Паскаль ) mnr5r_p.zip |
Тексты тестовых примеров ( Паскаль ) tmnr5r_p.zip |
Решение задачи минимизации дифференцируемой функции многих переменных при наличии линейных ограничений методом условного градиента.
Для решения задачи:
min f(x) , x∈Q ,
x
где Q = { x: A1*x = B1 , A ≤ x ≤ B } ,
x, A, B - векторы из En ,
B1 - вектор из Em ,
A1 - вещественная матрица m * n .
Используется модификация метода условного градиета. В процессе счета каждое новое приближение определяется по формуле:
xk+1 = xk + αk(yk - xk) ,
где yk - минимум линейной функции
< f ' (xk), x - xk >
при x ∈ Q;
f ' (xk) - градиент
функции f точке xk;
αk -
величина шага по направлению спуска
pk = yk - xk.
B программе предусмотрены четыре критерия останова: по времени, по числу итераций, по величине сдвига в пространстве аргумента и по изменению функции.
SUBROUTINE MNR5R (N, M, X, XE, I0, A, B, B1, LA, A1, NS, T,
FUNC, F, FE, GRAD, G, GE, UP, RM,
IRM, IRM1, IERR)
Параметры
| N - | размерность пространства переменных (тип: целый); |
| M - | целая переменная, значение которой полагается равным m + 2, где m - число стpок в матрице линейных ограничений; |
| X - | вещественный вектоp длины N; на входе содержит начальное приближение; на выходе содержит компоненты вектоpа x, отвечающего наименьшему найденному значению f (x); |
| XE - | вещественный вектоp длины N заданных значений абсолютной точности по аргументу (см. замечания по использованию); |
| I0 - | целый вектоp длины N, с помощью которого можно фиксировать на время минимизации компоненты вектоpа X: если I0 (J) = 0, то J - ая компонента вектоpа X остается равной своему начальному значению, в противном случае следует положить I0 (J) = 1; |
| A - | вещественный вектоp длины N, задающий ограничения снизу на переменные; |
| B - | вещественный вектоp длины N, задающий ограничения свеpху на переменные; |
| B1 - | вещественный вектоp длины M, задающий правые части системы линейных ограничений; |
| LA - | число ненулевых элементов в матрице условий (тип: целый); |
| A1 - | вещественный вектоp длины LA, содержащий ненулевые элементы матрицы условий (см. замечания по использованию); |
| NS - | целый вектоp длины LA, содержащий номера строк ненулевых элементов матрицы условий; |
| T - | вещественный вектоp длины N, содержащий заданное количество ненулевых элементов в матрице условий по столбцам: число T (J) pавно количеству ненулевых элементов в J - ом столбце матрицы; |
| FUNC - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию); |
| F - | вещественная переменная, равная наименьшему найденному значению функции; |
| FE - | заданная абсолютная погрешность вычисления функции (тип: вещественный); |
| GRAD - | имя подпрограммы, вычисляющей градиент функции f (x) (см. замечания по использованию); |
| G - | вещественный вектоp длины N, содержащий компоненты градиента; |
| GE - | вещественный вектоp длины N, задающий значения абсолютной точности по компонентам градиента; |
| UP - | вещественный вектоp длины 4 заданных управляющих параметров: |
| UP(1) - | заданное максимально допустимое время счета в секундах; |
| UP(2) - | заданная константа управления точностью по X, 10 > UP (2) > 1 (см. замечания по использованию); |
| UP(3) - | заданная константа управления точностью функции, 10 > UP (3) > 1 (см. замечания по использованию); |
| UP(4) - | заданная относительная погрешность невязки r (r = A1 * x - B1) (см. замечания по использованию); |
| RM - |
вещественный вектоp длины
10 + 8N + M + M * M; при обращении к подпрограмме: |
| RM(1) - | заданное максимально допустимое число итераций; |
| при выходе из подпрограммы: |
| RM(1) - | выполненное число итераций; |
| RM(2) - | выполненное число вычислений функции; |
| RM(3) - | выполненное число вычислений градиента; |
| остальные компоненты вектоpа RM используются как рабочие; |
| IRM - | целый вектоp длины 2N+5+[N/16], используемый как рабочий; |
| IRM1 - | целый вектоp длины 2N , используемый как рабочий; |
| IERR - | целая переменная, указывающая причину окончания счета, при этом: |
| IERR= 1 - | шаг по аргументу стал меньше заданной точности по аргументу; |
| IERR= 2 - | изменение функции стало меньше заданной точности FE; |
| IERR= 4 - | выполнено заданное число итераций; |
| IERR= 5 - | истекло время, заданное для решения задачи. |
| IERR=65 - | множество Q пусто. |
| Если выполнено одновременно несколько критериев окончания счета, то IERR = (IERR1) + (IERR2) * 10 + (IERR3) * 102 и т.д. Например, IERR = 24 означает, что IERR1 = 2, IERR2 = 4. |
Версии: нет
Вызываемые подпрограммы
| MNK3R, ML03R. |
Замечания по использованию
| 1. |
Вектоp XE - заданный положительный вектоp; точностью по аргументу называется абсолютная величина проекции этого вектоpа на направление сдвига. |
| 2. |
B массиве A1 задаются ненулевые элементы матрицы условий (по столбцам). Каждый элемент A1 содержит очередной ненулевой элемент ai j. В массиве NS задаются номера строк ненулевых элементов, т.е. если ai j ≠ 0 и A1 (k) = ai j , то NS (k) = 1. |
| 3. |
Подпрограмма FUNC составляется пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид: SUBROUTINE FUNC (X, F, FE)
Параметры
X - вещественный вектор длины N, задающий
точку пространства, в которой вычисляется
значение функции;
F - вещественная переменная, содержащая
вычисленное значение функции в точке X;
FE - заданная точность вычисления функции в
точке X (тип: вещественный).
Параметр FE не должен переопределяться в теле подпрограммы FUNC и может не использоваться при вычислении f (x). Если время вычисления f (x) зависит от требуемой точности, то следует вычислять f (x) с точностью не большей, чем FE. |
| 4. |
Подпрограмма GRAD составляется пользователем. Первый оператор подпрограммы вычисления градиента должен иметь вид: SUBROUTINE GRAD (X, G, GE, I0)
Параметры
X - вещественный вектор длины N, задающий
точку пространства, в которой вычисляется градиент;
G - вещественный вектоp длины N, содержащий
вычисленный градиент функции в точке X;
GE - вещественный вектоp длины N, содержащий
абсолютные точности, с которыми требуется
вычислить компоненты градиента;
I0 - целый вектоp длины N, используемый при
вычислении градиента: если I0(J) = 1,
то в G(J) засылается значение J-ой
компоненты градиента, если I0(J) = 0,
то в G(J) засылается 0.
|
| 5. |
Константы UP (2) и UP (3) используются для ускорения вычислений путем снижения точности вычислений в начале процесса минимизации, а именно, счет начинается при XE0 (I) = XE (I) (UP (2))5 и FE0 = FE * (UP (3))5, постепенно точность повышается и, если не срабатывают другие критерии окончания счета, то конечная точность вычислений совпадает с требуемой. Kонстанта UP (4) используется при решении вспомогательной задачи линейного программирования, а именно, абсолютная невязка считается допустимой, если она меньше || B1 || * UP (4). |
| 6. | Используются служебные подпрограммы: MNR1S, MNR1N, MNR51, MNR52, MNR53, MNR54, MNR55, MNR56, ML07R, MLU43. |
min f(x) = 4x12 + 3x22
x1 + 3x2 - x3 = 5
0.5x1 + 2x2 - x4 = 2
10-6 ≤ x1 ≤ 5
10-6 ≤ x2 ≤ 5
10-6 ≤ x3 ≤ 5
10-6 ≤ x4 ≤ 5
INTEGER*2 IRM1(8)
INTEGER I0(4), N, M, DA, IRM(14), IERR, NS(6)
REAL X(4), A(4), B(4), B1(4), A1(6), T(4), F, FE, G(4), UP(4), RM(62)
REAL XE(4), GE(4)
DATA I0 /4*1/, X /5., 0.1, 1., 1./
DATA GE /4*1.E - 6/, XE /4*0.1E - 10/
DATA A /4*1.E - 6/, B /4*5./
DATA A1 /1., 0.5, 3., 2., - 1., - 1./, B1 /5., 2., 0., 0./
DATA T /2., 2., 1., 1./, FE /0.1E - 6/, NS /1, 2, 1, 2, 1, 2/
DATA UP /100., 3., 2., 1.E - 12/
EXTERNAL GRAD, FUNC
LA = 6
M = 4
N = 4
RM(1) = 20
CALL MNR5R (N, M, X, XE, I0, A, B, B1, LA, A1, NS, T, FUNC,
* F, FE, GRAD, G, GE, UP, RM, IRM, IRM1,IERR)
SUBROUTINE FUNC (X, F, FE)
REAL X(4), F, FE
F = 4*X(1)*X(1) + 3*X(2)*X(2)
RETURN
END
SUBROUTINE GRAD (X, G, GE, I0)
REAL X(4), G(4), GE(4)
INTEGER I0(4)
DO 3 I = 1, 4
3 G(I) = 0.
IF(I0(1) .EQ. 0) GO TO 1
G(1) = 8*X(1)
1 IF(I0(2) .EQ. 0) GO TO 2
G(2) = 6*X(2)
2 RETURN
END
Результаты:
IERR = 2 ; KOЛИЧECTBO ИTEPAЦИЙ = 7 ;
NF (KOЛИЧECTBO BЫЧИCЛEHИЙ ФУHKЦИИ) = 8 ;
NG (KOЛИЧECTBO BЫЧИCЛEHИЙ ГPAДИEHTA) = 22 ;
F = 7.692 ;
X = (0.3846, 1.538, 10-6, 1.269) .