|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/mn_htm_p/mna6r_p.htm
Дата изменения: Mon Nov 16 11:45:09 2015 Дата индексирования: Sun Apr 10 02:47:24 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий ( Си ) mna6r_c.zip , mna6d_c.zip |
Тексты тестовых примеров ( Си ) tmna6r_c.zip , tmna6d_c.zip |
Поиск локального минимума функции многих переменных методом Пауэлла.
Пусть задана функция N переменных F (x1, x2, ..., xN) и пусть известны координаты начальной точки X = (x*1, x*2, ..., x*N) поиска локального минимума (N ≤ 50).
Подпрограмма MNA6R выполняет итерационный процесс, состоящий в проведении последовательных одномерных поисков минимумов, начиная с точки X, вдоль системы определяемых в самой подпрограмме сопряженных направлений. В качестве начальных направлений поиска выбираются направления координатных осей в пространстве En.
Итерационный процесс продолжаетася до тех пор, пока модуль разности между значениями функции F в точках приближения к минимуму на двух последних итерациях не станет меньше EPS.
Предполагается, что составляемая пользователем подпрограмма - функция вычисления F в текущей точке XTEC всегда имеет имя FUNC и оформляется с двумя формальными параметрами:
XTEC - вещественный вектор длины N, содержащий координаты точки, в которой вычисляется значение функции F;
N - количество переменных (тип: целый).
Д.Химмельбау. Прикладное нелинейное программирование. Изд - во "Мир", 1975.
procedure MNA6R(var N :Integer; var X :Array of Real; var Y :Real;
var P :Array of Real; EPS :Real; var IFLAG :Integer;
var ITMAX :Integer);
Параметры
| N - | количество переменных; N ≤ 50 (тип: целый); |
| X - | вещественный вектор длины N, содержащий на входе координаты начальной точки поиска локального минимума, а на выходе - координаты этого минимума; |
| Y - | вещественная переменная, содержащая на выходе значение функции F в полученной точке минимума; |
| P - | вещественный двумерный массив размеров N на N, используемый в подпрограмме в качестве рабочего; |
| EPS - | заданное допустимое отклонение между значениями функции F на двух последовательных итерациях (тип: вещественный); |
| IFLAG - | целая переменная, служащая для сообщения о том, удалось ли найти локальный минимум за ITMAX итераций; при этом: |
| IFLAG=0 - | когда минимум функции F не найден; тогда вектор X содержит приближение к минимуму на последней итерации, а Y - значение F в этой точке; |
| IFLAG=1 - | когда точка минимум найдена; |
| ITMAX - | заданное максимальное число итераций (тип: целый). |
Версии
| MNA6E - | поиск локального минимума функции многих переменных методом Пауэлла в режиме расширенной (Extended) точности; при этом параметры X, Y, P и EPS должны иметь тип Extended, а подпрограмма - функция FUNC тоже должна иметь тип Extended. |
Вызываемые подпрограммы
| MNA1R - MNA1E | локализация минимума функции одной переменной в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах MNA6R и MNA6E соответственно. |
| MNA3R - MNA3E | поиск локального минимума функции одной переменной методом Брента (методом обратной параболической интерполяции) в режимах одинарной и расширенной (Extended) точности; используются в подпрограммах MNA6R и MNA6E соответственно. |
Замечания по использованию
|
В подпрограммах MNA6R и MNA6E имеется глобальная запись (структура данных) _MNA6RR с элементом elm1, которая полагается равной количеству итераций, выполненных при поиске минимума функции. Если IFLAG = 0, то _MNA6RR.elm1 := ITMAX. В этом случае следует либо увеличить ITMAX, либо увеличить EPS. В качестве рабочих используются подпрограммы MNA6R1 (MNA6E1) и MNA6R2 (MNA6E2), в которых имеется глобальная запись (структура данных) с именем _MNA6RC. |
Unit TMNA6R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, MNA6R_p;
function TMNA6R: String;
implementation
function TMNA6R: String;
var
N,ITMAX,_i,IFLAG :Integer;
EPS,Y :Real;
X1 :Array [0..1] of Real;
P1 :Array [0..3] of Real;
X2 :Array [0..1] of Real;
P2 :Array [0..3] of Real;
begin
Result := ''; { результат функции }
__.elm1 := 1;
N := 2;
X1[0] := 8.0;
X1[1] := 9.0;
EPS := 1.E-6;
IТМАХ := 500;
MNA6R(N,X1,Y,P1,EPS,IFLAG,ITMAX);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
begin
Result := Result + Format('%20.16f ',[X1[_i]]);
if ( ((_i+1) mod 2)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%20.16f ',[Y]) + #$0D#$0A;
Result := Result + Format('%5d %5d ',[IFLAG,_MNA6RR.elm1]) + #$0D#$0A;
__.elm1 := 2;
X2[0] := 1.2;
X2[1] := 1.0;
MNA6R(N,X2,Y,P2,EPS,IFLAG,ITMAX);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
begin
Result := Result + Format('%20.16f ',[X2[_i]]);
if ( ((_i+1) mod 2)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%20.16f ',[Y]) + #$0D#$0A;
Result := Result + Format('%5d %5d ',[IFLAG,_MNA6RR.elm1]) + #$0D#$0A;
UtRes('TMNA6R',Result); { вывод результатов в файл TMNA6R.res }
exit;
end;
end.
Результаты:
X1(1) = 0.5 ; X1(2) = 6.0 ; Y = 0.0
IFLAG = 1 ; ITER = 3
X2(1) = 1.00001 ; X2(2) = 1.0 ; Y = 0.295415E - 7
IFLAG = 1 ; ITER = 2