gsl 1.14.7 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/ChangeLog +139 -134
  2. data/Rakefile +4 -3
  3. data/VERSION +1 -1
  4. data/ext/array.c +0 -24
  5. data/ext/array_complex.c +11 -10
  6. data/ext/blas1.c +9 -6
  7. data/ext/block_source.c +4 -3
  8. data/ext/dirac.c +0 -6
  9. data/ext/error.c +1 -2
  10. data/ext/extconf.rb +9 -4
  11. data/ext/fft.c +22 -12
  12. data/ext/function.c +2 -2
  13. data/ext/graph.c +2 -0
  14. data/ext/gsl_narray.c +1 -7
  15. data/ext/histogram.c +0 -8
  16. data/ext/ieee.c +3 -1
  17. data/ext/integration.c +5 -3
  18. data/ext/linalg.c +11 -16
  19. data/ext/linalg_complex.c +1 -3
  20. data/ext/matrix_complex.c +10 -5
  21. data/ext/matrix_int.c +10 -10
  22. data/ext/matrix_source.c +3 -2
  23. data/ext/multifit.c +21 -29
  24. data/ext/multimin.c +1 -3
  25. data/ext/odeiv.c +9 -6
  26. data/ext/poly_source.c +82 -52
  27. data/ext/sf_bessel.c +8 -4
  28. data/ext/sf_coulomb.c +8 -8
  29. data/ext/sf_coupling.c +9 -6
  30. data/ext/sf_dilog.c +3 -2
  31. data/ext/sf_elementary.c +6 -4
  32. data/ext/sf_elljac.c +3 -2
  33. data/ext/sf_exp.c +15 -10
  34. data/ext/sf_gamma.c +9 -6
  35. data/ext/sf_gegenbauer.c +3 -2
  36. data/ext/sf_hyperg.c +18 -12
  37. data/ext/sf_laguerre.c +3 -2
  38. data/ext/sf_legendre.c +3 -2
  39. data/ext/sf_log.c +3 -2
  40. data/ext/sf_power.c +3 -2
  41. data/ext/sf_trigonometric.c +9 -6
  42. data/ext/signal.c +1 -3
  43. data/ext/siman.c +1 -2
  44. data/ext/stats.c +1 -0
  45. data/ext/vector_complex.c +5 -2
  46. data/ext/vector_double.c +13 -8
  47. data/ext/vector_source.c +6 -5
  48. data/ext/wavelet.c +16 -8
  49. data/include/rb_gsl_common.h +5 -6
  50. data/include/rb_gsl_config.h +62 -0
  51. data/include/rb_gsl_with_narray.h +6 -1
  52. data/lib/gsl.rb +3 -0
  53. data/lib/rbgsl.rb +3 -0
  54. data/rdoc/fit.rdoc +5 -5
  55. data/rdoc/ndlinear.rdoc +5 -2
  56. data/tests/gsl_test2.rb +3 -0
  57. data/tests/matrix/matrix_complex_test.rb +36 -0
  58. data/tests/narray/blas_dnrm2.rb +20 -0
  59. data/tests/poly/poly.rb +48 -0
  60. data/tests/sf/test_mode.rb +19 -0
  61. data/tests/stats_mt.rb +16 -0
  62. metadata +15 -11
  63. data/ext/MANIFEST +0 -119
@@ -499,13 +499,16 @@ VALUE rb_gsl_vector_to_i(VALUE obj)
499
499
  }
500
500
 
501
501
  /* singleton */
502
+ #ifdef HAVE_GNU_GRAPH
502
503
  static void draw_hist(VALUE obj, FILE *fp);
503
504
  static void draw_vector(VALUE obj, FILE *fp);
504
505
  static void draw_vector2(VALUE xx, VALUE yy, FILE *fp);
505
506
  static void draw_vector_array(VALUE ary, FILE *fp);
506
507
  #ifdef HAVE_NARRAY_H
507
508
  static void draw_narray(VALUE obj, FILE *fp);
