⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 The GNU Scientific Library (GSL) is a numerical library for C and C++ programmers.
💻 C
📖 第 1 页 / 共 5 页
字号:
  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 + -