|
Текст подпрограммы и версий aln1r_c.zip |
Тексты тестовых примеров taln1r_c.zip |
Вычисление приближения к псевдорешению системы линейных алгебраических уравнений на множестве неотрицательных векторов.
Для системы линейных алгебраических уравнений:
A * x = B
ищется вектор X с неотрицательными компонентами, минимизирующий невязку
|| A * X - B ||
Подробное описание алгоритма смотри в [1] (алгоритм NNLS)
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