|
Текст подпрограммы и версий ald1r_p.zip |
Тексты тестовых примеров tald1r_p.zip |
Вычисление решения с минимальной евклидовой нормой системы линейных алгебраических неравенств.
Для системы линейных алгебраических неравенств
A * X ≥ H
ищется вектор X минимальной нормы
|| X || - min
Здесь A - прямоугольная матрица размерности M на N и X - вектор длины N.
Подробное описание алгоритма смотри в [1] (алгоритм LDP)
| 1. | Lawson C.L., Hanson R.J. "Solving least squares problem", Prentice - Hall Inc.,Englewood Cliffs,New Jersey, 1974. |
procedure ALD1R(var G :Array of Real; MDG :Integer; M :Integer;
N :Integer; var H :Array of Real;
var X :Array of Real; var XNORM :Real;
var W :Array of Real; var INDEX :Array of Integer;
var IERR :Integer);
Параметры
| G - | вещественный двумерный массив размера MDG на N, содержащий при входе в подпрограмму в первых M строках исходную матрицу A размерности M на N; |
| MDG - | число строк массива G (тип: целый); |
| M, N - | размерности исходной матрицы A (тип: целый); |
| H - | вещественный вектор длины M - правая часть системы неравенств; |
| X - | вещественный вектор длины N - в результате работы подпрограммы содержит решение (если IERR = 0); |
| XNORM - | вещественная переменная, содержащая по окончании работы подпрограммы евклидову норму найденного решения (если IERR = 0); |
| W - | вещественный рабочий вектор длины (N + 1) * (M + 2) + 2 * M; |
| INDEX - | целый рабочий вектор длины N; |
| IERR - | диагностический параметр - код завершения программы со значениями: |
| IERR= 0 - | решение получено успешно; |
| IERR= 1 - | система неравенств несовместна; |
| IERR=65 - | неправильная размерность параметров. |
Версии: нет
Вызываемые подпрограммы
| ALN1R - | вычисление приближения к псевдорешению системы линейных алгебраических уравнений на множестве неотрицательных векторов. |
Замечания по использованию
| 1. | Подпрограмма ALD1R обращается к вспомогательной подпрограмме с именем: ALN1R4 . |
Рассмотрим решение системы неравенств:
x + y ≥ 2
-2*x - y ≥ -4
-x - 2*y ≥ -4
Unit TALD1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ALD1R_p;
function TALD1R: String;
implementation
function TALD1R: String;
var
IERR,I :Integer;
XNORM :Real;
X :Array [0..1] of Real;
W :Array [0..20] of Real;
INDЕХ :Array [0..2] of Integer;
const
G :Array [0..5] of Real = ( 1.0,-2.0,-1.0,1.0,-1.0,-2.0 );
H :Array [0..2] of Real = ( 2.0,-4.0,-4.0 );
M :Integer = 3;
N :Integer = 2;
label
_10;
begin
Result := ''; { результат функции }
ALD1R(G,M,M,N,H,X,XNORM,W,INDEX,IERR);
Result := Result + Format('%s',[' ТЕСТ ПОДПРОГРАММЫ ALD1R']) + #$0D#$0A;
Result := Result + Format('%s',[' СИСТЕМА НЕРАВЕНСТВ: ' + #$0D#$0A]) + #$0D#$0A;
Result := Result + Format('%s',[' X + Y >= 2 ' + #$0D#$0A +
' -2*X - Y >= -4 ' + #$0D#$0A +
' -X - 2*Y >= -4 ' + #$0D#$0A]) + #$0D#$0A;
Result := Result + Format('%s',[' IERR: ']);
Result := Result + Format('%3d ',[IERR]) + #$0D#$0A;
if ( IERR <> 0 )
then goto _10;
Result := Result + #$0D#$0A;
for I:=1 to N do
begin
Result := Result + Format(' РЕШЕНИЕ: %11.3f ',[X[I-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' НОРМА: ']);
Result := Result + Format('%11.3f ',[XNORM]) + #$0D#$0A;
_10:
UtRes('TALD1R',Result); { вывод результатов в файл TALD1R.res }
exit;
end;
end.
Результаты:
IERR: 0
Решение: 1.000E+00 1.000E+00
XNORM: 1.414E + 00