Текст подпрограммы и версий mnb9r_p.zip |
Тексты тестовых примеров tmnb9r_p.zip |
Поиск отрезка, содержащего минимум функции многих переменных на заданном направлении.
Для заданной функции φ (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 = -3Unit 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