Текст подпрограммы и версий mnb5r_p.zip |
Тексты тестовых примеров tmnb5r_p.zip |
Решение задачи безусловной минимизации функции многих переменных по заданному направлению (задача одномерной минимизации) методом квадратичной аппроксимации.
Для решения задачи:
min f(x0 + λ s0) , -∞ < λ < ∞ , x0∈En , s0∈En , λ
x0 и s0 заданы, используется метод квадратичной аппроксимации Пауэлла.
Для определения отрезка вдоль направления s0, содержащего точку минимума функции f (x), используется алгоритм Девиса - Свена - Кемпи.
Минимум f (x) по направлению s0 считается найденным, если выполнено хотя бы одно из следующих условий:
1. |
min | xi - xi | ≤ XLIM ,
i
где xi = x0 + λi s0 - три точки ( i = 1, 2, 3), по которым строится аппpоксимиpующая парабола, x = x0 + λ s0 - точка минимума параболы, а XLIM - заданная точность решения задачи по аpгументу. |
2. | | f (xk) - f (xk+1)| ≤ EPS, где xk = x0 + λk s0 - точка минимума аппpоксимиpующей параболы на k - ой итерации алгоритма Пауэлла, а EPS - заданная точность решения задачи по функционалу. |
Д.Химмельблау, Прикладное нелинейное программирование. Изд - во "Мир", M., 1975, 54 - 55.
procedure MNB5R(N :Integer; var X :Array of Real; var S :Array of Real; var XX :Array of Real; var DELX :Real; var EPS :Real; XLIM :Real; var XMIN :Real; var YMIN :Real; var KOUNT :Integer; var IER :Integer; FUN :Proc_F1_MN);
Параметры
N - | размерность пространства переменных (тип: целый); |
X - | вещественный вектоp длины N, задающий начальную точку x0 поиска минимума f (x) по направлению; |
S - | вещественный вектоp длины N, задающий направление s0 одномерной минимизации; |
XX - | вещественный вектоp длины N, используемый в подпрограмме как рабочий; |
DELX - | заданный начальный шаг одномерного поиска (тип: вещественный); |
EPS - | заданная точность вычисления одномерного минимума по функционалу (тип: вещественный); |
XLIM - | заданная точность вычисления одномерного минимума по аpгументу (тип: вещественный); |
XMIN - | вещественная переменная, содержащая расстояние до точки минимума f (x) вдоль s0, т.е. x* = x0 + XMIN * S0; |
YMIN - | вещественная переменная, содержащая вычисленное минимальное значение функции f (x) вдоль направления s0, т.е. YMIN = f (x*); |
KOUNT - | целая переменная, содержащая фактически выполненное число вычислений функции f (x) в процессе одномерной минимизации; |
IERR - | целочисленная переменная, указывающая пpичину окончания процесса: |
IERR= 0 - | найден минимум с заданной точностью; |
IERR= 1 - | установлено, что минимум f (x) вдоль направления s0 из заданной точки x0 не существует; |
FUN - | имя подпрограммы вычисления значения функции f (x) (см. замечания по использованию). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
Подпрограмма 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 ∈ E1 , x0 = 0.0 , s0 = 1.0 , F(x) = 100 * e-x + x . Точка минимума F(x) вдоль s pавна xk = - ln (0.01) , F(xk) = i - ln (0.01)Unit TMNB5R_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, FMNB5R_p, MNB5R_p; function TMNB5R: String; implementation function TMNB5R: String; var KOUNT,IER :Integer; R,XMIN,YMIN :Real; X :Array [0..0] of Real; S :Array [0..0] of Real; ХХ :Array [0..0] of Real; const N :Integer = 1; XLIM :Real = 1.0E-6; DELX :Real = 0.5; EPS :Real = 1.0E-7; begin Result := ''; { результат функции } X[0] := 0.0; S[0] := 1.0; MNB5R(N,X,S,XX,DELX,EPS,XLIM ,XMIN,YMIN,KOUNT,IER,FMNB5R); Result := Result + Format(' %6d %6d %20.16f %20.16f ', [IER,KOUNT,XMIN,YMIN]) + #$0D#$0A; R := -100.0*Exp(-XMIN)+1.0; Result := Result + Format('%s',[' F''(XMIN) = ']); Result := Result + Format('%20.16f ',[R]) + #$0D#$0A; UtRes('TMNB5R',Result); { вывод результатов в файл TMNB5R.res } exit; end; end. Unit fmnb5r_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc; procedure fmnb5r(var X :Array of Real; var F :Real; FE :Real); implementation procedure fmnb5r(var X :Array of Real; var F :Real; FE :Real); begin F := 100.0*Exp(-X[0])+X[0]; end; end. Результаты: IERR = 0 KOUNT = 15 XMIN = 4.6057000 + 00 YMIN = 5.6051700 + 00