508
- #endif
509
+ #endif // HAVE_NARRAY_H
510
+ #endif // HAVE_GNU_GRAPH
511
+
509
512
  static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
510
513
  {
511
514
  #ifdef HAVE_GNU_GRAPH
@@ -621,6 +624,7 @@ static VALUE rb_gsl_vector_graph2(int argc, VALUE *argv, VALUE obj)
621
624
  #endif
622
625
  }
623
626
 
627
+ #ifdef HAVE_GNU_GRAPH
624
628
  static void draw_vector(VALUE obj, FILE *fp)
625
629
  {
626
630
  gsl_vector *x = NULL;
@@ -635,7 +639,7 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
635
639
  {
636
640
  #ifdef HAVE_NARRAY_H
637
641
  struct NARRAY *nax, *nay;
638
- #endif
642
+ #endif // HAVE_NARRAY_H
639
643
  double *ptr1 = NULL, *ptr2 = NULL;
640
644
  gsl_vector *vx, *vy;
641
645
  size_t j, n, stridex = 1, stridey = 1;
@@ -650,7 +654,7 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
650
654
  ptr1 = (double *) nax->ptr;
651
655
  n = nax->total;
652
656
  stridex = 1;
653
- #endif
657
+ #endif // HAVE_NARRAY_H
654
658
  } else {
655
659
  rb_raise(rb_eTypeError, "wrong argument type %s (Vector expected)",
656
660
  rb_class2name(CLASS_OF(xx)));
@@ -665,7 +669,7 @@ static void draw_vector2(VALUE xx, VALUE yy, FILE *fp)
665
669
  GetNArray(yy, nay);
666
670
  ptr2 = (double *) nay->ptr;
667
671
  stridey = 1;
668
- #endif
672
+ #endif // HAVE_NARRAY_H
669
673
  } else {
670
674
  rb_raise(rb_eTypeError, "wrong argument type %s (Vector expected)",
671
675
  rb_class2name(CLASS_OF(yy)));
@@ -687,7 +691,7 @@ static void draw_narray(VALUE obj, FILE *fp)
687
691
  fprintf(fp, "%d %g\n", (int) j, ptr[j]);
688
692
  fflush(fp);
689
693
  }
690
- #endif
694
+ #endif // HAVE_NARRAY_H
691
695
 
692
696
  static void draw_hist(VALUE obj, FILE *fp)
693
697
  {
@@ -757,6 +761,7 @@ static void draw_vector_array(VALUE ary, FILE *fp)
757
761
  }
758
762
  fflush(fp);
759
763
  }
764
+ #endif // HAVE_GNU_GRAPH
760
765
 
761
766
  /* singleton */
762
767
  static VALUE rb_gsl_vector_plot2(int argc, VALUE *argv, VALUE obj)
@@ -869,7 +874,7 @@ static VALUE rb_gsl_vector_normalize(int argc, VALUE *argv, VALUE obj)
869
874
  static VALUE rb_gsl_vector_normalize_bang(int argc, VALUE *argv, VALUE obj)
870
875
  {
871
876
  gsl_vector *v = NULL;
872
- double mean;
877
+ // double mean;
873
878
  double nrm;
874
879
  double factor;
875
880
  switch (argc) {
@@ -885,8 +890,8 @@ static VALUE rb_gsl_vector_normalize_bang(int argc, VALUE *argv, VALUE obj)
885
890
  break;
886
891
  }
887
892
  Data_Get_Vector(obj, v);
888
- mean = gsl_stats_mean(v->data, v->stride, v->size);
889
- /* gsl_vector_add_constant(v, -mean);
893
+ /* mean = gsl_stats_mean(v->data, v->stride, v->size);
894
+ gsl_vector_add_constant(v, -mean);
890
895
  sd = gsl_stats_sd(v->data, v->stride, v->size);
891
896
  gsl_vector_scale(v, sqrt(nrm)/sd);*/
892
897
  factor = nrm/gsl_blas_dnrm2(v);
@@ -1299,18 +1299,19 @@ VALUE FUNCTION(rb_gsl_vector,to_s)(VALUE obj)
1299
1299
  char buf[32], format[32], format2[32];
1300
1300
  size_t i;
1301
1301
  VALUE str;
1302
- BASE x, min;
1302
+ BASE x;
1303
1303
  int dig = 8;
1304
1304
  #ifdef BASE_INT
1305
+ BASE min;
1305
1306
  BASE max;
1306
1307
  dig = 1;
1307
1308
  #endif
1308
1309
  Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1309
1310
  if (v->size == 0) return rb_str_new2("[ ]");
1310
- min = FUNCTION(gsl_vector,min)(v);
1311
1311
  str = rb_str_new2("[ ");
1312
1312
  if (VEC_COL_P(obj)) {
1313
1313
  #ifdef BASE_INT
1314
+ min = FUNCTION(gsl_vector,min)(v);
1314
1315
  max = gsl_vector_int_max(v);
1315
1316
  dig = (int) GSL_MAX(fabs(max),fabs(min));
1316
1317
  if (dig > 0) dig = ceil(log10(dig+1e-10));
@@ -2559,7 +2560,7 @@ static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
2559
2560
  GSL_TYPE(gsl_vector) *a, *b;
2560
2561
  /* gsl_vector_int *c;*/
2561
2562
  gsl_block_uchar *c;
2562
- int status;
2563
+ //int status;
2563
2564
  Data_Get_Struct(aa, GSL_TYPE(gsl_vector), a);
2564
2565
  c = gsl_block_uchar_alloc(a->size);
2565
2566
  if (VEC_P(bb)) {
@@ -2567,9 +2568,9 @@ static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
2567
2568
  if (a->size != b->size)
2568
2569
  rb_raise(rb_eRuntimeError, "Vector size mismatch, %d and %d", (int) a->size,
2569
2570
  (int) b->size);
2570
- status = (*cmp)(a, b, c);
2571
+ /*status =*/ (*cmp)(a, b, c);
2571
2572
  } else {
2572
- status = (*cmp2)(a, NUMCONV(bb), c);
2573
+ /*status =*/ (*cmp2)(a, NUMCONV(bb), c);
2573
2574
  }
2574
2575
  return Data_Wrap_Struct(cgsl_block_uchar, 0, gsl_block_uchar_free, c);
2575
2576
  }
@@ -193,7 +193,9 @@ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
193
193
  gsl_vector *v = NULL, *vnew;
194
194
  gsl_wavelet_direction dir = forward;
195
195
  gsl_wavelet_workspace *work = NULL;
196
- int itmp, flag = 0, status;
196
+ int itmp, flag = 0;
197
+ // local variable "status" declared and set, but never used
198
+ //int status;
197
199
  double *ptr1, *ptr2;
198
200
  size_t n, stride;
199
201
  int naflag = 0;
@@ -332,7 +334,7 @@ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
332
334
  }
333
335
  #endif
334
336
  }
335
- status = gsl_wavelet_transform(w, ptr2, stride, n, dir, work);
337
+ /*status =*/ gsl_wavelet_transform(w, ptr2, stride, n, dir, work);
336
338
  if (flag) gsl_wavelet_workspace_free(work);
337
339
  return ary;
338
340
  }
@@ -356,7 +358,9 @@ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
356
358
  gsl_wavelet *w = NULL;
357
359
  gsl_vector *v = NULL, *vnew;
358
360
  gsl_wavelet_workspace *work = NULL;
359
- int itmp, flag = 0, status, naflag = 0;
361
+ int itmp, flag = 0, naflag = 0;
362
+ // local variable "status" declared and set, but never used
363
+ //int status;
360
364
  double *ptr1 = NULL, *ptr2 = NULL;
361
365
  size_t n, stride;
362
366
  VALUE ary, ret;
@@ -489,7 +493,7 @@ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
489
493
  }
490
494
  #endif
491
495
  }
