00001 #include <stdlib.h>
00002 #include <string.h>
00003
00004 #include "nl.h"
00005
00006
00007
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
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
00036
00037 printf("Ненулевые элементы верхнетреугольной части матрицы A:\n");
00038 sp_print_list(IS, JS, SN, n, n, NULL, NULL);
00039
00040
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
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
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 }