Текст подпрограммы и версий
mne1r_p.zip , mne1e_p.zip
Тексты тестовых примеров
tmne1r_p.zip , tmne1e_p.zip

Подпрограмма:  MNE1R (модуль MNE1R_p)

Назначение

Решение задачи безусловной минимизации выпуклой недифференцируемой функции многих переменных субградиентным методом.

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

Для решения задачи:

             min  f(x) ,      x  En , 

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

Коннов И.В. Субградиентный метод последовательной релаксации для решения задач оптимизации. Деп.ВИНИТИ, N 531 - 83.

Демьянов В.Ф., Васильев Л.Ф. Недифференцируемая оптимизация. М.: Наука, 1981.

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

procedure MNE1R(var F :Real; FE :Real; FUNC :Proc_F1_MN;
                var G :Array of Real; var GE :Array of Real;
                var IERR :Integer; var I0 :Array of Integer;
                var N :Integer; var RM :Array of Real; SUBG :Proc_F2_MN;
                var UP :Array of Real; var X :Array of Real;
                var XE :Array of Real);

Параметры

F - вещественная переменная, содержащая вычисленное минимальное значение F (x);
FE - заданная точность решения задачи по функции (тип: вещественный);
FUNC - имя подпрограммы вычисления значения функции F (x) (см. замечания по использованию);
G - вещественный вектор длины  N, содержащий субградиент функции  F в вычисленной точке  X;
GE - вещественный вектор длины  N, задающий точность решения задачи по субградиенту;
IERR - целая переменная, указывающая причину окончания процесса;
IERR=1 - найден минимум с заданной точностью по аргументу;
IERR=2 - найден минимум с заданной точностью по функции;
IERR=3 - найден минимум с заданной точностью по субградиенту;
IERR=4 - выполнено максимальное (см. UP (4)) количество вычислений функции;
IERR=5 - истекло заданное время, отведенное пользователем на решение задачи (см. UP (5));
IERR=6 - произошло замедление счета (см.замечания по использованию);
I0 - целый вектор длины  N, задающий фиксированные на время минимизации компоненты вектора  X: если I0 (I) = 0, то I - ая компонента вектора  X остается равной своему начальному значению;
N - размерность пространства переменных (тип: целый);
RM - вещественный вектор длины 2N, используемый в подпрограмме как рабочий;
SUBG - имя подпрограммы вычисления субградиента функции F (x) (см.замечания по использованию);
UP - вещественный вектор длины 9, задающий управляющие параметры алгоритма;
UP(1) - заданная начальная длина шага;
UP(2) - заданная константа дробления шага, 0 < UP (2) < 1;
UP(3) - заданный коэффициент, определяющий величину убывания функции на одной итерации, 0 < UP (3) < 1;
UP(4) - заданное максимально допустимое количество вычислений функции;
UP(5) - время, отведенное центральному процессору на решение задачи, задается пользователем в секундах;
UP(6),UP(7) - параметры, формирующие критерий замедления счета; рекомендуется задавать на входе UP (6) = 0, тогда эти параметры вычисляются автоматически внутри подпрограммы;
UP(8) - заданный параметр, определяющий, через сколько итераций проводится одномерная минимизация (см. замечания по использованию);
UP(9) - заданный признак печати сообщения об окончании счета: UP (9) = 1 - печатается сообщение о выполнившемся критерии останова, UP (9) = 0 - сообщение не печатается;
X - вещественный вектор длины  N; при обращении к подпрограмме содержит заданную начальную точку поиска, при выходе содержит точку минимума функции f (x);
XE - вещественный вектор длины  N, задающий точность решения задачи по аргументу.

Версии

MNE1E - решение задачи безусловной минимизации выпуклой недифференцируемой функции многих переменных субградиентным методом, при этом вычисления проводятся с расширенной (Extended) точностью. Параметры F, FE, G, GE, RM, X, XE подпрограммы MNE1E и подпрограмм FUNC, SUBG должны иметь тип Extended. Тип остальных параметров не изменяется.

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

MNB8R - подпрограмма минимизации функции многих переменных по заданному направлению методом золотого сечения; вызывается при работе подпрограммы MNE1R.
MNB8E - подпрограмма минимизации по заданному направлению методом золотого сечения; вычисления проводятся с расширенной (Extended) точностью; вызывается при работе подпрограммы MNE1E.

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

  Подпрограммы FUN и SUBG составляются пользователем.
Первый оператор подпрограммы вычисления функции должен иметь вид:
procedure FUN (var X :Array of Real; var F :Real; FE :Real);
Параметры:
X - вещественный вектор длины  N, содержащий текущую точку пространства, в которой вычисляется значение функции;
F - вещественная переменная, содержащая вычисленное значение функции в точке  X;
FE - вещественная переменная, содержащая на входе заданную точность вычисления значения функции в точке  X, а на выходе - достигнутую точность.
  Если значение достигнутой точности вычисления функции неизвестно, то в теле подпрограммы FUN параметр FE не должен переопределяться.
