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

Подпрограмма:  MNI2R (модуль MNI2R_p)

Назначение

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

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

Для решения задачи: min  f (x),  x  En , используется квазиньютоновский метод, основанный на приближенном вычислении на каждой итерации матрицы  H, обратной к матрице Гессе функции  f (x). Приведение матрицы  H к диагональному виду осуществляется с использованием метода вращений.

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

Пшеничный Б.Н., Редковский H.H., Об одном численном методе минимизации без вычисления производных, ЖВМ и МФ, т.16, 1976.

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

procedure MNI2R(var N :Integer; var B22 :Real; E :Real;
                var K2 :Integer; var PIK :Array of Real;
                var BK :Array of Real; var X :Array of Real;
                var XP :Array of Real; var Z :Array of Real;
                var Z1 :Array of Real; var QL :Array of Real;
                var W1 :Array of Real; var X0 :Array of Real;
                var V1 :Real; FUN :Proc_F1_MN);

Параметры

N - размерность пространства переменных (тип: целый);
F - вещественная переменная, содержащая минимальное значение функции  f (x);
EPS - заданная точность вычисления минимума по функционалу (тип: вещественный);
LIM - заданное максимально допустимое число итераций метода (см. замечания по использованию) (тип: целый);
R1, R2 - вещественные векторы длины  N * N, используемые в подпрограмме как рабочие;
       R3, R4 -        R5, R6          R7, R8   вещественные векторы длины  N, используемые в подпрограмме как рабочие;
X - вещественный вектоp длины  N; при обращении к подпрограмме содержит заданную начальную точку поиска, на выходе содержит точку минимального вычисленного значения  f (x);
STEP - заданное значение начального шага поиска (тип: вещественный);
FUN - имя подпрограммы вычисления значения функции  f (x) (см. замечания по использованию).

Версии: нет

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

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

 

Используется служебная подпрограмма MNI01.

Если EPS > 0, то подпрограмма выполнит такое количество итераций метода, котоpое необходимо для достижения заданной точности решения, даже если оно больше LIM.

Чтобы число фактически выполненных итераций было не больше LIM, следует задавать EPS = 0.0 .

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

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

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

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

В общем случае, значения точности по функционалу EPS и величины начального шага STEP pекомендуется задавать в следующих диапазонах: 1.E - 15 ≤ EPS ≤ 1.E - 4,  0.01 ≤ STEP ≤ 0.2 .

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

    min  F(x) ,   x  E2 .
    F(x)  =  100 ( x12 - x2 )2 + (x1 - 1)2.
    Точка безусловного минимума     x*  =  (1.0, 1.0) ,   F(x*)  =  0.0 .

Unit TMNI2R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNI2R_p, MNI2R_p;

function TMNI2R: String;

implementation

function TMNI2R: String;
var
N,I,K :Integer;
E,STEP,F :Real;
R1 :Array [0..3] of Real;
R2 :Array [0..3] of Real;
R3 :Array [0..1] of Real;
R4 :Array [0..1] of Real;
R5 :Array [0..1] of Real;
R6 :Array [0..1] of Real;
R7 :Array [0..1] of Real;
R8 :Array [0..1] of Real;
const
X :Array [0..1] of Real = ( -1.2,1.0 );
begin
Result := '';  { результат функции }
N := 2;
E := 1.E-12;
SТЕР := 0.1;
MNI2R(N,F,E,K,R1,R2,R3,R4,R5,R6,R7,R8,X,STEP,FMNI2R);
Result := Result + Format('%s',[' APГYMEHT:']);
Result := Result + #$0D#$0A;
for I:=1 to N do
 begin
  Result := Result + Format('%20.16f ',[X[I-1]]) + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' ФYHKЦИЯ: ']);
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
UtRes('TMNI2R',Result);  { вывод результатов в файл TMNI2R.res }
exit;
end;

end.

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

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

implementation

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

end.

Результаты:

      F  =  0.355E-15
      X  =  ( 0.9999999, 0.9999999 )