|
Текст подпрограммы и версий mn11r_p.zip |
Тексты тестовых примеров tmn11r_p.zip |
Решение задачи квадратичного программирования при наличии двухсторонних ограничений на переменные методом покординатного спуска.
Решается задача квадратичного программирования
min { Q(x) = (Gx, x) + (h, x) | a ≤ x ≤ b } ,
где G - симметричная матрица размерности n * n , x, h, a, b - векторы длины n, причем ai > - ∞, bi < +∞, i = 1, ..., n.
Матрица G задается в компактной форме, т.е. представляется в виде вектоpа длины n (n + 1)/2, который состоит из элементов нижнего треугольника матрицы, выписанных последовательно по строкам.
Для решения задачи используется метод покоординатного спуска. Для одномерной минимизации функции Q (x) вдоль направления спуска используется метод квадратичной аппроксимации.
Некоторая вычисленная точка xk, a ≤ xk ≤ b, считается точкой минимума функции Q (x), если выполнено хотя бы одно из следующих условий:
| 1. | | xik - xik - 1 | ≤ XE для всех i = 1, ..., n, где xk = (x1k, ..., xnk) - точка, полученная на k - ой итерации метода, а XE - заданная точность решения задачи по аргументу; |
| 2. | | Q (xk) - Q (xk - 1) | ≤ FE, xk - точка, вычисленная на k - ой итерации метода, а FE - заданная точность решения задачи по функционалу. |
Пшеничный Б.Н., Метод минимизации функции без вычисления производных, Кибернетика, N 4, 1973.
procedure MN11R(var N :Integer; var X :Array of Real;
var XE :Array of Real; var A :Array of Real;
var B :Array of Real; var G :Array of Real;
var H :Array of Real; FSTEP :Real; IPAR :Integer;
var MAXK :Integer; var F :Real; var FE :Real;
var KOUNT :Integer; var I0 :Array of Integer;
var RM :Array of Real; var IERR :Integer);
Параметры
| N - | размерность пространства переменных (тип: целый); |
| X - | вещественный вектоp длины N: при обращении к подпрограмме содержит заданную начальную точку поиска, на выходе содержит точку минимума функции Q (x); |
| XE - | заданная точность решения задачи по аргументу (тип: вещественный); |
| A - | вещественный вектоp длины N, задающий ограничения снизу на переменные; |
| B - | вещественный вектоp длины N, задающий ограничения свеpху на переменные; |
| G - | вещественный вектоp длины N (N + 1)/2, содержащий компактную запись матрицы G; |
| H - | вещественный вектоp длины N, содержащий компоненты вектоpа h; |
| FSTEZ - | начальная длина шага (тип: вещественный); |
| IPAR - | параметр, управляющий вариантом покоординатного спуска (тип: целый): |
| IPAR=1 - | используется вариант с ускоpенным дроблением шага; |
| MAXK - | целая переменная, при обращении к подпрограмме содержащая заданное максимально допустимое число вычислений функции, на выходе - фактически выполненное число вычислений функции; |
| F - | вещественная переменная, содержащая вычисленное минимальное значение Q (x); |
| FE - | заданная точность решения задачи по функционалу (тип: вещественный); |
| KOUNT - | целая переменная, содержащая число фактически выполненных итераций метода; |
| I0 - | целочисленный вектоp длины N, используемый как рабочий; |
| RM - | вещественный вектоp длины 4 * N + 11, используемый как рабочий; |
| IERR - | целая переменная, указывающая причину окончания процесса: |
| IERR= 0 - | найден минимум с заданной точностью по аргументу или по функционалу; |
| IERR= 4 - | выполнено заданное максимальное число вычислений функции, но точность не была достигнута. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Используются служебные подпрограммы: MNP11, MNP13, MN214, MN215, MNP16. |
Найти min { Q(x) = (Gx, x) + (h, x) | a ≤ x ≤ b } , где
Unit TMN11R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, MN11R_p;
function TMN11R: String;
implementation
function TMN11R: String;
var
I,KOUNT,IERR,_i :Integer;
F :Real;
IO :Array [0..9] of Integer;
RM :Array [0..50] of Real;
const
N :Integer = 10;
FE :Real = 5.0E-10;
ХЕ :Array [0..9] of Real = ( 5.E-10,5.E-10,5.E-10,5.E-10,5.E-10,5.E-10,5.E-10,
5.E-10,5.E-10,5.E-10 );
FSTEZ :Real = 1.0;
IPAR :Integer = 1;
МАХК :Integer = 1000;
G :Array [0..54] of Real = ( 100.0,0.5,100.0,0.0,0.5,100.0,0.0,0.0,0.5,100.0,
0.0,0.0,0.0,0.0,20.0,0.0,0.0,0.0,0.0,0.5,20.0,0.0,
0.0,0.0,0.0,0.0,0.5,20.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,3.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.5,3.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 );
H :Array [0..9] of Real = ( -202.0,-202.0,-202.0,-200.0,-42.0,-42.0,-40.0,
-8.0,-6.0,-2.0 );
A :Array [0..9] of Real = ( -2.0,-2.0,-2.0,-2.0,-2.0,-2.0,-2.0,-2.0,-2.0,
-2.0 );
B :Array [0..9] of Real = ( 2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0 );
X :Array [0..9] of Real = ( -1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0 );
begin
Result := ''; { результат функции }
MN11R(N,X,XE,A,B,G,H,FSTEZ,IPAR,MAXK,F,FE,KOUNT,
IO,RM,IERR);
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%4d ',[IERR]);
Result := Result + Format('%s',[' KOUNT=']);
Result := Result + Format('%4d ',[KOUNT]);
Result := Result + Format('%s',[' MAXK=']);
Result := Result + Format('%4d ',[MAXK]);
Result := Result + Format('%s',[' МАССИВ X' + #$0D#$0A]);
Result := Result + #$0D#$0A;
for _i:=0 to 9 do
begin
Result := Result + Format('%20.16f ',[X[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%20.16f ',[F]) + #$0D#$0A;
UtRes('TMN11R',Result); { вывод результатов в файл TMN11R.res }
exit;
end;
end.
Результаты:
IERR = 0
KOUNT = 193
MAXK = 306
X(I) = (1.0053, 0.999574, 1.000782, 0.995092, 1.025024,
1.001971, 0.975006, 1.199397, 0.800848, 0.998825)
F = - 473.2299