xsvd.c

00001 /*    
00002   Пример использования функций из модуля @svd.h@
00003   Решение задачи наименьших квадратов $Ax=b$
00004   с помощью сингулярного разложения
00005   $A =   \left(  \begin{array}{rrr}     1 & 5 & 9 \\       2 & 6 & 10 \\      3 & 7 & 11 \\      4 & 8 & 12 \\   \end{array}  \right)  $, $\quad b =    \left(   \begin{array}{r}      1 \\        1 \\       1 \\       2 \\    \end{array}   \right)  $
00006 */
00007 
00008 #include "nl.h"
00009 
00010 int main()
00011 {
00012   double **A, **U, **V, *w, *b, *x;
00013   size_t ierr;
00014   size_t m = 4;
00015   size_t n = 3;
00016 
00017   A = nl_dmatrix_create(m, n);
00018   U = nl_dmatrix_create(m, n);
00019   V = nl_dmatrix_create(n, n);
00020   w = nl_dvector_create(n);
00021   b = nl_dvector_create(m);
00022   x = nl_dvector_create(n);
00023 
00024   A[0][0] = 1; A[0][1] = 5; A[0][2] =  9;   b[0] = 1;
00025   A[1][0] = 2; A[1][1] = 6; A[1][2] = 10;   b[1] = 1;
00026   A[2][0] = 3; A[2][1] = 7; A[2][2] = 11;   b[2] = 1;
00027   A[3][0] = 4; A[3][1] = 8; A[3][2] = 12;   b[3] = 2;
00028 
00029   svd_decomp(A, m, n, w, 1, U, 1, V, &ierr);
00030   if (ierr)
00031   {
00032     printf("Сингулярные числа не были найдены ");
00033     printf("за 30 итераций\n");
00034     return 1;
00035   }
00036 
00037   printf("Матрица A:\n");
00038   nl_dmatrix_print(A, m, n, NULL);
00039 
00040   printf("\nМатрица U:\n");
00041   nl_dmatrix_print(U, m, n, NULL);
00042 
00043   printf("\nМатрица V:\n");
00044   nl_dmatrix_print(V, n, n, NULL);
00045 
00046   printf("\nСингулярные числа w:\n");
00047   nl_dvector_print(w, n, NULL);
00048 
00049   svd_correct(w, n, 1e-16);
00050   svd_least_squares(U, w, V, m, n, b, x);
00051 
00052   printf("\nПравая часть системы:\n");
00053   nl_dvector_print(b, m, NULL);
00054 
00055   printf("\nНормальное псевдорешение:\n");
00056   nl_dvector_print(x, n, NULL);
00057 
00058   nl_dmatrix_free(A, m);
00059   nl_dmatrix_free(U, m);
00060   nl_dmatrix_free(V, n);
00061   nl_dvector_free(w);
00062   nl_dvector_free(b);
00063   nl_dvector_free(x);
00064   
00065   return 0;
00066 }

Документация по NL. Последние изменения: Mon Oct 9 12:25:54 2006. Создано системой  doxygen 1.4.7