📄 test.c
字号:
int foo = check(aij, mij, eps); if(foo) { printf("(%3lu,%3lu)[%lu,%lu]: %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(lq); gsl_matrix_free(a); gsl_matrix_free(q); gsl_matrix_free(l); return s;}int test_PTLQ_decomp(void){ int f; int s = 0; f = test_PTLQ_decomp_dim(m35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp m(3,5)"); s += f; f = test_PTLQ_decomp_dim(m53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp m(5,3)"); s += f; f = test_PTLQ_decomp_dim(s35, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp s(3,5)"); s += f; f = test_PTLQ_decomp_dim(s53, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp s(5,3)"); s += f; f = test_PTLQ_decomp_dim(hilb2, 2 * 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp hilbert(2)"); s += f; f = test_PTLQ_decomp_dim(hilb3, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp hilbert(3)"); s += f; f = test_PTLQ_decomp_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp hilbert(4)"); s += f; f = test_PTLQ_decomp_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp hilbert(12)"); s += f; f = test_PTLQ_decomp_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp vander(2)"); s += f; f = test_PTLQ_decomp_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp vander(3)"); s += f; f = test_PTLQ_decomp_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " PTLQ_decomp vander(4)"); s += f; f = test_PTLQ_decomp_dim(vander12, 0.0005); /* FIXME: bad accuracy */ gsl_test(f, " PTLQ_decomp vander(12)"); s += f; return s;}inttest_LQ_update_dim(const gsl_matrix * m, double eps){ int s = 0; unsigned long i,j, M = m->size1, N = m->size2; gsl_matrix * lq1 = gsl_matrix_alloc(N,M); gsl_matrix * lq2 = gsl_matrix_alloc(N,M); gsl_matrix * q1 = gsl_matrix_alloc(M,M); gsl_matrix * l1 = gsl_matrix_alloc(N,M); gsl_matrix * q2 = gsl_matrix_alloc(M,M); gsl_matrix * l2 = gsl_matrix_alloc(N,M); gsl_vector * d2 = gsl_vector_alloc(GSL_MIN(M,N)); gsl_vector * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_matrix_transpose_memcpy(lq1,m); gsl_matrix_transpose_memcpy(lq2,m); 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)); /* lq1 is updated */ gsl_blas_dger(1.0, v, u, lq1); /* lq2 is first decomposed, updated later */ s += gsl_linalg_LQ_decomp(lq2, d2); s += gsl_linalg_LQ_unpack(lq2, d2, q2, l2); /* compute w = Q^T u */ gsl_blas_dgemv(CblasNoTrans, 1.0, q2, u, 0.0, w); /* now lq2 is updated */ s += gsl_linalg_LQ_update(q2, l2, v, w); /* multiply q2*l2 */ gsl_blas_dgemm(CblasNoTrans,CblasNoTrans,1.0,l2,q2,0.0,lq2); /* check lq1==lq2 */ for(i=0; i<N; i++) { for(j=0; j<M; j++) { double s1 = gsl_matrix_get(lq1, i, j); double s2 = gsl_matrix_get(lq2, i, j); int foo = check(s1, s2, eps);#if 0 if(foo) { printf("LQ:(%3lu,%3lu)[%lu,%lu]: %22.18g %22.18g\n", M, N, i,j, s1, s2); }#endif s += foo; } } gsl_vector_free(d2); gsl_vector_free(u); gsl_vector_free(v); gsl_vector_free(w); gsl_matrix_free(lq1); gsl_matrix_free(lq2); gsl_matrix_free(q1); gsl_matrix_free(l1); gsl_matrix_free(q2); gsl_matrix_free(l2); return s;}int test_LQ_update(void){ int f; int s = 0; f = test_LQ_update_dim(m35, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update m(3,5)"); s += f; f = test_LQ_update_dim(m53, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update m(5,3)"); s += f; f = test_LQ_update_dim(hilb2, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update hilbert(2)"); s += f; f = test_LQ_update_dim(hilb3, 2 * 512.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update hilbert(3)"); s += f; f = test_LQ_update_dim(hilb4, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update hilbert(4)"); s += f; f = test_LQ_update_dim(hilb12, 2 * 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update hilbert(12)"); s += f; f = test_LQ_update_dim(vander2, 8.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update vander(2)"); s += f; f = test_LQ_update_dim(vander3, 64.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update vander(3)"); s += f; f = test_LQ_update_dim(vander4, 1024.0 * GSL_DBL_EPSILON); gsl_test(f, " LQ_update vander(4)"); s += f; f = test_LQ_update_dim(vander12, 0.0005); /* FIXME: bad accuracy */ gsl_test(f, " LQ_update vander(12)"); s += f; return s;}inttest_SV_solve_dim(const gsl_matrix * m, const double * actual, double eps){ int s = 0; unsigned long 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("%3lu[%lu]: %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); 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; unsigned long 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 (gsl_isnan (di)) { continue; /* skip NaNs */ } if (di < 0) { s++; printf("singular value %lu = %22.18g < 0\n", i, di); } if(i > 0 && di > di1) { s++; printf("singular value %lu = %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("(%3lu,%3lu)[%lu,%lu]: %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; f = test_SV_decomp_dim(m11, 2 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp m(1,1)"); s += f; f = test_SV_decomp_dim(m51, 2 * 64.0 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp m(5,1)"); s += f; /* 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; f = test_SV_decomp_dim(inf5, 1024 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp inf5"); s += f; f = test_SV_decomp_dim(nan5, 1024 * GSL_DBL_EPSILON); gsl_test(f, " SV_decomp nan5"); 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 =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -