Текст подпрограммы и версий ( Фортран )
aln1r.zip
Тексты тестовых примеров ( Фортран )
taln1r.zip
Текст подпрограммы и версий ( Си )
aln1r_c.zip
Тексты тестовых примеров ( Си )
taln1r_c.zip
Текст подпрограммы и версий ( Паскаль )
aln1r_p.zip
Тексты тестовых примеров ( Паскаль )
taln1r_p.zip

Подпрограмма:  ALN1R

Назначение

Вычисление приближения к псевдорешению системы линейных алгебраических уравнений на множестве неотрицательных векторов

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

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

                         A * X  =  B 

ищется вектор X с неотрицательными компонентами, минимизирующий невязку

                         || A * X - B || 

Подробное описание алгоритма смотри в [1] (алгоритм NNLS)

1.  Lawson C.L., Hanson R.J. "Solving Least Squares Problem", Prentice - Hall Inc., Englewood Cliffs, New Jersey, 1974.

Использование

    SUBROUTINE  ALN1R (A, MDA, M, N, B, X, RNORM, W, ZZ,
                                             INDEX, IERR) 

Параметры

A - вещественный двумерный массив размера MDA на N, содержащий при входе в подпрограмму в первых M строках матрицу A (I, J) размерности M на N. По окончании работы подпрограммы содержит произведение матриц Q * A, где Q - ортогональная матрица, размера M на M, вычисленная данной подпрограммой;
MDA - число строк массива A (тип: целый);
M, N - число строк и столбцов матрицы A, соответственно (тип: целый);
B - при входе в подпрограмму содержит вещественный вектор длины M - правую часть уравнения. В результате работы подпрограммы содержит вектор Q * B;
X - вещественный вектор длины N - в результате работы подпрограммы содержит решение;
RNORM - вещественная переменная, содержащая по окончании работы подпрограммы евклидову норму вектора невязки;
W - вещественный рабочий вектор длины N; по окончании работы подпрограммы содержит вектор двойственного решения, удовлетворяющего следующим соотношениям (см.[1]):
W(I) = 0. - для всех I из множества P;
W(I) ≤ 0. - для всех I из множества Z
ZZ - вещественный рабочий вектор длины M;
INDEX - целый рабочий вектор длины N; по окончании работы подпрограммы определяет множества P и Z следующим образом (см.[1]):
INDEX(1) до INDEX(NSETP) = множество P
INDEX(IZ1) до INDEX(N) = множество Z
IZ1 = NSETP + 1 = NPP1;
IERR - диагностический параметр - код завершения программы со значениями:
IERR= 0 - решение получено успешно;
IERR=65 - неправильная размерность параметров;
IERR=66 - требуется более чем 3*N итераций

Версии: нет

Вызываемые подпрограммы: нет

Замечания по использованию

  1.  Подпрограмма ALN1R обращается к вспомогательным подпрограммам с именами: ALN1R1, ALN1R2, ALN1R3, ALN1R4.

Примеры использования

Рассмотрим решение системы уравнений:

                       X +     Y + Z = 2 
                   2*X + 2*Y + Z = 4 
  
      DIMENSION A(2, 3), B(2), X(3), W(3), ZZ(2), INDEX(3) 
      DATA  A /1., 2., 1., 2., 1., 1./ 
      DATA  B /2., 4./ 
      CALL  ALN1R (A, 2, 2, 3, B, X, RNORM, W, ZZ, INDEX, IERR) 

Результаты:

      IERR:                0
      Решение:   2.00000E+00       .00000E+00      .00000E+00
      Невязка:   8.11612E-08
      W:             0.00000E + 00       .00000E + 00    -3.62964E-08
      INDEX:                         1                         2                        3

  Рассмотрим решение системы уравнений:

                     X + Y + 0 * Z = 1 
                     X  - Y + 0 * Z = 3 
   
      DIMENSION A(2, 3), B(2), X(3), W(3), ZZ(2), INDEX(3) 
      DATA  A /1., 1., 1., -1., 0., 0./ 
      DATA  B /1., 3./ 
      CALL  ALN1R (A, 2, 2, 3, B, X, RNORM, W, ZZ, INDEX, IERR) 

Результаты:

      IERR:      0
      Решение:   2.00000E+00       .00000E+00      .00000E+00
      Невязка:   1.41421E+00
      W:              .00000E + 00     -2.00000E + 00      .00000E + 00
      INDEX:                       1                           2                         3