492
- status = (*trans)(w, ptr2, stride, n, work);
496
+ /*status =*/ (*trans)(w, ptr2, stride, n, work);
493
497
  if (flag) gsl_wavelet_workspace_free(work);
494
498
  return ary;
495
499
  }
@@ -530,7 +534,9 @@ static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
530
534
  gsl_wavelet_direction dir = forward;
531
535
  gsl_wavelet_workspace *work = NULL;
532
536
  VALUE ary, ret;
533
- int itmp, flag = 0, status;
537
+ int itmp, flag = 0;
538
+ // local variable "status" declared and set, but never used
539
+ //int status;
534
540
  switch (TYPE(obj)) {
535
541
  case T_MODULE:
536
542
  case T_CLASS:
@@ -592,7 +598,7 @@ static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
592
598
  mnew = m;
593
599
  ary = ret;
594
600
  }
595
- status = (*trans)(w, mnew, dir, work);
601
+ /*status =*/ (*trans)(w, mnew, dir, work);
596
602
  if (flag) gsl_wavelet_workspace_free(work);
597
603
  return ary;
598
604
  }
@@ -619,7 +625,9 @@ static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
619
625
  gsl_matrix *m = NULL, *mnew;
620
626
  gsl_wavelet_workspace *work = NULL;
621
627
  VALUE ary, ret;
622
- int itmp, flag = 0, status;
628
+ int itmp, flag = 0;
629
+ // local variable "status" declared and set, but never used
630
+ //int status;
623
631
  switch (TYPE(obj)) {
624
632
  case T_MODULE:
625
633
  case T_CLASS:
@@ -668,7 +676,7 @@ static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
668
676
  mnew = m;
669
677
  ary = ret;
670
678
  }
671
- status = (*trans)(w, mnew, work);
679
+ /*status =*/ (*trans)(w, mnew, work);
672
680
  if (flag) gsl_wavelet_workspace_free(work);
673
681
  return ary;
674
682
  }
@@ -25,6 +25,7 @@
25
25
  #include <gsl/gsl_ieee_utils.h>
26
26
  #ifdef HAVE_NARRAY_H
27
27
  #include "narray.h"
28
+ #include "rb_gsl_with_narray.h"
28
29
  #endif
29
30
 
30
31
  EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
@@ -135,13 +136,11 @@ EXTERN ID rb_gsl_id_beg, rb_gsl_id_end, rb_gsl_id_excl, rb_gsl_id_to_a;
135
136
  #ifdef HAVE_NARRAY_H
136
137
  #define Data_Get_Vector(obj,sval) do {\
137
138
  if (NA_IsNArray(obj)) {\
138
- (sval)->data = NA_PTR_TYPE(obj,double*);\
139
- (sval)->size = NA_TOTAL(obj);\
140
- (sval)->stride = 1;\
141
- } else {\
142
- CHECK_VECTOR(obj);\
143
- Data_Get_Struct(obj,gsl_vector,sval);\
139
+ /* Convert obj to GSL::Vector::View */\
140
+ obj = rb_gsl_na_to_gsl_vector_view_method(obj);\
144
141
  }\
142
+ CHECK_VECTOR(obj);\
143
+ Data_Get_Struct(obj,gsl_vector,sval);\
145
144
  } while (0)
146
145
  #else
147
146
  #define Data_Get_Vector(obj,sval) do {\
