Текст подпрограммы и версий
mnb3r_p.zip
Тексты тестовых примеров
tmnb3r_p.zip

Подпрограмма:  MNB3R (модуль MNB3R_p)

Назначение

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

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

Для решения задачи:  min  f (x) ,  x  En используется метод Флетчера - Ривса. Некоторая вычисленная точка  x* En считается точкой безусловного минимума функции  f (x), если || f ' (x*)||2 ≤ EPS , где  f ' (x*) - градиент функции  f (x) в точке  x*, а EPS - заданная точность вычисления минимума по гpадиенту. Если

       n 
      ∑   | xjk - xjk-1 |   ≤ EPS ,
     j= 1 

где  k - номеp итерации метода, и в то же время || f ' (x k)||2 > EPS , то считается, что для заданной функции алгоритм не может обеспечить сходимость с точностью EPS.

Для одномерной минимизации функции  f (x) вдоль направления спуска используется метод кубической аппроксимации.

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

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

procedure MNB3R(N :Integer; M :Integer; var X :Array of Real;
                var F :Real; var G :Array of Real; EST :Real;
                var EPS :Real; LIMIT :Integer; var IERR :Integer;
                var H :Array of Real; var KOUNT :Integer; FUN :Proc_F1_MN;
                GRAD :Proc_F3_MN);

Параметры

N - размерность пространства переменных (тип: целый);
M - целочисленная переменная, равная 2 * N;
X1 - вещественный вектоp длины  N: при обращении к подпрограмме содержит заданную начальную точку поиска, на выходе содержит точку минимального вычисленого значения  f (x);
F - вещественная переменная, содержащая вычисленное минимальное значение функции  f (x);
G - вещественный вектоp длины  N, содержащий градиент функции  f (x) в вычисленной точке минимума;
EST - заданное приближенное значение безусловного минимума функции  f (x) (см. замечания по использованию) (тип: вещественный);
EPS - заданная точность вычисления минимума по градиенту (тип: вещественный);
LIMIT - заданное максимальное допустимое число итераций метода (тип: целый);
IERR - целочисленная переменная, указывающая пpичину окончания процесса:
IERR= -1 - нет сходимости;
IERR=  0 - найден минимум с заданной точностью;
IERR=  1 - выполнено LIMIT итераций;
IERR=  2 - установлено, что в некотоpом направлении функция  f (x) не имеет минимума;
H - вещественный вектоp длины  M, используемый в подпрограмме как рабочий;
KOUNT - целая переменная, содержащая фактически выполненное число итераций метода;
FUN - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию);
GRAD - имя подпрограммы вычисления градиента функции  f (x) (см. замечания по использованию).

Версии: нет

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

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

 

Оценка EST минимального значения функции  f (x) используется в пpоцедуpе одномерной минимизации по направлению. Если приближенное значение минимума можно указать, то это ускоpит процесс минимизации. В противном случае можно положить EST := 0.0.

Подпрограммы FUN и GRAD составляются пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид:

         procedure FUN (var X1 :Array of Real; var F :Real; FE :Real);

         Параметры       
         X1 - вещественный вектор  N длины задающий точку
                 пространства, в которой  вычисляется значение функции;
          F  - вещественная переменная, содержащая
                 вычисленное значение функции в точке X1;
         FE - заданная точность вычисления значения функции
                 в точке X1 (тип: вещественный);  

Параметр FE не должен переопределяться в теле подпрограммы FUN и может не использоваться для вычисления f (x).

Первый оператор подпрограммы вычисления градиента функции  f (x)должен иметь вид:

      procedure GRAD (var X1 :Array of Real; var G :Array of Real; GE :Real; IO :Integer);

         Параметры      
         X1 - вещественный вектор  N длины задающий точку
                 пространства, в которой вычисляется градиент;
          G  - вещественный вектоp длины  N, содержащий
                  вычисленный градиент функции в точке X1;
         GE - заданная точность вычисления компонент
                  градиента (тип: вещественный);
         IO - целочисленная  переменная,  используемая  как рабочая. 

Параметры GE и IO не должны переопределяться в теле подпрограммы GRAD и могут не использоваться для вычисления градиента.

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

    min  F(x) ,    x  E4 .
    F(x)  =  100 ( x2 - x12 )2 + (1 - x1)2 + 90 (x4 - x3)2 + (1 - x3)2 + 
            + (1 - x3)2 + 10.1 ( (x2 - 1)2 + (x4 - 1)2 ) + 19.8 (x2 - 1) (x4 - 1) .
  Точка абсолютного минимума     x*  =  (1., 1., 1., 1.) ,   F(x*)  =  0.

Unit TMNB3R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNB3R_p, FGMNB3R_p, MNB3R_p;

function TMNB3R: String;

implementation

function TMNB3R: String;
var
M,J,IERR,KOUNT :Integer;
EPS,EST,F :Real;
X :Array [0..3] of Real;
G :Array [0..3] of Real;
H :Array [0..7] of Real;
const
N :Integer = 4;
LIMIT :Integer = 100;
label
_100;
begin
Result := '';  { результат функции }
{ прототип оператора DАТА на FORTRANе  }
X[0] := -3.0;
X[1] := -1.0;
X[2] := -3.0;
X[3] := -1.0;
EPS := 0.1E-10;
EST := 0.0;
M := 2*N;
MNB3R(N,M,X,F,G,EST,EPS,LIMIT,IERR,H,KOUNT
     ,FMNB3R,FGMNB3R);
Result := Result + Format('%s',['  IERR = ']);
Result := Result + Format('%3d ',[IERR]);
Result := Result + Format('%s',['      F = ']);
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
for J:=1 to N do
 begin
  Result := Result + Format('%s',['  X(']);
  Result := Result + Format('%2d ',[J]);
  Result := Result + Format('%s',[') = ']);
  Result := Result + Format('%20.16f ',[X[J-1]]) + #$0D#$0A;
_100:
 end;
Result := Result + Format('%s',['  ИТЕРАЦИЙ - ']);
Result := Result + Format('%5d ',[KOUNT]) + #$0D#$0A;
UtRes('TMNB3R',Result);  { вывод результатов в файл TMNB3R.res }
exit;
end;

end.

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

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

implementation

procedure fmnb3r(var X :Array of Real; var F :Real; FE :Real);
begin
F := 100.0*IntPower((X[1]-IntPower(X[0],2)),2)
    +IntPower(1.0-X[0],2)+90.0*IntPower((X[3]-IntPower(X[2],2)),2)+IntPower(1.0-X[2],2)+10.1
    *(IntPower(X[1]-1.0,2)+IntPower(X[3]-1.0,2))+19.8*(X[1]-1.0)*(X[3]-1.0);
end;

end.

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

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

implementation

procedure fgmnb3r(var X :Array of Real; var G :Array of Real; GE :Real;
                I0 :Integer);
begin
G[0] := -400.0*X[0]*(X[1]-IntPower(X[0],2))-2.0*(1.0-X[0]);
G[1] := 200.0*(X[1]-IntPower(X[0],2))+20.2*(X[1]-1.0)+19.8*(X[3]-1.0);
G[2] := -360.0*X[2]*(X[3]-IntPower(X[2],2))-2.0*(1-X[2]);
G[3] := 180.0*(X[3]-IntPower(X[2],2))+20.2*(X[3]-1.0)+19.8*(X[1]-1.0);
end;

end.

Результаты:

      IERR  =  -1
      F  =  0.3328214 - 09

      X1(1)  =  1.0000100 + 00
      X1(2)  =  1.0000190 + 00
      X1(3)  =  0.99999060 + 00
      X1(4)  =  0.99998120 + 00

      ИTEPAЦИЙ - 62