Текст подпрограммы и версий
ald1r_p.zip
Тексты тестовых примеров
tald1r_p.zip

Подпрограмма:  ALD1R (модуль ALD1R_p)

Назначение

Вычисление решения с минимальной евклидовой нормой системы линейных алгебраических неравенств.

Математическое описание

Для системы линейных алгебраических неравенств

        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