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

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

Назначение

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

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

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

                         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.

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

    int aln1r_c (real *a, integer *mda, integer *m, integer *n,
            real *b, real *x, real *rnorm, real *w, real *zz, integer *index, 
            integer *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_c обращается к вспомогательным подпрограммам с именами: aln1r1_c, aln1r2_c, aln1r3_c, aln1r4_c.

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

int main(void)
{
    /* Initialized data */
    static float a[6] /* was [2][3] */ = { 1.f,2.f,1.f,2.f,1.f,1.f };
    static float b[2] = { 2.f,4.f };
    static float a1[6] /* was [2][3] */ = { 1.f,1.f,1.f,-1.f,0.f,0.f };
    static float b1[2] = { 1.f,3.f };

    /* Local variables */
    static int ierr;
    extern int aln1r_c(float *, int *, int *, int *, float *, float *,
                       float *, float *, float *, int *, int *);
    static float w[3], x[3];
    static int index[3];
    static float rnorm, zz[2];

    aln1r_c(a, &c__2, &c__2, &c__3, b, x, &rnorm, w, zz, index, &ierr);

   printf("\n ierr = %5i \n", ierr);
   printf("\n x = %15.5e %15.5e %15.5e \n", x[0], x[1], x[2]);
   printf("\n rnorm = %15.5e \n", rnorm);
   printf("\n w = %15.5e %15.5e %15.5e \n", w[0], w[1], w[2]);
   printf("\n index = %5i %5i %5i \n", index[0], index[1], index[2]);
    aln1r_c(a1, &c__2, &c__2, &c__3, b1, x, &rnorm, w, zz, index, &ierr);

   printf("\n ierr = %5i \n", ierr);
   printf("\n x = %15.5e %15.5e %15.5e \n", x[0], x[1], x[2]);
   printf("\n rnorm = %15.5e \n", rnorm);
   printf("\n w = %15.5e %15.5e %15.5e \n", w[0], w[1], w[2]);
   printf("\n index = %5i %5i %5i \n", index[0], index[1], index[2]);
    return 0;
} /* main */


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

                   x +     y + z = 2 
                   2*x + 2*y + z = 4 

Результаты:

      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 
   
Результаты:

      ierr:      0
      решение:   2.00000e+00       .00000e+00      .00000e+00
      невязка:   1.41421e+00
      w:              .00000e + 00     -2.00000e + 00      .00000e + 00
      index:                       1                           2                         3