|
Текст подпрограммы и версий ald1r_c.zip |
Тексты тестовых примеров tald1r_c.zip |
Вычисление решения с минимальной евклидовой нормой системы линейных алгебраических неравенств.
Для системы линейных алгебраических неравенств
A * X ≥ H
ищется вектор X минимальной нормы
|| X || - min
Здесь A - прямоугольная матрица размерности M на N и X - вектор длины N.
Подробное описание алгоритма смотри в [1] (алгоритм LDP)
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