/* Author: G. Jungman * RCS: $Id: test_la.c,v 1.18 1999/12/05 14:09:28 bjg Exp $ */ #include #include #include "gsl_linalg.h" static int check (double x, double actual, double eps) { if (actual == 0) return fabs(x) > eps; else return (fabs(x - actual)/fabs(actual)) > eps; } gsl_matrix * create_hilbert_matrix(int size) { int i, j; gsl_matrix * m = gsl_matrix_alloc(size, size); for(i=0; i GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 1) - 65.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 2) - 30.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 0) - 30.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 1) - 65.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 2) - 42.0) > GSL_DBL_EPSILON ); gsl_matrix_free(A); gsl_matrix_free(B); gsl_matrix_free(C); return s; } int test_matmult_mod(void) { int s = 0; gsl_matrix * A = gsl_matrix_calloc(3, 3); gsl_matrix * B = gsl_matrix_calloc(3, 3); gsl_matrix * C = gsl_matrix_calloc(3, 3); gsl_matrix_set(A, 0, 0, 10.0); gsl_matrix_set(A, 0, 1, 5.0); gsl_matrix_set(A, 0, 2, 1.0); gsl_matrix_set(A, 1, 0, 1.0); gsl_matrix_set(A, 1, 1, 20.0); gsl_matrix_set(A, 1, 2, 5.0); gsl_matrix_set(A, 2, 0, 1.0); gsl_matrix_set(A, 2, 1, 3.0); gsl_matrix_set(A, 2, 2, 7.0); gsl_matrix_set(B, 0, 0, 10.0); gsl_matrix_set(B, 0, 1, 5.0); gsl_matrix_set(B, 0, 2, 2.0); gsl_matrix_set(B, 1, 0, 1.0); gsl_matrix_set(B, 1, 1, 3.0); gsl_matrix_set(B, 1, 2, 2.0); gsl_matrix_set(B, 2, 0, 1.0); gsl_matrix_set(B, 2, 1, 3.0); gsl_matrix_set(B, 2, 2, 2.0); gsl_la_matmult_mod_impl(A, GSL_LA_MOD_NONE, B, GSL_LA_MOD_NONE, C); s += ( fabs(gsl_matrix_get(C, 0, 0) - 106.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 1) - 68.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 2) - 32.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 0) - 35.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 1) - 80.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 2) - 52.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 0) - 20.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 1) - 35.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 2) - 22.0) > GSL_DBL_EPSILON ); gsl_la_matmult_mod_impl(A, GSL_LA_MOD_TRANSPOSE, B, GSL_LA_MOD_NONE, C); s += ( fabs(gsl_matrix_get(C, 0, 0) - 102.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 1) - 56.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 2) - 24.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 0) - 73.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 1) - 94.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 2) - 56.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 0) - 22.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 1) - 41.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 2) - 26.0) > GSL_DBL_EPSILON ); gsl_la_matmult_mod_impl(A, GSL_LA_MOD_NONE, B, GSL_LA_MOD_TRANSPOSE, C); s += ( fabs(gsl_matrix_get(C, 0, 0) - 127.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 1) - 27.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 2) - 27.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 0) - 120.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 1) - 71.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 2) - 71.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 0) - 39.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 1) - 24.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 2) - 24.0) > GSL_DBL_EPSILON ); gsl_la_matmult_mod_impl(A, GSL_LA_MOD_TRANSPOSE, B, GSL_LA_MOD_TRANSPOSE, C); s += ( fabs(gsl_matrix_get(C, 0, 0) - 107.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 1) - 15.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 0, 2) - 15.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 0) - 156.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 1) - 71.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 1, 2) - 71.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 0) - 49.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 1) - 30.0) > GSL_DBL_EPSILON ); s += ( fabs(gsl_matrix_get(C, 2, 2) - 30.0) > GSL_DBL_EPSILON ); gsl_matrix_free(A); gsl_matrix_free(B); gsl_matrix_free(C); return s; } static int test_LU_solve_dim(const gsl_matrix * m, const double * actual, double eps) { int s = 0; int signum; size_t i, dim = m->size1; gsl_vector_int * perm = gsl_vector_int_alloc(dim); gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * lu = gsl_matrix_alloc(dim,dim); gsl_vector * solution = gsl_vector_alloc(dim); gsl_matrix_copy(lu,m); for(i=0; isize1; gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * qr = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * solution = gsl_vector_alloc(dim); gsl_matrix_copy(qr,m); for(i=0; isize1; gsl_vector_int * perm = gsl_vector_int_alloc(dim); gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * qr = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * solution = gsl_vector_alloc(dim); gsl_matrix_copy(qr,m); for(i=0; isize1; gsl_vector * rhs = gsl_vector_alloc(dim); gsl_matrix * qr1 = gsl_matrix_alloc(dim,dim); gsl_matrix * qr2 = gsl_matrix_alloc(dim,dim); gsl_matrix * q1 = gsl_matrix_alloc(dim,dim); gsl_matrix * r1 = gsl_matrix_alloc(dim,dim); gsl_matrix * q2 = gsl_matrix_alloc(dim,dim); gsl_matrix * r2 = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * solution1 = gsl_vector_alloc(dim); gsl_vector * solution2 = gsl_vector_alloc(dim); gsl_vector * u = gsl_vector_alloc(dim); gsl_vector * v = gsl_vector_alloc(dim); gsl_vector * w = gsl_vector_alloc(dim); gsl_matrix_copy(qr1,m); gsl_matrix_copy(qr2,m); for(i=0; isize1; gsl_vector_int * perm = gsl_vector_int_alloc(dim); gsl_matrix * hh = gsl_matrix_alloc(dim,dim); gsl_vector * d = gsl_vector_alloc(dim); gsl_vector * solution = gsl_vector_alloc(dim); gsl_matrix_copy(hh,m); for(i=0; i