@@ -0,0 +1,62 @@
1
+ #ifndef ___RB_GSL_CONFIG_H___
2
+ #define ___RB_GSL_CONFIG_H___
3
+
4
+ #ifndef GSL_VERSION
5
+ #define GSL_VERSION "1.15"
6
+ #endif
7
+ #ifndef GSL_0_9_4_LATER
8
+ #define GSL_0_9_4_LATER
9
+ #endif
10
+ #ifndef GSL_1_0_LATER
11
+ #define GSL_1_0_LATER
12
+ #endif
13
+ #ifndef GSL_1_1_LATER
14
+ #define GSL_1_1_LATER
15
+ #endif
16
+ #ifndef GSL_1_1_1_LATER
17
+ #define GSL_1_1_1_LATER
18
+ #endif
19
+ #ifndef GSL_1_2_LATER
20
+ #define GSL_1_2_LATER
21
+ #endif
22
+ #ifndef GSL_1_3_LATER
23
+ #define GSL_1_3_LATER
24
+ #endif
25
+ #ifndef GSL_1_4_LATER
26
+ #define GSL_1_4_LATER
27
+ #endif
28
+ #ifndef GSL_1_4_9_LATER
29
+ #define GSL_1_4_9_LATER
30
+ #endif
31
+ #ifndef GSL_1_6_LATER
32
+ #define GSL_1_6_LATER
33
+ #endif
34
+ #ifndef GSL_1_8_LATER
35
+ #define GSL_1_8_LATER
36
+ #endif
37
+ #ifndef GSL_1_9_LATER
38
+ #define GSL_1_9_LATER
39
+ #endif
40
+ #ifndef GSL_1_10_LATER
41
+ #define GSL_1_10_LATER
42
+ #endif
43
+ #ifndef GSL_1_11_LATER
44
+ #define GSL_1_11_LATER
45
+ #endif
46
+ #ifndef GSL_1_13_LATER
47
+ #define GSL_1_13_LATER
48
+ #endif
49
+ #ifndef GSL_1_14_LATER
50
+ #define GSL_1_14_LATER
51
+ #endif
52
+ #ifndef GSL_1_15_LATER
53
+ #define GSL_1_15_LATER
54
+ #endif
55
+ #ifndef RUBY_GSL_VERSION
56
+ #define RUBY_GSL_VERSION "1.15.0"
57
+ #endif
58
+ #ifndef RUBY_1_8_LATER
59
+ #define RUBY_1_8_LATER
60
+ #endif
61
+
62
+ #endif
@@ -1,3 +1,6 @@
1
+ #ifndef RB_GSL_WITH_NARRAY_H
2
+ #define RB_GSL_WITH_NARRAY_H
3
+
1
4
  #ifdef HAVE_NARRAY_H
2
5
 
3
6
  #include "narray.h"
@@ -7,6 +10,7 @@ gsl_vector* make_cvector_from_narray(VALUE);
7
10
  void cvector_set_from_narray(gsl_vector*, VALUE);
8
11
  void carray_set_from_narray(double*, VALUE);
9
12
 
13
+ VALUE rb_gsl_na_to_gsl_vector_view_method(VALUE na);
10
14
  VALUE rb_gsl_na_to_gsl_matrix(VALUE obj, VALUE nna);
11
15
  gsl_vector_view* na_to_gv_view(VALUE na);
12
16
  gsl_matrix_view* na_to_gm_view(VALUE nna);
@@ -21,4 +25,5 @@ extern VALUE cNVector, cNMatrix;
21
25
 
22
26
  gsl_vector_complex* na_to_gv_complex(VALUE na);
23
27
  gsl_vector_complex_view* na_to_gv_complex_view(VALUE na);
24
- #endif
28
+ #endif // HAVE_NARRAY_H
29
+ #endif // RB_GSL_WITH_NARRAY_H
@@ -0,0 +1,3 @@
1
+ require('narray')
2
+ require('rb_gsl')
3
+ require('gsl/oper.rb')
@@ -0,0 +1,3 @@
1
+ require('narray')
2
+ require('rb_gsl')
3
+ require('gsl/oper.rb')
@@ -28,11 +28,11 @@
28
28
  # == {}[link:index.html"name="1] Overview
29
29
  # Least-squares fits are found by minimizing \chi^2 (chi-squared), the weighted
30
30
  # sum of squared residuals over n experimental datapoints (x_i, y_i) for the
