📄 test.c
字号:
gsl_test(f, " SV_solve vander(3)"); s += f; f = test_SV_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_solve vander(4)"); s += f; f = test_SV_solve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " SV_solve vander(12)"); s += f; return s;}inttest_SV_decomp_dim(const gsl_matrix * m, double eps){ int s = 0; double di1; size_t i,j, M = m->size1, N = m->size2; gsl_matrix * v = gsl_matrix_alloc(M,N); gsl_matrix * a = gsl_matrix_alloc(M,N); gsl_matrix * q = gsl_matrix_alloc(N,N); gsl_matrix * dqt = gsl_matrix_alloc(N,N); gsl_vector * d = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(N); gsl_matrix_memcpy(v,m); s += gsl_linalg_SV_decomp(v, q, d, w); /* Check that singular values are non-negative and in non-decreasing order */ di1 = 0.0; for (i = 0; i < N; i++) { double di = gsl_vector_get (d, i); if (di < 0) { s++; printf("singular value %d = %22.18g < 0\n", i, di); } if(i > 0 && di > di1) { s++; printf("singular value %d = %22.18g vs previous %22.18g\n", i, di, di1); } di1 = di; } /* Scale dqt = D Q^T */ for (i = 0; i < N ; i++) { double di = gsl_vector_get (d, i); for (j = 0; j < N; j++) { double qji = gsl_matrix_get(q, j, i); gsl_matrix_set (dqt, i, j, qji * di); } } /* compute a = v dqt */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, v, dqt, 0.0, a); 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_vector_free(w); gsl_vector_free(d); gsl_matrix_free(v); gsl_matrix_free(a); gsl_matrix_free(q); gsl_matrix_free(dqt); return s;}int test_SV_decomp(void){ int f; int s = 0; /* M<N not implemented yet */#if 0 f = test_SV_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp m(3,5)"); s += f;#endif f = test_SV_decomp_dim(m53, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp m(5,3)"); s += f; f = test_SV_decomp_dim(moler10, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp moler(10)"); s += f; f = test_SV_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp hilbert(2)"); s += f; f = test_SV_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp hilbert(3)"); s += f; f = test_SV_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp hilbert(4)"); s += f; f = test_SV_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp hilbert(12)"); s += f; f = test_SV_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp vander(2)"); s += f; f = test_SV_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp vander(3)"); s += f; f = test_SV_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp vander(4)"); s += f; f = test_SV_decomp_dim(vander12, 1e-4); gsl_test(f, " SV_decomp vander(12)"); s += f; f = test_SV_decomp_dim(row3, 10 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp row3"); s += f; f = test_SV_decomp_dim(row5, 128 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp row5"); s += f; f = test_SV_decomp_dim(row12, 1024 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp row12"); s += f; { double i1, i2, i3, i4; double lower = -2, upper = 2; for (i1 = lower; i1 <= upper; i1++) { for (i2 = lower; i2 <= upper; i2++) { for (i3 = lower; i3 <= upper; i3++) { for (i4 = lower; i4 <= upper; i4++) { gsl_matrix_set (A22, 0,0, i1); gsl_matrix_set (A22, 0,1, i2); gsl_matrix_set (A22, 1,0, i3); gsl_matrix_set (A22, 1,1, i4); f = test_SV_decomp_dim(A22, 16 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp (2x2) A=[%g, %g; %g, %g]", i1,i2,i3,i4); s += f; } } } } } { int i; double carry = 0, lower = 0, upper = 1; double *a = A33->data; for (i=0; i<9; i++) { a[i] = lower; } while (carry == 0.0) { f = test_SV_decomp_dim(A33, 64 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp (3x3) A=[ %g, %g, %g; %g, %g, %g; %g, %g, %g]", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); /* increment */ carry=1.0; for (i=9; i>0 && i--;) { double v=a[i]+carry; carry = (v>upper) ? 1.0 : 0.0; a[i] = (v>upper) ? lower : v; } } }#ifdef TEST_SVD_4X4 { int i; double carry = 0, lower = 0, upper = 1; double *a = A44->data; for (i=0; i<16; i++) { a[i] = lower; } while (carry == 0.0) { f = test_SV_decomp_dim(A44, 64 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp (4x4) A=[ %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g; %g, %g, %g, %g]", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); /* increment */ carry=1.0; for (i=16; i>0 && i--;) { double v=a[i]+carry; carry = (v>upper) ? 1.0 : 0.0; a[i] = (v>upper) ? lower : v; } } }#endif return s;}inttest_cholesky_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_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_cholesky_decomp(u); s += gsl_linalg_cholesky_solve(u, 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_matrix_free(u); gsl_vector_free(rhs); return s;}int test_cholesky_solve(void){ int f; int s = 0; f = test_cholesky_solve_dim(hilb2, hilb2_solution, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_solve hilbert(2)"); s += f; f = test_cholesky_solve_dim(hilb3, hilb3_solution, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_solve hilbert(3)"); s += f; f = test_cholesky_solve_dim(hilb4, hilb4_solution, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_solve hilbert(4)"); s += f; f = test_cholesky_solve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " cholesky_solve hilbert(12)"); s += f; return s;}inttest_cholesky_decomp_dim(const gsl_matrix * m, double eps){ int s = 0; size_t i,j, M = m->size1, N = m->size2; gsl_matrix * v = gsl_matrix_alloc(M,N); gsl_matrix * a = gsl_matrix_alloc(M,N); gsl_matrix * l = gsl_matrix_alloc(M,N); gsl_matrix * lt = gsl_matrix_alloc(N,N); gsl_matrix_memcpy(v,m); s += gsl_linalg_cholesky_decomp(v); /* Compute L LT */ for (i = 0; i < N ; i++) { for (j = 0; j < N; j++) { double vij = gsl_matrix_get(v, i, j); gsl_matrix_set (l, i, j, i>=j ? vij : 0); gsl_matrix_set (lt, i, j, i<=j ? vij : 0); } } /* compute a = l lt */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, l, lt, 0.0, a); 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_matrix_free(v); gsl_matrix_free(a); gsl_matrix_free(l); gsl_matrix_free(lt); return s;}int test_cholesky_decomp(void){ int f; int s = 0; f = test_cholesky_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_decomp hilbert(2)"); s += f; f = test_cholesky_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_decomp hilbert(3)"); s += f; f = test_cholesky_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_decomp hilbert(4)"); s += f; f = test_cholesky_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " cholesky_decomp hilbert(12)"); s += f; return s;}inttest_HH_solve_dim(const gsl_matrix * m, const double * actual, double eps){ int s = 0; size_t i, dim = m->size1; gsl_permutation * perm = gsl_permutation_alloc(dim); gsl_matrix * hh = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * x = gsl_vector_alloc(dim); gsl_matrix_memcpy(hh,m); for(i=0; i<dim; i++) gsl_vector_set(x, i, i+1.0); s += gsl_linalg_HH_svx(hh, 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(hh); gsl_permutation_free(perm); return s;}int test_HH_solve(void){ int f; int s = 0; f = test_HH_solve_dim(hilb2, hilb2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve hilbert(2)"); s += f; f = test_HH_solve_dim(hilb3, hilb3_solution, 128.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve hilbert(3)"); s += f; f = test_HH_solve_dim(hilb4, hilb4_solution, 2.0 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve hilbert(4)"); s += f; f = test_HH_solve_dim(hilb12, hilb12_solution, 0.5); gsl_test(f, " HH_solve hilbert(12)"); s += f; f = test_HH_solve_dim(vander2, vander2_solution, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve vander(2)"); s += f; f = test_HH_solve_dim(vander3, vander3_solution, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve vander(3)"); s += f; f = test_HH_solve_dim(vander4, vander4_solution, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " HH_solve vander(4)"); s += f; f = test_HH_solve_dim(vander12, vander12_solution, 0.05); gsl_test(f, " HH_solve vander(12)"); s += f; return s;}inttest_TD_solve_dim(size_t dim, double d, double od, const double * actual, double eps){ int s = 0; size_t i; gsl_vector * offdiag = gsl_vector_alloc(dim-1); gsl_vector * diag = gsl_vector_alloc(dim); gsl_vector * rhs = gsl_vector_alloc(dim); gsl_vector * x = gsl_vector_alloc(dim); for(i=0; i<dim; i++) { gsl_vector_set(diag, i, d); gsl_vector_set(rhs, i, i + 1.0); } for(i=0; i<dim-1; i++) { gsl_vector_set(offdiag, i, od); } s += gsl_linalg_solve_symm_tridiag(diag, offdiag, rhs, x); for(i=0; i<dim; i++) { double si = gsl_vector_get(x, i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -