📄 test.c
字号:
gsl_matrix_memcpy(qr,m); for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0); s += gsl_linalg_QRPT_decomp(qr, d, perm, &signum, norm); s += gsl_linalg_QRPT_solve(qr, d, perm, rhs, x); for(i=0; i<dim; i++) { int foo = check(gsl_vector_get(x, i), actual[i], eps); if(foo) { printf("%3d[%d]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]); } s += foo; } gsl_vector_free(norm); gsl_vector_free(x); gsl_vector_free(d); gsl_matrix_free(qr); gsl_vector_free(rhs); gsl_permutation_free(perm); return s;}int test_QRPT_solve(void){ int f; int s = 0; f = test_QRPT_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve hilbert(2)"); s += f; f = test_QRPT_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve hilbert(3)"); s += f; f = test_QRPT_solve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve hilbert(4)"); s += f; f = test_QRPT_solve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " QRPT_solve hilbert(12)"); s += f; f = test_QRPT_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve vander(2)"); s += f; f = test_QRPT_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve vander(3)"); s += f; f = test_QRPT_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_solve vander(4)"); s += f; f = test_QRPT_solve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " QRPT_solve vander(12)"); s += f; return s;}inttest_QRPT_QRsolve_dim(const gsl_matrix * m, const double * actual, double eps){ int s = 0; int signum; size_t i, dim = m->size1; gsl_permutation * perm = gsl_permutation_alloc(dim); gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * qr = gsl_matrix_alloc(dim,dim); gsl_matrix * q = gsl_matrix_alloc(dim,dim); gsl_matrix * r = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * x = gsl_vector_alloc(dim); gsl_vector * norm = gsl_vector_alloc(dim); gsl_matrix_memcpy(qr,m); for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0); s += gsl_linalg_QRPT_decomp2(qr, q, r, d, perm, &signum, norm); s += gsl_linalg_QRPT_QRsolve(q, r, perm, rhs, x); for(i=0; i<dim; i++) { int foo = check(gsl_vector_get(x, i), actual[i], eps); if(foo) { printf("%3d[%d]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]); } s += foo; } gsl_vector_free(norm); gsl_vector_free(x); gsl_vector_free(d); gsl_matrix_free(qr); gsl_vector_free(rhs); gsl_permutation_free(perm); return s;}int test_QRPT_QRsolve(void){ int f; int s = 0; f = test_QRPT_QRsolve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve hilbert(2)"); s += f; f = test_QRPT_QRsolve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve hilbert(3)"); s += f; f = test_QRPT_QRsolve_dim(hilb4, hilb4_solution, 2 * 2048.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve hilbert(4)"); s += f; f = test_QRPT_QRsolve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " QRPT_QRsolve hilbert(12)"); s += f; f = test_QRPT_QRsolve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve vander(2)"); s += f; f = test_QRPT_QRsolve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve vander(3)"); s += f; f = test_QRPT_QRsolve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_QRsolve vander(4)"); s += f; f = test_QRPT_QRsolve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " QRPT_QRsolve vander(12)"); s += f; return s;}inttest_QRPT_decomp_dim(const gsl_matrix * m, double eps){ int s = 0, signum; size_t i,j, M = m->size1, N = m->size2; gsl_matrix * qr = gsl_matrix_alloc(M,N); gsl_matrix * a = gsl_matrix_alloc(M,N); gsl_matrix * q = gsl_matrix_alloc(M,M); gsl_matrix * r = gsl_matrix_alloc(M,N); gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N)); gsl_vector * norm = gsl_vector_alloc(N); gsl_permutation * perm = gsl_permutation_alloc(N); gsl_matrix_memcpy(qr,m); s += gsl_linalg_QRPT_decomp(qr, d, perm, &signum, norm); s += gsl_linalg_QR_unpack(qr, d, q, r); /* compute a = q r */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, q, r, 0.0, a); /* Compute QR P^T by permuting the elements of the rows of QR */ for (i = 0; i < M; i++) { gsl_vector_view row = gsl_matrix_row (a, i); gsl_permute_vector_inverse (perm, &row.vector); } for(i=0; i<M; i++) { for(j=0; j<N; j++) { double aij = gsl_matrix_get(a, i, j); double mij = gsl_matrix_get(m, i, j); int foo = check(aij, mij, eps); if(foo) { printf("(%3d,%3d)[%d,%d]: %22.18g %22.18g\n", M, N, i,j, aij, mij); } s += foo; } } gsl_permutation_free (perm); gsl_vector_free(norm); gsl_vector_free(d); gsl_matrix_free(qr); gsl_matrix_free(a); gsl_matrix_free(q); gsl_matrix_free(r); return s;}int test_QRPT_decomp(void){ int f; int s = 0; f = test_QRPT_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp m(3,5)"); s += f; f = test_QRPT_decomp_dim(m53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp m(5,3)"); s += f; f = test_QRPT_decomp_dim(s35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp s(3,5)"); s += f; f = test_QRPT_decomp_dim(s53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp s(5,3)"); s += f; f = test_QRPT_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(2)"); s += f; f = test_QRPT_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(3)"); s += f; f = test_QRPT_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(4)"); s += f; f = test_QRPT_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp hilbert(12)"); s += f; f = test_QRPT_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(2)"); s += f; f = test_QRPT_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(3)"); s += f; f = test_QRPT_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QRPT_decomp vander(4)"); s += f; f = test_QRPT_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */ gsl_test(f, " QRPT_decomp vander(12)"); s += f; return s;}inttest_QR_update_dim(const gsl_matrix * m, double eps){ int s = 0; size_t i,j,k, M = m->size1, N = m->size2; gsl_vector * rhs = gsl_vector_alloc(N); gsl_matrix * qr1 = gsl_matrix_alloc(M,N); gsl_matrix * qr2 = gsl_matrix_alloc(M,N); gsl_matrix * q1 = gsl_matrix_alloc(M,M); gsl_matrix * r1 = gsl_matrix_alloc(M,N); gsl_matrix * q2 = gsl_matrix_alloc(M,M); gsl_matrix * r2 = gsl_matrix_alloc(M,N); gsl_vector * d = gsl_vector_alloc(GSL_MIN(M,N)); gsl_vector * solution1 = gsl_vector_alloc(N); gsl_vector * solution2 = gsl_vector_alloc(N); gsl_vector * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_matrix_memcpy(qr1,m); gsl_matrix_memcpy(qr2,m); for(i=0; i<N; i++) gsl_vector_set(rhs, i, i+1.0); for(i=0; i<M; i++) gsl_vector_set(u, i, sin(i+1.0)); for(i=0; i<N; i++) gsl_vector_set(v, i, cos(i+2.0) + sin(i*i+3.0)); for(i=0; i<M; i++) { double ui = gsl_vector_get(u, i); for(j=0; j<N; j++) { double vj = gsl_vector_get(v, j); double qij = gsl_matrix_get(qr1, i, j); gsl_matrix_set(qr1, i, j, qij + ui * vj); } } s += gsl_linalg_QR_decomp(qr2, d); s += gsl_linalg_QR_unpack(qr2, d, q2, r2); /* compute w = Q^T u */ for (j = 0; j < M; j++) { double sum = 0; for (i = 0; i < M; i++) sum += gsl_matrix_get (q2, i, j) * gsl_vector_get (u, i); gsl_vector_set (w, j, sum); } s += gsl_linalg_QR_update(q2, r2, w, v); /* compute qr2 = q2 * r2 */ for (i = 0; i < M; i++) { for (j = 0; j< N; j++) { double sum = 0; for (k = 0; k <= GSL_MIN(j,M-1); k++) { double qik = gsl_matrix_get(q2, i, k); double rkj = gsl_matrix_get(r2, k, j); sum += qik * rkj ; } gsl_matrix_set (qr2, i, j, sum); } } for(i=0; i<M; i++) { for(j=0; j<N; j++) { double s1 = gsl_matrix_get(qr1, i, j); double s2 = gsl_matrix_get(qr2, i, j); int foo = check(s1, s2, eps); if(foo) { printf("(%3d,%3d)[%d,%d]: %22.18g %22.18g\n", M, N, i,j, s1, s2); } s += foo; } } gsl_vector_free(solution1); gsl_vector_free(solution2); gsl_vector_free(d); gsl_vector_free(u); gsl_vector_free(v); gsl_vector_free(w); gsl_matrix_free(qr1); gsl_matrix_free(qr2); gsl_matrix_free(q1); gsl_matrix_free(r1); gsl_matrix_free(q2); gsl_matrix_free(r2); gsl_vector_free(rhs); return s;}int test_QR_update(void){ int f; int s = 0; f = test_QR_update_dim(m35, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update m(3,5)"); s += f; f = test_QR_update_dim(m53, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update m(5,3)"); s += f; f = test_QR_update_dim(hilb2, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update hilbert(2)"); s += f; f = test_QR_update_dim(hilb3, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update hilbert(3)"); s += f; f = test_QR_update_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update hilbert(4)"); s += f; f = test_QR_update_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update hilbert(12)"); s += f; f = test_QR_update_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update vander(2)"); s += f; f = test_QR_update_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update vander(3)"); s += f; f = test_QR_update_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " QR_update vander(4)"); s += f; f = test_QR_update_dim(vander12, 0.0005); /* FIXME: bad accuracy */ gsl_test(f, " QR_update vander(12)"); s += f; return s;}inttest_SV_solve_dim(const gsl_matrix * m, const double * actual, double eps){ int s = 0; size_t i, dim = m->size1; gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * u = gsl_matrix_alloc(dim,dim); gsl_matrix * q = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * x = gsl_vector_calloc(dim); gsl_matrix_memcpy(u,m); for(i=0; i<dim; i++) gsl_vector_set(rhs, i, i+1.0); s += gsl_linalg_SV_decomp(u, q, d, x); s += gsl_linalg_SV_solve(u, q, d, rhs, x); for(i=0; i<dim; i++) { int foo = check(gsl_vector_get(x, i), actual[i], eps); if(foo) { printf("%3d[%d]: %22.18g %22.18g\n", dim, i, gsl_vector_get(x, i), actual[i]); } s += foo; } gsl_vector_free(x); gsl_vector_free(d); gsl_matrix_free(u); gsl_matrix_free(q); gsl_vector_free(rhs); return s;}int test_SV_solve(void){ int f; int s = 0; f = test_SV_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_solve hilbert(2)"); s += f; f = test_SV_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_solve hilbert(3)"); s += f; f = test_SV_solve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_solve hilbert(4)"); s += f; f = test_SV_solve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " SV_solve hilbert(12)"); s += f; f = test_SV_solve_dim(vander2, vander2_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_solve vander(2)"); s += f; f = test_SV_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -