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