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