Первый оператор подпрограммы вычисления субградиента должен иметь вид:
procedure SUBG (var X :Array of Real; var G :Array of Real; var GE :Array of Real; var I0 :Array of Integer);
Параметры:
X - вещественный вектор длины  N, содержащий текущую точку пространства, в которой вычисляется субградиент;
G - вещественный вектор длины  N, содержащий вычисленный субградиент (произвольный из множества субградиентов) в точке  X;
GE - вещественный вектор длины  N, содержащий на входе заданную покомпонентную точность вычисления субградиента функции, а на выходе - достигнутую точность вычисления субградиента;
I0 - целый вектор фиксированных компонент, управляющий вычислением компонент субградиента: если I0 (I) = 0, то полагается G (I) = 0.
  Если значение достигнутой точности GE (I) для некоторого  I неизвестно, то в теле подпрограммы SUBG параметр GE (I) не должен переопределяться.

Не рекомендуется проводить одномерную минимизацию на каждой итерации, так как построенное направление не является, вообще говоря, направлением наискорейшего убывания.

Рекомендуется задавать UP (8) > 4, либо UP (8) = 0 (в этом случае одномерная минимизация не проводится).

Для лучшего согласования управляющих параметров в процессе счета полезно задавать начальный шаг достаточно большим.

Признак выхода из подпрограммы по замедлению счета IERR = 6 указывает на слишком медленную сходимость алгоритма, то есть изменение функции на каждой итерации оказывается на несколько порядков меньше, чем разность между текущим значением и минимальным.

При работе подпрограммы MNE1R используются следующие служебные подпрограммы и глобальные записи (структуры данных):
MNE1R1, MNE1R2, MNE1R3, MNE1R4, MNE1R5, MMKRIT, MNR1N, UTMN05, UTMNE1
 _MMKRIC.

При работе подпрограммы MNE1E используются следующие служебные подпрограммы и глобальные записи (структуры данных):
MNE1E1, MNE1E2, MNE1E3, MNE1E4, MNE1E5, _MMKRIE, MNR1NE, UTMN05, UTMNE1
 _MMKRD

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

Найти минимальное значение функции  
      F(x)  =  | x1 + 2 | + | 4x2 - 6 | ;

   начальное приближение  x  =  (- 3., 1.)

Unit tmne1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FCMNE1R_p, FSMNE1R_p, MNE1R_p;

function tmne1r: String;

implementation

function tmne1r: String;
var
_i,IERR :Integer;
F :Real;
G :Array [0..1] of Real;
RM :Array [0..3] of Real;
const
FE :Real = 1.0E-7;
XE :Array [0..1] of Real = ( 1.E-8,1.E-8 );
GE :Array [0..1] of Real = ( 1.E-3,1.E-3 );
UP :Array [0..8] of Real = ( 5.0,0.7,0.3,500.0,600.0,0.0,0.0,10.0,1.0 );
I0 :Array [0..1] of Integer = ( 1,1 );
N :Integer = 2;
X :Array [0..1] of Real = ( -3.0,1.0 );
begin
Result := '';  { результат функции }
MNE1R(F,FE,FCMNE1R,G,GE,IERR,I0,N,RM,FSMNE1R,UP,X,XE);
Result := Result + Format('%s',['  X=']);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
 begin
  Result := Result + Format('%20.16f ',[X[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  F=']);
Result := Result + Format('%20.16f ',[F]);
Result := Result + Format('%s',['  G=']);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
 begin
  Result := Result + Format('%20.16f ',[G[_i]]);
  if ( ((_i+1) mod 2)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',['  IERR=']);
Result := Result + Format('%5d ',[IERR]);
Result := Result + Format('%s',['BPEMЯ CЧETA=']);
Result := Result + Format('%20.16f ',[UP[4]]) + #$0D#$0A;
UtRes('tmne1r',Result);  { вывод результатов в файл tmne1r.res }
exit;
end;

end.

Unit fcmne1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fcmne1r(var X :Array of Real; var F :Real; FE :Real);

implementation

procedure fcmne1r(var X :Array of Real; var F :Real; FE :Real);
var
I :Integer;
ARG :Real;
const
A :Array [0..1] of Real = ( 1.0,4.0 );
B :Array [0..1] of Real = ( -2.0,6.0 );
label
_1;
begin
F := 0.0;
for I:=1 to 2 do
 begin
  ARG := A[I-1]*X[I-1]-B[I-1];
  F := F+Abs(ARG);
_1:
 end;
end;

end.
 
Unit fsmne1r_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

procedure fsmne1r(var X :Array of Real; var G :Array of Real;
                var GE :Array of Real; var I0 :Array of Integer);

implementation

procedure fsmne1r(var X :Array of Real; var G :Array of Real;
                var GE :Array of Real; var I0 :Array of Integer);
var
I :Integer;
ARG :Real;
const
A :Array [0..1] of Real = ( 1.0,4.0 );
B :Array [0..1] of Real = ( -2.0,6.0 );
label
_2,_1;
begin
{   BЫЧИCЛЯET CYБГPAДИEHT Ф-ИИ CONUS }
for I:=1 to 2 do
 begin
  if ( I0[I-1] = 0 ) 
   then goto _2;
  ARG := A[I-1]*X[I-1]-B[I-1];
  G[I-1] := Sign(1.0,ARG)*A[I-1];
  goto _1;
_2:
  G[I-1] := 0.0;
_1:
 end;
end;

end.

Результаты счета: 

   Библиотека НИВЦ МГУ, подпрограмма MNE1R
   Выполнено максимальное количество вычислений функции

          X  = - 2.0000001     1.5000000     
          F  =   0.0000001 

          IERR  =  4