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

Подпрограмма:  MNL1R (модуль MNL1R_p)

Назначение

Минимизация функции многих переменных по заданному направлению на заданном отрезке методом Фибоначчи.

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

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

     min  φ (x0 + λ s) ,   a0 ≤ λ ≤ b0 ,
       λ 

где  x0, s  En,   a0, b0, λ  E1, используется метод Фибоначчи.

Функция  φ предполагается строго квазивыпуклой на отрезке [a0, b0] по направлению  s.

Hа  k - ой итерации метода строится отрезок  [ak, bk] такой, что  [ak, bk [ak - 1, bk - 1 ...  [a0, b0], и значение  λ*k  [ai, bi] для всех  i, где  λ*k - искомая точка минимума  φ (x) по направлению  s.

Значение  λ*k считается найденым, если для некоторого  k выполнено одно из следующих условий:

- длина отрезка  [ak, bk] меньше заданного  ε > 0;

- | φ (x0 + α s) - φ (x0 + β s) | < ε1 max {| φ (x0 + α s)|, | φ (x0 + β s)|},
   где  ak < α < β < bk;

- выполнено максимальное число итераций метода;

- выполнено максимальное число вычислений функции.

В.Г.Карманов. Математическое программирование. M., Изд - во "Наука", 1980.

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

procedure MNL1R(N :Integer; var X :Array of Real; var XMIN :Real;
                var S :Array of Real; FUN :Proc_F1_MN; AA :Real; BB :Real;
                XE :Real; var FE :Real; var UP :Array of Real;
                var RM :Array of Real; var IERR :Integer);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N, задающий начальную точку поиска минимума по направлению;
XMIN - вещественная переменная, содержащая на выходе шаг по направлению до вычисленной точки минимума;
S - вещественный вектоp длины  N, задающий направление одномерной минимизации;
FUN - имя подпрограммы вычисления значения функции (см. замечания по использованию);
AA - вещественная переменная, задающая нижнюю гpаницу исходного отрезка неопределенности;
BB - вещественная переменная, задающая верхнюю границу исходного отрезка неопределенности;
XE - заданная точность  ε вычисления точки минимума по аpгументу - длина конечного отрезка неопределенности (тип: вещественный);
FE - заданная точность  ε1 вычисления точки минимума по функционалу (тип: вещественный);
UP - вещественный вектоp длины 3, содержащий упpавляющие параметры алгоритма (см. замечания по использованию);
RM - вещественный вектоp длины  N, используемый в подпрограмме как рабочий;
IERR - целая переменная, указывающая пpичину окончания процесса:
IERR= 1 - если достигнута точность XE;
IERR= 2 - если достигнута точность FE;
IERR= 4 - если выполнено максимальное число итераций;
IERR= 5 - если выполнено максимальное число вычислений функции;
IERR=65 - если XE ≤ 0;
IERR=66 - если (BB - AA) < 0 или XE > (BB - AA).

Версии: нет

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

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

 

Подпрограмма FUN составляется пользователем. Первый оператор подпрограммы должен иметь вид:

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

       Параметры
       X   - точка, в которой вычисляется значение функции;
       F   - вычисленное значение функции;
       FE - точность, с которой вычисляется значение  F. 

Вектоp UP должен быть задан следующим образом:

UP (1) - максимальное допустимое число итераций метода;

UP (2) - максимальное допустимое число вычислений функции;

UP (3) - определяет вариант алгоритма, т.е. если UP (3) = 1, то на каждой итерации вычисляется только одна контрольная точка, если UP (3) = 2, то вычисляются обе точки.

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

    min  φ (x) ,   4.2 ≤ x ≤ 4.8
    φ (x)  =  100 e -x + x ,    x*  =  - ln(0.01)

Unit TMNL1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNL1R_p, MNL1R_p;

function TMNL1R: String;

implementation

function TMNL1R: String;
var
IERR :Integer;
XMIN :Real;
X :Array [0..0] of Real;
S :Array [0..0] of Real;
RM :Array [0..0] of Real;
const
N :Integer = 1;
АА :Real = 4.2;
ВВ :Real = 4.8;
FE :Real = 1.0E-16;
ХЕ :Real = 1.0E-6;
UP :Array [0..2] of Real = ( 100.0,100.0,1.0 );
begin
Result := '';  { результат функции }
{ прототип оператора DАТА на FORTRANе  }
X[0] := 0.0;
S[0] := 1.0;
Result := Result + Format('%s',
 ['          ОДНОМЕРНАЯ МИНИМИЗАЦИЯ МЕТОДОМ ФИБОНАЧЧИ  ' + #$0D#$0A]);
Result := Result + Format('%s',['          *']);
Result := Result + Format('',[AA,BB,FE,XE]);
MNL1R(N,X,XMIN,S,FMNL1R,AA,BB,XE,FE,UP,RM,IERR);
Result := Result + Format('%s',['          IERR=']);
Result := Result + Format('%2d ',[IERR]);
Result := Result + Format('%s',['          XMIN=']);
Result := Result + Format('%20.16f ',[XMIN]) + #$0D#$0A;
UtRes('TMNL1R',Result);  { вывод результатов в файл TMNL1R.res }
exit;
end;

end.

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

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

implementation

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

end.

Результаты:
      
      IERR  =  2
      XMIN  =  4.60517176