00001
00002
00003
00004
00005
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 }