31
- # model Y(c,x), The p parameters of the model are c = {c_0, c_1, �c}. The weight
32
- # factors w_i are given by w_i = 1/\sigma_i^2, where \sigma_i is the
33
- # experimental error on the data-point y_i. The errors are assumed to be
34
- # gaussian and uncorrelated. For unweighted data the chi-squared sum is computed
35
- # without any weight factors.
31
+ # model Y(c,x), The p parameters of the model are c = {c_0, c_1, ...}. The
32
+ # weight factors w_i are given by w_i = 1/\sigma_i^2, where \sigma_i is the
33
+ # experimental error on the data-point y_i. The errors are assumed to be
34
+ # gaussian and uncorrelated. For unweighted data the chi-squared sum is
35
+ # computed without any weight factors.
36
36
  #
37
37
  # The fitting routines return the best-fit parameters c and their p \times p
38
38
  # covariance matrix. The covariance matrix measures the statistical errors on
@@ -19,7 +19,7 @@
19
19
  # design matrix X_{ij = F_j(x_i) in the special case that the basis functions
20
20
  # separate: Here the superscript value j indicates the basis function
21
21
  # corresponding to the independent variable x_j. The subscripts (i_1, i_2, i_3,
22
- # �c) refer to which basis function to use from the complete set. These
22
+ # ...) refer to which basis function to use from the complete set. These
23
23
  # subscripts are related to the index i in a complex way, which is the main
24
24
  # problem this extension addresses. The model then becomes where n is the
25
25
  # dimension of the fit and N_i is the number of basis functions for the variable
@@ -111,7 +111,10 @@
111
111
  # * GSL::MultiFit::Ndlinear.calc(x, c, w)
112
112
  # * GSL::MultiFit::Ndlinear::Workspace#calc(x, c)
113
113
  #
114
- # This method is similar to <tt>GSL::MultiFit::Ndlinear.est</tt>, but does not compute the model error. It computes the model value at the data point <tt>x</tt> using the coefficient vector <tt>c</tt> and returns the model value.
114
+ # This method is similar to <tt>GSL::MultiFit::Ndlinear.est</tt>, but does
115
+ # not compute the model error. It computes the model value at the data point
116
+ # <tt>x</tt> using the coefficient vector <tt>c</tt> and returns the model
117
+ # value.
115
118
  #
116
119
  # == {}[link:index.html"name="3] Examples
117
120
  # This example program generates data from the 3D isotropic harmonic oscillator
@@ -23,9 +23,12 @@ module GSL
23
23
 
24
24
  # PASS if status == true, FAIL otherwise
25
25
  def test2(status, desc)
26
+ $tests += 1
26
27
  if status == true
28
+ $passed += 1
27
29
  printf("PASS: #{desc}\n")
28
30
  else
31
+ $failed += 1
29
32
  printf("FAIL: #{desc}\n")
30
33
  end
31
34
  end
