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

Подпрограмма:  MNB5R (модуль MNB5R_p)

Назначение

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

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

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

 min  f(x0 + λ s0) ,   -∞ < λ < ∞ ,   x0En ,   s0En ,
   λ 

x0 и  s0 заданы, используется метод квадратичной аппроксимации Пауэлла.

Для определения отрезка вдоль направления  s0, содержащего точку минимума функции  f (x), используется алгоритм Девиса - Свена - Кемпи.

Минимум  f (x) по направлению  s0 считается найденным, если выполнено хотя бы одно из следующих условий:

1. 
min  | xi - xi | ≤ XLIM ,
  i 

где  xi = x0 + λi s0 - три точки ( i = 1, 2, 3), по которым строится аппpоксимиpующая парабола,  x = x0 + λ s0 - точка минимума параболы, а  XLIM - заданная точность решения задачи по аpгументу.

2.  | f (xk) - f (xk+1)| ≤ EPS, где  xk = x0 + λk s0 - точка минимума аппpоксимиpующей параболы на  k - ой итерации алгоритма Пауэлла, а EPS - заданная точность решения задачи по функционалу.

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

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

procedure MNB5R(N :Integer; var X :Array of Real;
                var S :Array of Real; var XX :Array of Real;
                var DELX :Real; var EPS :Real; XLIM :Real;
                var XMIN :Real; var YMIN :Real; var KOUNT :Integer;
                var IER :Integer; FUN :Proc_F1_MN);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N, задающий начальную точку  x0 поиска минимума  f (x) по направлению;
S - вещественный вектоp длины  N, задающий направление  s0 одномерной минимизации;
XX - вещественный вектоp длины  N, используемый в подпрограмме как рабочий;
DELX - заданный начальный шаг одномерного поиска (тип: вещественный);
EPS - заданная точность вычисления одномерного минимума по функционалу (тип: вещественный);
XLIM - заданная точность вычисления одномерного минимума по аpгументу (тип: вещественный);
XMIN - вещественная переменная, содержащая расстояние до точки минимума  f (x) вдоль  s0, т.е.  x* = x0 + XMIN * S0;
YMIN - вещественная переменная, содержащая вычисленное минимальное значение функции  f (x) вдоль направления  s0, т.е.  YMIN = f (x*);
KOUNT - целая переменная, содержащая фактически выполненное число вычислений функции  f (x) в процессе одномерной минимизации;
IERR - целочисленная переменная, указывающая пpичину окончания процесса:
IERR= 0 - найден минимум с заданной точностью;
IERR= 1 - установлено, что минимум  f (x) вдоль направления  s0 из заданной точки  x0 не существует;
FUN - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию).

Версии: нет

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

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

 

Подпрограмма FUN составляется пользователем.

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

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

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

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

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

    min  F(x) ,    x  E1 ,   x0 = 0.0 ,   s0 = 1.0 ,   F(x) = 100 * e-x + x .

    Точка минимума  F(x)  вдоль  s  pавна  
          xk = - ln (0.01) ,   F(xk) = i - ln (0.01)

Unit TMNB5R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNB5R_p, MNB5R_p;

function TMNB5R: String;

implementation

function TMNB5R: String;
var
KOUNT,IER :Integer;
R,XMIN,YMIN :Real;
X :Array [0..0] of Real;
S :Array [0..0] of Real;
ХХ :Array [0..0] of Real;
const
N :Integer = 1;
XLIM :Real = 1.0E-6;
DELX :Real = 0.5;
EPS :Real = 1.0E-7;
begin
Result := '';  { результат функции }
X[0] := 0.0;
S[0] := 1.0;
MNB5R(N,X,S,XX,DELX,EPS,XLIM
     ,XMIN,YMIN,KOUNT,IER,FMNB5R);
Result := Result + Format('          %6d %6d   %20.16f   %20.16f ',
 [IER,KOUNT,XMIN,YMIN]) + #$0D#$0A;
R := -100.0*Exp(-XMIN)+1.0;
Result := Result + Format('%s',['          F''(XMIN) = ']);
Result := Result + Format('%20.16f ',[R]) + #$0D#$0A;
UtRes('TMNB5R',Result);  { вывод результатов в файл TMNB5R.res }
exit;
end;

end.

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

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

implementation

procedure fmnb5r(var X :Array of Real; var F :Real; FE :Real);
begin
F := 100.0*Exp(-X[0])+X[0];
end;

end.

Результаты:

      IERR  =  0
      KOUNT  =  15

      XMIN  =  4.6057000 + 00
      YMIN  =  5.6051700 + 00