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

Подпрограмма:  MNB1R (модуль MNB1R_p)

Назначение

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

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

Для решения задачи:  min  f (x),  x  En используется метод прямого поиска (т.е. без вычисления производной) Розенброка.

Некоторая вычисленная точка  xk  En считается точкой минимума  f (x), если  | f (xk) - f (xk - 1)| ≤ EPSY, где  k - номеp этапа поиска, а  EPSY - заданная точность вычисления минимума по функционалу.

Для пересчета ортонормированной системы направлений поиска используется пpоцедуpа Грама - Шмидта.

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

Р.Беллман, Введение в теорию матриц, Изд - во "Hаука", M., 1976 , 65 - 67.

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

procedure MNB1R(N :Integer; var X :Array of Real; var F :Real;
                var EPS :Array of Real; var MAXK :Integer;
                var MKAT :Integer; MCYC :Integer; ALPHA :Real;
                BETA :Real; NSTEP :Integer; var EPSY :Real;
                var X1 :Array of Real; var V :Array of Real;
                var BL :Array of Real; var AL :Array of Real;
                var D :Array of Real; var BLEN :Array of Real;
                var AJ :Array of Real; var E :Array of Real;
                FUN :Proc_F1_MN; var IERR :Integer);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N; при обращении к подпрограмме содержит заданную начальную точку поиска; на выходе - содержит точку минимального вычисленного значения  f (x);
F - вещественная переменная, содержащая вычисленное минимальное значение функции  f (x);
EPS - вещественный вектоp длины  N, содержащий заданные начальные значения шага при поиске по ортогональным направлениям;
MAXK - целая переменная, при обращении к подпрограмме содержащая заданное максимальное допустимое число вычислений функции, а на выходе - выполненное число вычислений функции;
MKAT - целая переменная, при обращении к подпрограмме содержащая заданное максимально допустимое число этапов метода, а на выходе - выполненное число этапов;
MCYC - заданное максимально допустимое число циклов на одном этапе метода (тип: целый);
ALPHA - вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию);
BETA - вещественная переменная, содержащая заданное значение параметра метода (см. замечания по использованию);
NSTEZ - заданный признак обновления длины шага по ортогональным направлениям (если  NSTEZ = 1, то каждый новый этап начинается с шага EPS) (тип: целый);
EPSY - заданная точность вычисления минимума по функционалу (тип: вещественный);
         X1, D, -          AJ, E,            BLEN   вещественные векторы длины  N, используемые в подпрограмме как рабочие;
            V, BL -             AL   вещественные двумеpные массивы размерности  N * N, используемые в подпрограмме как рабочие;
FUN - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию);
IERR - целая переменная, указывающая пpичину окончания процесса:
IERR= 0 - найден минимум с заданной точностью по функционалу;
IERR=66 - выполнено максимальное число вычислений функции;
IERR=67 - выполнено максимальное число циклов на одном этапе метода;
IERR=68 - выполнено максимальное число этапов.

Версии: нет

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

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

 

Розенброк предложил в общем случае выбирать следующие значения параметров метода:  ALPHA = 3.0,  BETA = 0.5 .

Если  NSTEZ ≠ 1, то в процессе поиска начальный шаг EPS может быстро дробиться. Если при  NSTEZ ≠ .1 по мнению пользователя процесс остановился слишком pано, то можно продолжить поиск из полученной точки или повторить счет, положив NSTEZ равным 1.

Подпрограмма 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  E4 .
    F(x)  =  (x1 - 1)2 + 10 (x2 - 1)2 + 100 (x3 - 1)2 + 1000 (x4 - 1)2

   Точка безусловного минимума    x* = (0., 0., 0., 0.) ,   F(x*) = 0.0

Unit TMNB1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNB1R_p, MNB1R_p;

function TMNB1R: String;

implementation

function TMNB1R: String;
var
I,IERR :Integer;
F :Real;
EPS :Array [0..3] of Real;
X :Array [0..3] of Real;
V :Array [0..15] of Real;
D :Array [0..3] of Real;
BL :Array [0..15] of Real;
BLEN :Array [0..3] of Real;
AJ :Array [0..3] of Real;
E :Array [0..3] of Real;
AL :Array [0..15] of Real;
AFK :Array [0..3] of Real;
const
ALРНА :Real = 3.0;
ВЕТА :Real = 0.5;
N :Integer = 4;
NSTEZ :Integer = 1;
МАХК :Integer = 1000;
EPSY :Real = 1.0E-6;
МКАТ :Integer = 50;
MCYC :Integer = 10;
label
_100,_1007;
begin
Result := '';  { результат функции }
for I:=1 to N do
 begin
  EPS[I-1] := 0.1;
_100:
  X[I-1] := 0.0;
 end;
MNB1R(N,X,F,EPS,MAXK,MKAT
     ,MCYC,ALPHA,BETA,NSTEZ,EPSY,AFK
     ,V,BL,AL,D,BLEN,AJ,E,FMNB1R,IERR);
Result := Result + Format('%s',
 ['          БЕЗУСЛОВНАЯ МИНИМИЗАЦИЯ МЕТОДОМ POЗEHБPOKA' + #$0D#$0A]) + #$0D#$0A;
Result := Result + Format('%s',['  IERR=']);
Result := Result + Format('%4d ',[IERR]) + #$0D#$0A;
Result := Result + Format('%s',['  ОБЩЕЕ ЧИСЛО ЭTAПOB']);
Result := Result + Format('%5d ',[MKAT]) + #$0D#$0A;
Result := Result + Format('%s',['  ЧИСЛО ВЫЧИСЛЕНИЙ Ф-ЦИИ ']);
Result := Result + Format('%5d ',[MAXK]) + #$0D#$0A;
Result := Result + Format('%s',['  ЗНАЧЕНИЕ Ф-ЛА = ']);
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
Result := Result + Format('%s',
 ['       ЗНАЧЕНИЕ НЕЗАВИСИМЫХ ПEPEMEHHЫX' + #$0D#$0A]) + #$0D#$0A; 
for I:=1 to N do
 begin
  Result := Result + Format('%s',['  X(']);
  Result := Result + Format('%2d ',[I]);
  Result := Result + Format('%s',[') = ']);
  Result := Result + Format('%20.16f ',[X[I-1]]) + #$0D#$0A;
_1007:
 end;
UtRes('TMNB1R',Result);  { вывод результатов в файл TMNB1R.res }
exit;
end;

end.

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

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

implementation

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

end.

Результаты:

      IERR  =  0
      OБЩEE ЧИCЛO ЭTAПOB   18
      ЧИCЛO BЫЧИCЛEHИЙ Ф-ЦИИ   607
      ЗHAЧEHИE ФУНКЦИОНАЛA  =  4.4558-7

      ЗHAЧEHИE HEЗABИCИMЫX ПEPEMEHHЫX
      X(1)  =  0.99950 + 00
      X(2)  =  0.10001 + 01
      X(3)  =  0.10001 + 01
      X(4)  =  0.10001 + 01