Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.ru/lib_na/cat/al_htm_c/aln1r_c.htm
Дата изменения: Fri Dec 4 09:50:12 2015 Дата индексирования: Sun Apr 10 02:19:25 2016 Кодировка: Windows-1251 |
Текст подпрограммы и версий 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