Текст подпрограммы и версий mnb8r_p.zip , mnb8e_p.zip |
Тексты тестовых примеров tmnb8r_p.zip , tmnb8e_p.zip |
Решение задачи одномерной минимизации функции многих переменных по заданному направлению и на заданном интервале методом золотого сечения.
Для решения задачи
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