@@ -0,0 +1,36 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/unit'
3
+
4
+ require 'gsl'
5
+
6
+ class MatrixComplex < MiniTest::Unit::TestCase
7
+
8
+ def test_eye
9
+ z = GSL::Complex[1,0]
10
+ m = GSL::Matrix::Complex.eye(2, z)
11
+ assert_equal(z, m[0,0])
12
+ assert_equal(GSL::Complex[0,0], m[0,1])
13
+ assert_equal(GSL::Complex[0,0], m[1,0])
14
+ assert_equal(z, m[1,1])
15
+ end
16
+
17
+ def test_set_row
18
+ z0 = GSL::Complex[1,0]
19
+ z1 = GSL::Complex[2,0]
20
+ m = GSL::Matrix::Complex[2,2]
21
+ m.set_row(0,z0,z1)
22
+ assert_equal(z0, m[0,0])
23
+ assert_equal(z1, m[0,1])
24
+ end
25
+
26
+ def test_set_col
27
+ z0 = GSL::Complex[1,0]
28
+ z1 = GSL::Complex[2,0]
29
+ m = GSL::Matrix::Complex[2,2]
30
+ m.set_col(0,z0,z1)
31
+ assert_equal(z0, m[0,0])
32
+ assert_equal(z1, m[1,0])
33
+ end
34
+
35
+ end
36
+
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'narray'
5
+ require 'gsl'
6
+ require '../gsl_test.rb'
7
+ include GSL::Test
8
+
9
+ dbleps = 1e-6
10
+ expected = Math.sqrt((0..4).inject {|m,x| m+=x*x})
11
+
12
+ v = GSL::Vector.indgen(5)
13
+ v_dnrm2 = GSL::Blas.dnrm2(v)
14
+ GSL::Test.test_rel(v_dnrm2, expected, dbleps, "GSL::Blas.dnrm2(GSL::Vector)")
15
+
16
+ na = NArray.float(5).indgen!
17
+ na_dnrm2 = GSL::Blas.dnrm2(na)
18
+ GSL::Test.test_rel(na_dnrm2, expected, dbleps, "GSL::Blas.dnrm2(NArray)")
19
+
20
+ GSL::Test.test_rel(na_dnrm2, v_dnrm2, 0, "GSL::Blas.dnrm2(NArray) == GSL::Blas.dnrm2(GSL::Vector)")
@@ -33,14 +33,26 @@ x0, x1 = GSL::Poly.solve_quadratic(5.0, 0.0, -20.0).to_a
33
33
  test_rel(x0, -2.0, 1e-9, "x0, 5 x^2 = 20")
34
34
  test_rel(x1, 2.0, 1e-9, "x1, 5 x^2 = 20")
35
35
 
36
+ # Quadratic single real root (technically not a quadratic)
37
+ x0, x1 = GSL::Poly.solve_quadratic(0.0, 1.0, 0.0).to_a
38
+ test_rel(x0, 0.0, 0, "x0, x = 0")
39
+ test2(x1.nil?, "x1, x = 0 is nil")
40
+
41
+ # Quadratic no real root
42
+ x0, x1 = GSL::Poly.solve_quadratic(1.0, 0.0, 1.0).to_a
43
+ test2(x0.nil?, "x0, x^2 = -1 is nil")
44
+ test2(x1.nil?, "x1, x^2 = -1 is nil")
45
+
36
46
  x0, x1, x2 = GSL::Poly.solve_cubic(0.0, 0.0, -27.0).to_a
37
47
  test_rel(x0, 3.0, 1e-9, "x0, x^3 = 27")
38
48
 
49
+ # Cubic triple real root
39
50
  x0, x1, x2 = GSL::Poly.solve_cubic(-51.0, 867.0, -4913.0).to_a
40
51
  test_rel(x0, 17.0, 1e-9, "x0, (x-17)^3=0")
41
52
  test_rel(x1, 17.0, 1e-9, "x1, (x-17)^3=0")
42
53
  test_rel(x2, 17.0, 1e-9, "x2, (x-17)^3=0")
43
54
 
55
+ # Cubic double real root plus single real root
44
56
  x0, x1, x2 = GSL::Poly.solve_cubic(-57.0, 1071.0, -6647.0).to_a
45
57
  test_rel(x0, 17.0, 1e-9, "x0, (x-17)(x-17)(x-23)=0")
46
58
  test_rel(x1, 17.0, 1e-9, "x1, (x-17)(x-17)(x-23)=0")
@@ -61,6 +73,16 @@ test_rel(x0, -17.0, 1e-9, "x0, (x+17)(x-31)(x-95)=0")
61
73
  test_rel(x1, 31.0, 1e-9, "x1, (x+17)(x-31)(x-95)=0")
62
74
  test_rel(x2, 95.0, 1e-9, "x2, (x+17)(x-31)(x-95)=0")
63
75
 
