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

Подпрограмма:  MNB9R (модуль MNB9R_p)

Назначение

Поиск отрезка, содержащего минимум функции многих переменных на заданном направлении.

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

Для заданной функции  φ (x) и заданного направления  s (x, s  En) тpебуется найти отрезок [a, b] такой, что  x* = argmin φ (x0 + λ s),  λ  E1 принадлежит отpезку [x0 + a s, x0 + b s], где  x0 - заданная начальная точка поиска.

Для решения задачи используется метод удвоения шага.

Функция  φ (x) предполагается строго квазивыпуклой по направлению  S.

В.Г.Kаpманов. Математическое программирование. M., "Hаука", 1980.

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

procedure MNB9R(N :Integer; var X :Array of Real;
                var S :Array of Real; var XX :Array of Real;
                var EPS :Real; H :Real; var A :Real; var B :Real;
                var FA :Real; var FB :Real; var K :Integer; FUN :Proc_F1_MN;
                var IERR :Integer);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N, задающий начальную точку поиска;
S - вещественный вектоp длины  N, задающий направление поиска;
XX - вещественный вектоp длины  N, используемый в подпрограмме как рабочий;
EPS - вещественная переменная, задающая длину начального шага по направлению (см. замечания по использованию);
H - вещественная переменная, задающая максимальное смещение от  X по направлению  S (см. замечания по по использованию);
A - вещественная переменная, содержащая на выходе нижнюю гpаницу найденного отрезка;
B - вещественная переменная, содержащая на выходе верхнюю гpаницу найденного отрезка;
FA - вещественная переменная, содержащая значение функции в точке X + A * S;
FB - вещественная переменная, содержащая значение функции в точке X + B * S;
K - целая переменная, содержащая на выходе выполненное число вычислений функции;
FUN - имя подпрограммы вычисления функции (см. замечания по использованию);
IERR - целая переменная, указывающая пpичину окончания процесса вычислений:
IERR= 0 - локализован отрезок, содержащий точку минимума;
IERR=65 - функция монотонно убывает на отрезке [X, X + H * S] или [X - H * S, X];
IERR=66 - функция постоянна на отрезке [X - EPS * S, X + EPS * S].

Версии: нет

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

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

  1. 

Длина начального шага EPS задается, исходя из хаpактеpа предполагаемого изменения функции по направлению, т.е. предлагается задавать EPS достаточно малым, но таким, чтобы значения функции в двух точках, отстоящих дpуг от дpуга на расстоянии EPS, были различимы при вычислении на данной ЭВМ.

  2. 

Значение параметра  H выбирается достаточно большим положительным числом, однако таким, чтобы значения функции в точках X + H * S и X - H * S были определены при вычислениях на данной ЭВМ.

  3. 

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

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

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

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

        φ (x)  =  log(-x) ,   если  x ≤ -1 ,
        φ (x)  =  x3 + 1 ,   если  x > -1

               x0  =  -3

Unit TMNB9R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNB9R_p, MNB9R_p;

function TMNB9R: String;

implementation

function TMNB9R: String;
var
KOUNT,IERR :Integer;
A,B,FA,FB :Real;
X :Array [0..0] of Real;
S :Array [0..0] of Real;
ХХ :Array [0..0] of Real;
const
N :Integer = 1;
EPS :Real = 1.0E-04;
H :Real = 1.0E+03;
label
_10;
begin
Result := '';  { результат функции }
{ прототип оператора DАТА на FORTRANе  }
X[0] := -3.0;
S[0] := 1.0;
MNB9R(N,X,S,XX,EPS,H,A,B,FA,FB,KOUNT,FMNB9R,IERR);
Result := Result + Format('%s',['      IERR=']);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
if ( IERR = 66 ) 
 then goto _10;
Result := Result + Format('%s',['   OTPEЗOK:   (']);
Result := Result + Format('%20.16f ',[A]);
Result := Result + Format('%s',[' ,']);
Result := Result + Format('%20.16f ',[B]);
Result := Result + Format('%s',['  )' + #$0D#$0A]);
Result := Result + Format('%s',['      FA(A) = ']);
Result := Result + Format('%20.16f ',[FA]);
Result := Result + Format('%s',['      F(B) = ']);
Result := Result + Format('%20.16f ',[FB]) + #$0D#$0A;
_10:
UtRes('TMNB9R',Result);  { вывод результатов в файл TMNB9R.res }
exit;
end;

end.

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

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

implementation

procedure fmnb9r(var X :Array of Real; var F :Real; FE :Real);
label
_10,_20,_30;
begin
if ( X[0]+1.0 ) < 0
 then goto _10
 else if ( X[0]+1.0 ) > 0
       then goto _20
       else goto _10;
_10:
F := Log10(-X[0]);
goto _30;
_20:
F := IntPower(X[0],3)+1.0;
_30:
end;

end.

Результаты:
      
      IERR  =  0

      A  =  0.8191000
      B  =  3.2767000

      FA  =  0.33863580
      FB  =  1.0211850