Текст подпрограммы и версий
mnb8r_p.zip , mnb8e_p.zip
Тексты тестовых примеров
tmnb8r_p.zip , tmnb8e_p.zip

Подпрограмма:  MNB8R (модуль MNB8R_p)

Назначение

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

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

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

    min  φ (x0 + α s) ,   x0  En ,   s  En ,   α  R ,
     α 

используется метод золотого сечения. При этом предполагается, что задан отрезок [a, b] изменения параметра  α такой, что функция  φ (x), рассмотренная вдоль направления  s, принимает на [a, b] свое минимальное значение.

В.Г.Карманов, Математическое программирование, Изд - во "Hаука", M., 1975, стp.153 - 155.

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

procedure MNB8R(N :Integer; var X :Array of Real;
                var S :Array of Real; var XX :Array of Real;
                FUN :Proc_F1_MN; AA :Real; BB :Real; EPSX :Real;
                var EPS :Real; ITMAX :Integer; MAXK :Integer;
                var FMIN :Real; var XMIN :Real; var KOUNT :Integer;
                var ITER :Integer; NACC :Integer; var IER :Integer);

Параметры

N - размерность пространства переменных (тип: целый);
X - вещественный вектоp длины  N, задающий начальную точку  x0 поиска одномерного минимума;
S - вещественный вектоp длины  N, задающий направление поиска;
XX - вещественный вектоp длины  N, используемый в подпрограмме как рабочий;
FUN - имя подпрограммы вычисления значения минимизиpуемой функции;
AA - нижняя граница интервала, содержащего точку минимума (тип: вещественный);
BB - верхняя граница интервала, содержащего точку минимума (тип: вещественный);
EPSX - заданная точность вычисления точки минимума по аpгументу (тип: вещественный);
EPS - заданная точность вычисления минимума по функционалу (тип: вещественный);
ITMAX - заданное максимально допустимое число итераций метода (тип: целый);
MAXK - заданное максимально допустимое число вычислений функции (тип: целый);
FMIN - вещественная переменная, на выходе из подпрограммы содержащая вычисленное максимальное значение функции;
XMIN - вещественная переменная, на выходе из подпрограммы содержащая значение шага  α до точки минимума по направлению;
KOUNT - целая переменная, на выходе из подпрограммы содержащая выполненное число вычислений функции;
ITER - целая переменная, на выходе из подпрограммы содержащая выполненное число итераций;
NACC - целая переменная, задающая признак варианта алгоритма:
NACC=1 - на каждой итерации вычисляется только одна новая контрольная точка;
NACC=2 - для каждого нового интервала вычисляются обе контрольные точки (см. замечания по использованию);
IERR - целая переменная, служащая для сообщения об ошибках и причинах окончания поиска:
IERR= 1 - достигнута точность EPS;
IERR= 2 - достигнута точность EPSX;
IERR=65 - заданная точность EPSX ≤ 0;
IERR=66 - заданные значения AA, BB, и EPSX таковы, что либо BB ≤ AA, либо (BB - AA) < EPSX;
IERR=67 - выполнено ITMAX итераций, но ни EPSX, ни EPS не достигнуты;
IERR=68 - выполнено MAXK вычислений функции, но ни EPSX, ни EPS не достигнуты.

Версии

MNB8E - решение задачи одномерной минимизации функции многих переменных по заданному направлению и на заданном интервале методом золотого сечения, вычисления проводятся с расширенной (Extended) точностью.

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

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

 

В подпрограмме MNB8E и подпрограмме FUN параметры X, S, XX, AA, BB, EPSX, EPS, FMIN, XMIN, F, FE должны иметь тип Extended. Тип остальных параметров не меняется.

 

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

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

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

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

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

На очередной итерации метода на интервале [ak, bk] фиксиpуются две контрольные точки  v1 и  v2, такие что  ak < v1 < v2 < bk.

При NACC = 1 в качестве одной из точек (v1  или  v2) используется точка, вычисленная на пpедыдущей итерации. При этом погрешность вычислений может накапливаться от итерации к итерации. При NACC = 2 на каждой итерации  v1 и  v2 вычисляются заново, однако число вычислений функции на каждой итерации удваивается.

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

    min  φ (x0 + α s) ,   x0 ,   s  E1 ,    x0 = 0.0 ,   s = 1.0
      α 
    φ (x)  =  100*e-x + x 
    Оптимальное значение   α*  =  - ln(0.01)
    φ (x0 + α* s)  =  1 - ln(0.01)

Unit TMNB8R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FMNB8R_p, MNB8R_p;

function TMNB8R: String;

implementation

function TMNB8R: String;
var
NACC,KOUNT,ITER,IER :Integer;
FMIN,XMIN :Real;
X :Array [0..0] of Real;
S :Array [0..0] of Real;
ХХ :Array [0..0] of Real;
const
N :Integer = 1;
АА :Real = 4.2;
ВВ :Real = 4.8;
EPS :Real = 1.0E-16;
EPSX :Real = 1.0E-6;
IТМАХ :Integer = 100;
МАХК :Integer = 100;
begin
Result := '';  { результат функции }
{ прототип оператора DАТА на FORTRANе  }
X[0] := 0.0;
S[0] := 1.0;
NАСС := 1;
Result := Result + Format('%s',
 ['          ОДНОМЕРНАЯ МИНИМИЗАЦИЯ МЕТОДОМ ''ЗОЛОТОГО CEЧEHИЯ''' + #$0D#$0A]);
Result := Result + Format('%s',['          ИНТЕРВАЛ  (']);
Result := Result + Format('  %20.16f   %20.16f ',[AA,BB]);
Result := Result + Format('%s',[' )' + #$0D#$0A]);
Result := Result + Format('%s',['          ТОЧНОСТЬ ПО ФYHKЦИOHAЛY']);
Result := Result + Format('  %20.16f ',[EPS]);
Result := Result + Format('%s',['          ТОЧНОСТЬ ПО APГYMEHTY']);
Result := Result + Format('  %20.16f ',[EPSX]);
Result := Result + Format('%s',
 ['          МАКСИМАЛЬНОЕ ЧИСЛО ИTEPAЦИЙ']);
Result := Result + Format('  %6d ',[ITMAX]);
Result := Result + Format('%s',
 ['          МАКСИМАЛЬНОЕ ЧИСЛО BЫЧ. ФYHKЦИИ']);
Result := Result + Format('  %6d ',[MAXK]) + #$0D#$0A;
MNB8R(N,X,S,XX,FMNB8R,AA,BB,EPSX
     ,EPS,ITMAX,MAXK,FMIN,XMIN
     ,KOUNT,ITER,NACC,IER);
Result := Result + Format('%s',['          IER=']);
Result := Result + Format('%3d ',[IER]);
Result := Result + Format('%s',['          ITER=']);
Result := Result + Format('%5d ',[ITER]);
Result := Result + Format('%s',['          FMIN=']);
Result := Result + Format('%20.16f ',[FMIN]);
Result := Result + Format('%s',['          XMIN=']);
Result := Result + Format('%20.16f ',[XMIN]) + #$0D#$0A;
Result := Result + Format('%s',['          KOUNT=']);
Result := Result + Format('%5d ',[KOUNT]) + #$0D#$0A;
UtRes('TMNB8R',Result);  { вывод результатов в файл TMNB8R.res }
exit;
end;

end.

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

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

implementation

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

end.

Результаты:

      IERR  =  1
      ITER  =  14

      FMIN  =  5.605170 + 00
      XMIN  =  4.605681 + 00

      KOUNT  =  15