|
Текст подпрограммы и версий mnk3r_p.zip |
Тексты тестовых примеров tmnk3r_p.zip |
Решение задачи минимизации диффеpенциpуемой функции многих переменных по заданному направлению (задача одномерной минимизации) методами линейной и квадратичной аппроксимации производной по направлению.
Для решения задачи
min f(x0 - h p0) , 0 ≤ h ≤ hL < +∞ , x0 ∈ EN , p0 ∈ EN , h
x0 и p0 заданы, используются последовательно методы линейной и квадратичной аппроксимации производной по направлению ( f ' (x0 - h p0), p0 ) .
Минимум f (x) по направлению p0 считается найденным, если выполнено одно из следующих условий:
| 1. | | hK - hK + 1| < EPS1 , где hK, hK + 1 - два последовательных шага по направлению p0, EPS1 - заданная абсолютная точность одномерной минимизации; |
| 2. | | hK - hK + 1| / hK < EPS2, где EPS2 - заданная относительная точность одномерной минимизации; |
| 3. | | fi' (x0 - hK p0)| < EPSGi для всех i = 1, 2, ..., N, где EPSG - вектоp покомпонентной точности вычисления градиента в точке x0 - hK p0; |
| 4. |
| ( fi' (x0 - hK p0), p0) | < max { max EPSGi, 10 -1 -EM/2} ,
i = 1, 2, ..., N
где EM - максимальный порядок абсолютной величины
вещественной константы;
|
| 5. | K ≥ Kmax , где Kmax - максимально допустимое количество вычислений градиента. |
Алгоритм является модификацией алгоритма одномерной минимизации, изложенного в работе:
B.A.Cкоков, Стандартная программа минимизации диффеpенциpуемой функции многих переменных методом сопряженных градиентов, серия "Стандартные программы решения задач математического программирования", вып.10, Изд - во МГУ, 1968, ротапринт.
procedure MNK3R(var N :Integer; var I1 :Array of Integer;
var P :Array of Real; HB :Real; var HT :Real;
var XT :Array of Real; var FT :Real; var FTE :Real;
var G1 :Array of Real; var G1E :Array of Real;
FUNC :Proc_F1_MN; GRAD :Proc_F2_MN; var UP :Array of Real;
var WP :Array of Integer; var RM :Array of Real);
Параметры
| N - | размерность пространства переменных (тип: целый); |
| I0 - | целый вектоp длины N, задающий фиксированные на время минимизации компоненты вектоpа X: если I0 (I) = 0, то I - ая компонента вектоpа X остается равной своему начальному значению; |
| P - | вещественный вектоp длины N, задающий направление одномерной минимизации p0; |
| HL - | правый конец отрезка одномерной минимизации hL (тип: вещественный); |
| H - | вещественная переменная, содержащая на входе заданный начальный шаг одномерного поиска, а на выходе - расстояние от начальной точки поиска до вычисленной точки минимума; |
| X - | вещественный вектоp длины N, содержащий на входе начальную точку x0 поиска минимума f (x) по направлению p0, а на выходе - точку минимального вычисленного значения f (x); |
| F - | вещественная переменная, содержащая на входе значение функции в начальной точке x0, а на выходе - вычисленное минимальное значение функции вдоль направления p0; |
| FE - | вещественная переменная, содержащая на входе заданную точность вычисления значений функции, а на выходе - точность вычисления функции в точке минимума; |
| G - | вещественный вектоp длины N, содержащий на входе градиент функции в начальной точке x0, а на выходе - градиент функции в вычисленной точке минимума; |
| GE - | вещественный вектоp длины N, содержащий на входе заданную покомпонентную точность вычисления градиента, а на выходе - точность вычисления градиента в точке минимума; |
| FUNC - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию); |
| GRAD - | имя подпрограммы вычисления градиента функции (см. замечания по использованию); |
| UP - | вещественный вектоp длины 6, задающий упpавляющие параметры алгоритма: |
| UP(1) - | заданный признак; если UP (1) = 2, то для построения линейной аппроксимации используется алгоритм удвоения пробных шагов; если UP (1) = 1, то используется постоянный шаг (см. замечания по использованию); |
| UP(2) - | заданная точность одномерной минимизации (относительная при UP (3) = 1, абсолютная при UP (3) ≠ 1); |
| UP(3) - | признак: UP (3) = 1, если задана относительная точность одномерной минимизации; UP (3) ≠ 1, если задана абсолютная точность; |
| UP(4) - | заданное максимально допустимое количество вычислений градиента; |
| UP(5) - | максимальный порядок абсолютной величины вещественной константы; |
| UP(6) - | максимальное количество десятичных значащих цифр в вещественной константе; |
| IP - | целый вектоp длины 4, содержащий на выходе: |
| IP(1) - | количество вычислений функции при одномерной минимизации; |
| IP(2) - | количество вычислений градиента при одномерной минимизации; |
| IP(3) - | признак: если IP (3) = 0, то вычисление градиента G в точке минимума не производилось; если IP (3) = 1, то в G содержится вычисленное значение градиента в точке минимума; |
| IP(4) - | признак: если IP (4) = 0, то одномерный минимум функции найден и лежит внутpи отрезка [0, HL]; если IP (4) = 1, то минимум достигается в точке HL; если IP (4) = 2, то функция f (x) не убывает по направлению p0 и алгоритм не может обеспечить сходимость (см. замечания по использованию); |
| RM - | вещественный вектоp длины 2 * N, используемый в подпрограмме как рабочий. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Подпрограммы FUNC и GRAD составляются пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид:
procedure FUNC (var X :Array of Real; var F :Real; FE :Real);
Параметры
X - вещественный вектор длины N, задающий точку
пространства, в которой вычисляется значение функции;
F - вещественная переменная, содержащая
вычисленное значение функции в точке X;
FE - вещественная переменная, содержащая на входе
заданную точность вычисления значения функции
в точке X; на выходе - достигнутую точность.
Если значение достигнутой точности вычисления функции не известно, то в теле подпрограммы FUNC параметр FE не должен переопределяться. Первый оператор подпрограммы вычисления градиента функции f (x) должен иметь вид:
procedure GRAD (var X :Array of Real; var G :Array of Real;
var GE :Array of Real; var I0 :Array of Integer);
Параметры
X - вещественный вектор длины N, задающий точку
пространства, в которой вычисляется градиент;
G - вещественный вектоp длины N, содержащий
градиент функции в точке X;
GE - вещественный вектоp длины N, содержащий на
входе заданную покомпонентную точность
вычисления градиента функции; на выходе -
достигнутую точность вычисления градиента;
I0 - целый вектоp фиксированных компонент,
упpавляющий вычислением компонент градиента:
если I0(I) = 0, то полагается G(I) = 0 .
Если значение достигнутой точности GE (I) для некоторого I не известно, то в теле подпрограммы GRAD параметр GE не должен переопределяться. Если решается задача безусловной минимизации функции по направлению p0, то следует задать HL = C, где C - достаточно большое представимое в машине вещественное число. B общем случае наибольшее влияние на эффективность программы оказывает выбор начального шага одномерной минимизации H и значения параметра UP (1). При одномерной минимизации функции f (x) на направлении p0 вначале ищется отрезок для построения линейной аппроксимации производной по направлению с помощью постоянного шага (при UP (1) = 1) или алгоритма удвоения пробных шагов (при UP (1) = 2). Затем последовательно осуществляется линейная и квадратичные аппроксимации производной по направлению. Если функция многоэкстремальна, то при некоторых значениях H алгоритм может не обеспечить сходимость к ближайшей к x0 точке локального одномерного минимума. В этом случае, а также в случае неубывания функции по направлению p0 (IP (4) = 2) следует уменьшить начальный шаг H и задать UP (1) = 1 . Используются служебные подпрограммы: MNKU1, MNKU3, MNKU5, MNKU6, MNKO2, MNKO3. |
min F(x) , x ∈ E1 , x0 = 0.0 , p0 = -1.0 ,
F(x) = 100 e -x + x .
Точка минимума F(x) вдоль p0 pавна x* = - ln(0.01) ,
F(x*) = 1 - ln(0.01)
Unit TMNK3R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNK3R_p, FGMNK3R_p, MNK3R_p;
function TMNK3R: String;
implementation
function TMNK3R: String;
var
F :Real;
P :Array [0..0] of Real;
X :Array [0..0] of Real;
G :Array [0..0] of Real;
GE :Array [0..0] of Real;
RM :Array [0..1] of Real;
I0 :Array [0..0] of Integer;
IP :Array [0..3] of Integer;
const
N :Integer = 1;
H :Real = 0.5;
HL :Real = 1.0E+10;
FE :Real = 1.0E-07;
UP :Array [0..5] of Real = ( 2.0,1.0E-06,2.0,50.0,18.0,12.0 );
begin
Result := ''; { результат функции }
{ прототип оператора DАТА на FORTRANе }
I0[0] := 1;
P[0] := -1.0;
X[0] := 0.0;
GE[0] := 1.0E-07;
FMNK3R(X,F,FE);
FGMNK3R(X,G,GE,I0);
MNK3R(N,I0,P,HL,H,X,F,FE,G,GE,FMNK3R,FGMNK3R,UP,IP,RM);
Result := Result + Format('%s',[' BЫЧИCЛ. ФYHKЦИИ']);
Result := Result + Format('%2d ',[IP[0]]);
Result := Result + Format('%s',[' BЫЧИCЛ. ГPAДИEHTA']);
Result := Result + Format('%3d ',[IP[1]]);
Result := Result + Format('%s',[' ' + #$0D#$0A]);
Result := Result + Format('%s',[' X=']);
Result := Result + Format('%20.16f ',[X[0]]);
Result := Result + Format('%s',[' F=']);
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
UtRes('TMNK3R',Result); { вывод результатов в файл TMNK3R.res }
exit;
end;
end.
Unit fmnk3r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure fmnk3r(var X :Array of Real; var F :Real; FE :Real);
implementation
procedure fmnk3r(var X :Array of Real; var F :Real; FE :Real);
begin
F := 100.0*Exp(-X[0])+X[0];
end;
end.
Unit fgmnk3r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure fgmnk3r(var X :Array of Real; var G :Array of Real;
var GE :Array of Real; var I0 :Array of Integer);
implementation
procedure fgmnk3r(var X :Array of Real; var G :Array of Real;
var GE :Array of Real; var I0 :Array of Integer);
begin
G[0] := -100.0*Exp(-X[0])+1.0;
end;
end.
Результаты счета:
BЫЧИCЛЕНИЙ ФУHKЦИИ 1 BЫЧИCЛЕНИЙ ГPAДИEHTA 10
X = 4.6051700 + 00 F = 5.6051700 + 00