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

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

Назначение

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

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

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

        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.

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

    int ald1r_c (real *g, integer *mdg, integer *m, integer *n,
            real *h, real *x, real *xnorm, real *w, integer *index,
            integer *ierr)

Параметры

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_c - вычисление приближения к псевдорешению системы линейных алгебраических уравнений на множестве неотрицательных векторов

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

  1.  Подпрограмма ald1r_c обращается к вспомогательной подпрограмме с именем: aln1r4_c

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

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

                   x +     y ≥  2
                -2*x -     y ≥ -4
                    -x - 2*y ≥ -4
 
int main(void)
{
    /* Initialized data */
    static float g[6] /* was [3][2] */ = { 1.f,-2.f,-1.f,1.f,-1.f,-2.f };
    static float h__[3] = { 2.f,-4.f,-4.f };
    static int m = 3;
    static int n = 2;

    /* Local variables */
    static int ierr;
    extern int ald1r_c(float *, int *, int *, int *, float *, float *,
                       float *, float *, int *, int *);
    static float w[21], x[2];
    static int index[3];
    static float xnorm;

    ald1r_c(g, &m, &m, &n, h__, x, &xnorm, w, index, &ierr);

    printf("\n ierr = %5i \n", ierr);
    if (ierr != 0) { goto l10; }
    printf("\n x = %11.3e %11.3e \n", x[0], x[1]);
    printf("\n xnorm = %11.3e \n", xnorm);
l10:
    return 0;
} /* main */


Результаты: 

      ierr:      0 
      peшeниe:   1.000e+00   1.000e+00
      xnorm:     1.414e + 00