|
Текст подпрограммы и версий 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 = -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