xmda.c

00001 #include <stdlib.h>
00002 #include <string.h> 
00003 
00004 #include "nl.h"
00005 
00006 /*
00007   Пример использования функций из модуля @mda.h@
00008   Метод минимальной степени
00009 */
00010 
00011 int main()
00012 {
00013 
00014   double *A, *SN, *SD, *BN, *BD, *UN, *UD, *DINV, *x, *b, *pb;  
00015   size_t *I, *J, *IA, *JA, *IS, *JS, *IB, *JB, *D, *P, *IP, *M, *L, *IU, *JU;
00016   size_t n, nz, k, unz;  
00017 
00018   // Генерируем верхнетреугольную часть матрицы A
00019 
00020   n = 5;
00021   nz = n - 1;
00022   A = nl_dvector_create(nz);
00023   I = nl_xvector_create(nz);
00024   J = nl_xvector_create(nz);
00025   for (k = 0; k < nz; k++)
00026     A[k] = 1.;
00027   for (k = 0; k < nz; k++)
00028   {
00029     I[k] = 0;
00030     J[k] = k + 1;
00031   }
00032 
00033   sp_create_sym(n, nz, &IS, &JS, &SN, &SD);
00034   sp_convert(nz, A, I, J, n, IS, JS, SN);
00035   //sp_order(IS, JS, SN, n); //Его здесь в общем случае нужно применять. Но он дает ошибку.
00036 
00037   printf("Ненулевые элементы верхнетреугольной части матрицы A:\n");
00038   sp_print_list(IS, JS, SN, n, n, NULL, NULL);
00039 
00040   // Генерируем диагональную часть матрицы A
00041 
00042   SD[0] = n;
00043   for(k = 1; k < n; k++) 
00044     SD[k] = 1.;
00045 
00046   printf("\nДиагональные элементы матрицы A:\n");
00047   nl_dvector_print(SD, n, 0);
00048 
00049   // Конвертируем представление в полное и вызываем алгоритм MDA
00050 
00051   mda_create(n, nz, &IA, &JA, &D, &P, &IP, &M, &L);
00052   mda_convert(n, IS, JS, IA, JA, D, P, IP);
00053   unz = mda_order(n, IA, JA, M, L, D, P, IP);
00054 
00055   printf("\nПерестановка, найденная методом MDA:\n");
00056   nl_xvector_print(P, n, NULL);
00057   printf("\nОбратная перестановка:\n");
00058   nl_xvector_print(IP, n, NULL);
00059 
00060   // Применяем перестановку к матрице A:
00061   
00062   sp_create_sym(n, nz, &IB, &JB, &BN, &BD);
00063   sp_permute_sym(n, IS, JS, IB, JB, SN, SD, BN, BD, IP);
00064 
00065   printf("\nНаддиагональные элементы после перестановки:\n");
00066   sp_print_list(IB, JB, BN, n, n, NULL, NULL);
00067   printf("\nДиагональные элементы после перестановки:\n");
00068   nl_dvector_print(BD, n, NULL);
00069 
00070   // Символическое и численное разложения
00071 
00072   DINV = nl_dvector_create(n);
00073   sp_create_sym(n, unz, &IU, &JU, &UN, &UD);
00074   
00075   sp_chol_symb(IB, JB, n, IU, JU, unz);
00076   sp_chol_num(IB, JB, BN, BD, IU, JU, n, UN, DINV);
00077 
00078   printf("\nВерхнетреугольная часть матрицы U:\n");
00079   sp_print_list(IU, JU, UN, n, n, NULL, NULL);
00080 
00081   printf("\nЭлементы, обратные диагональным элементам");
00082   printf(" матрицы D:\n");
00083   nl_dvector_print(DINV, n, NULL);
00084 
00085   // Составляем систему
00086 
00087   x = nl_dvector_create(n);
00088   for(k = 0; k < n; k++) 
00089     x[k] = k;
00090 
00091   b = nl_dvector_create(n);
00092   sp_mult_col_sym(IS, JS, SN, SD, x, n, b);
00093   printf("\nПравая часть системы:\n");
00094   nl_dvector_print(b, n, NULL);
00095 
00096   // Решаем систему
00097 
00098   pb = nl_dvector_create(n);
00099   nl_dvector_permute(b, P, n, pb);
00100 
00101   sp_chol_solve(IU, JU, UN, DINV, pb, n, x);
00102   nl_dvector_permute(x, IP, n, b);
00103 
00104   printf("\nРешение:\n");
00105   nl_dvector_print(b, n, NULL);
00106 
00107   // Освобождаем память
00108 
00109   nl_dvector_free(A);
00110   nl_xvector_free(I);
00111   nl_xvector_free(J);
00112   sp_free_sym(IS, JS, SN, SD);
00113   mda_free(IA, JA, D, P, IP, M, L);
00114   sp_free_sym(IB, JB, BN, BD);
00115   nl_dvector_free(DINV);
00116   sp_free_sym(IU, JU, UN, UD);
00117   nl_dvector_free(x);
00118   nl_dvector_free(b);
00119   nl_dvector_free(pb);
00120 
00121   return 0;
00122 
00123 }

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