76
+ # Cubic double real root only is impossible
77
+
78
+ # Cubic single real root (and two complex roots, not returned)
79
+ x0, x1, x2 = GSL::Poly.solve_cubic(0.0, 0.0, -1.0).to_a
80
+ test_rel(x0, 1.0, 1e-9, "x0, x^3 = 1")
81
+ test2(x1.nil?, "x1, x^3 = 1 is nil")
82
+ test2(x2.nil?, "x2, x^3 = 1 is nil")
83
+
84
+ # Cubic no real root is impossible
85
+
64
86
  #z0, z1 = GSL::Poly.complex_solve_quadratic(4.0, -20.0, 26.0).to_a
65
87
  r = GSL::Poly::Complex.solve_quadratic(4.0, -20.0, 26.0)
66
88
  z0 = r[0]
@@ -104,6 +126,18 @@ test_rel(z[0].im, -2.0, 1e-9, "z[0].imag, 5 x^2 = -20")
104
126
  test_rel(z[1].re, 0.0, 1e-9, "z[1].real, 5 x^2 = -20")
105
127
  test_rel(z[1].im, 2.0, 1e-9, "z[1].imag, 5 x^2 = -20")
106
128
 
129
+ # Quadratic single complex root (technically not quadratic and root not
130
+ # complex since imaginary component is 0, but the data type is complex)
131
+ z = GSL::Poly.complex_solve_quadratic(0.0, 1.0, -1.0)
132
+ test_rel(z[0].re, 1.0, 1e-9, "z[0].real, x = 1 (complex)")
133
+ test_rel(z[0].im, 0.0, 0.0, "z[0].imag, x = 1 (complex)")
134
+ test2(x1.nil?, "z[1], x = 0 is nil")
135
+
136
+ # Quadratic no complex root (technically not quadratic)
137
+ z = GSL::Poly.complex_solve_quadratic(0.0, 0.0, 1.0)
138
+ test2(z[0].nil?, "z[0], 1 = 0 is nil")
139
+ test2(z[1].nil?, "z[1], 1 = 0 is nil")
140
+
107
141
  z = GSL::Poly.complex_solve_cubic(0.0, 0.0, -27.0)
108
142
  test_rel(z[0].re, -1.5, 1e-9, "z[0].real, x^3 = 27");
109
143
  test_rel(z[0].im, -1.5 * sqrt(3.0), 1e-9,
@@ -240,3 +274,17 @@ test_rel(dc[2], 2.0*c[2] + 3.0*2.0*c[3]*x + 4.0*3.0*c[4]*x*x + 5.0*4.0*c[5]*x*x*
240
274
  test_rel(dc[3], 3.0*2.0*c[3] + 4.0*3.0*2.0*c[4]*x + 5.0*4.0*3.0*c[5]*x*x , eps,"eval_derivs({+1, -2, +3, -4, +5, -6} deriv 3, -174.0)");
241
275
  test_rel(dc[4], 4.0*3.0*2.0*c[4] + 5.0*4.0*3.0*2.0*c[5]*x, eps, "eval_derivs({+1, -2, +3, -4, +5, -6} deriv 4, +480.0)");
242
276
  test_rel(dc[5], 5.0*4.0*3.0*2.0*c[5] , eps, "eval_derivs({+1, -2, +3, -4, +5, -6} deriv 5, -720.0)");
277
+
278
+ # Test Poly::fit and Poly::wfit
279
+ x = GSL::Vector[0, 2, 2]
280
+ y = GSL::Vector[0, 1, -1]
281
+ coef, cov, chisq, status = Poly.fit(x, y, 1)
282
+ test_rel(coef[0], 0.0, 1e-9, "y intercept == 0")
283
+ test_rel(coef[1], 0.0, 1e-9, "slope == 0")
284
+ test_rel(chisq, 2.0, 1e-9, "chisq == 2")
285
+
286
+ w = GSL::Vector[1, 1, 0]
287
+ coef, cov, chisq, status = Poly.wfit(x, w, y, 1)
288
+ test_rel(coef[0], 0.0, 1e-9, "y intercept == 0")
289
+ test_rel(coef[1], 0.5, 1e-9, "slope == 0.5")
290
+ test_rel(chisq, 0.0, 1e-9, "chisq == 0")