gsl 1.12.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +2 -0
  4. data/ext/MANIFEST +119 -0
  5. data/ext/alf.c +206 -0
  6. data/ext/array.c +666 -0
  7. data/ext/array_complex.c +247 -0
  8. data/ext/blas.c +29 -0
  9. data/ext/blas1.c +731 -0
  10. data/ext/blas2.c +1093 -0
  11. data/ext/blas3.c +881 -0
  12. data/ext/block.c +44 -0
  13. data/ext/block_source.c +886 -0
  14. data/ext/bspline.c +130 -0
  15. data/ext/bundle.c +3 -0
  16. data/ext/cdf.c +754 -0
  17. data/ext/cheb.c +542 -0
  18. data/ext/combination.c +283 -0
  19. data/ext/common.c +325 -0
  20. data/ext/complex.c +1004 -0
  21. data/ext/const.c +673 -0
  22. data/ext/const_additional.c +120 -0
  23. data/ext/cqp.c +283 -0
  24. data/ext/deriv.c +195 -0
  25. data/ext/dht.c +361 -0
  26. data/ext/diff.c +166 -0
  27. data/ext/dirac.c +395 -0
  28. data/ext/eigen.c +2373 -0
  29. data/ext/error.c +194 -0
  30. data/ext/extconf.rb +281 -0
  31. data/ext/fcmp.c +66 -0
  32. data/ext/fft.c +1092 -0
  33. data/ext/fit.c +205 -0
  34. data/ext/fresnel.c +312 -0
  35. data/ext/function.c +524 -0
  36. data/ext/geometry.c +139 -0
  37. data/ext/graph.c +1638 -0
  38. data/ext/gsl.c +271 -0
  39. data/ext/gsl_narray.c +653 -0
  40. data/ext/histogram.c +1995 -0
  41. data/ext/histogram2d.c +1068 -0
  42. data/ext/histogram3d.c +884 -0
  43. data/ext/histogram3d_source.c +750 -0
  44. data/ext/histogram_find.c +101 -0
  45. data/ext/histogram_oper.c +159 -0
  46. data/ext/ieee.c +98 -0
  47. data/ext/integration.c +1138 -0
  48. data/ext/interp.c +512 -0
  49. data/ext/jacobi.c +739 -0
  50. data/ext/linalg.c +4047 -0
  51. data/ext/linalg_complex.c +741 -0
  52. data/ext/math.c +725 -0
  53. data/ext/matrix.c +39 -0
  54. data/ext/matrix_complex.c +1732 -0
  55. data/ext/matrix_double.c +560 -0
  56. data/ext/matrix_int.c +256 -0
  57. data/ext/matrix_source.c +2733 -0
  58. data/ext/min.c +250 -0
  59. data/ext/monte.c +992 -0
  60. data/ext/multifit.c +1879 -0
  61. data/ext/multimin.c +808 -0
  62. data/ext/multimin_fsdf.c +156 -0
  63. data/ext/multiroots.c +955 -0
  64. data/ext/ndlinear.c +321 -0
  65. data/ext/nmf.c +167 -0
  66. data/ext/nmf_wrap.c +72 -0
  67. data/ext/ntuple.c +469 -0
  68. data/ext/odeiv.c +959 -0
  69. data/ext/ool.c +879 -0
  70. data/ext/oper_complex_source.c +253 -0
  71. data/ext/permutation.c +596 -0
  72. data/ext/poly.c +42 -0
  73. data/ext/poly2.c +265 -0
  74. data/ext/poly_source.c +1885 -0
  75. data/ext/qrng.c +171 -0
  76. data/ext/randist.c +1873 -0
  77. data/ext/rational.c +480 -0
  78. data/ext/rng.c +612 -0
  79. data/ext/root.c +408 -0
  80. data/ext/sf.c +1494 -0
  81. data/ext/sf_airy.c +200 -0
  82. data/ext/sf_bessel.c +867 -0
  83. data/ext/sf_clausen.c +28 -0
  84. data/ext/sf_coulomb.c +206 -0
  85. data/ext/sf_coupling.c +118 -0
  86. data/ext/sf_dawson.c +29 -0
  87. data/ext/sf_debye.c +157 -0
  88. data/ext/sf_dilog.c +42 -0
  89. data/ext/sf_elementary.c +44 -0
  90. data/ext/sf_ellint.c +206 -0
  91. data/ext/sf_elljac.c +29 -0
  92. data/ext/sf_erfc.c +93 -0
  93. data/ext/sf_exp.c +164 -0
  94. data/ext/sf_expint.c +211 -0
  95. data/ext/sf_fermi_dirac.c +148 -0
  96. data/ext/sf_gamma.c +344 -0
  97. data/ext/sf_gegenbauer.c +96 -0
  98. data/ext/sf_hyperg.c +197 -0
  99. data/ext/sf_laguerre.c +112 -0
  100. data/ext/sf_lambert.c +47 -0
  101. data/ext/sf_legendre.c +367 -0
  102. data/ext/sf_log.c +104 -0
  103. data/ext/sf_mathieu.c +238 -0
  104. data/ext/sf_power.c +46 -0
  105. data/ext/sf_psi.c +98 -0
  106. data/ext/sf_synchrotron.c +48 -0
  107. data/ext/sf_transport.c +76 -0
  108. data/ext/sf_trigonometric.c +207 -0
  109. data/ext/sf_zeta.c +119 -0
  110. data/ext/signal.c +310 -0
  111. data/ext/siman.c +718 -0
  112. data/ext/sort.c +208 -0
  113. data/ext/spline.c +395 -0
  114. data/ext/stats.c +799 -0
  115. data/ext/sum.c +168 -0
  116. data/ext/tamu_anova.c +56 -0
  117. data/ext/tensor.c +38 -0
  118. data/ext/tensor_source.c +1123 -0
  119. data/ext/vector.c +38 -0
  120. data/ext/vector_complex.c +2236 -0
  121. data/ext/vector_double.c +1433 -0
  122. data/ext/vector_int.c +204 -0
  123. data/ext/vector_source.c +3329 -0
  124. data/ext/wavelet.c +937 -0
  125. data/include/rb_gsl.h +151 -0
  126. data/include/rb_gsl_array.h +238 -0
  127. data/include/rb_gsl_cheb.h +21 -0
  128. data/include/rb_gsl_common.h +343 -0
  129. data/include/rb_gsl_complex.h +25 -0
  130. data/include/rb_gsl_const.h +29 -0
  131. data/include/rb_gsl_dirac.h +13 -0
  132. data/include/rb_gsl_eigen.h +17 -0
  133. data/include/rb_gsl_fft.h +62 -0
  134. data/include/rb_gsl_fit.h +25 -0
  135. data/include/rb_gsl_function.h +27 -0
  136. data/include/rb_gsl_graph.h +70 -0
  137. data/include/rb_gsl_histogram.h +63 -0
  138. data/include/rb_gsl_histogram3d.h +97 -0
  139. data/include/rb_gsl_integration.h +17 -0
  140. data/include/rb_gsl_interp.h +46 -0
  141. data/include/rb_gsl_linalg.h +25 -0
  142. data/include/rb_gsl_math.h +26 -0
  143. data/include/rb_gsl_odeiv.h +21 -0
  144. data/include/rb_gsl_poly.h +71 -0
  145. data/include/rb_gsl_rational.h +37 -0
  146. data/include/rb_gsl_rng.h +21 -0
  147. data/include/rb_gsl_root.h +22 -0
  148. data/include/rb_gsl_sf.h +119 -0
  149. data/include/rb_gsl_statistics.h +17 -0
  150. data/include/rb_gsl_tensor.h +45 -0
  151. data/include/rb_gsl_with_narray.h +22 -0
  152. data/include/templates_off.h +87 -0
  153. data/include/templates_on.h +241 -0
  154. data/lib/gsl/gnuplot.rb +41 -0
  155. data/lib/gsl/oper.rb +68 -0
  156. data/lib/ool.rb +22 -0
  157. data/lib/ool/conmin.rb +30 -0
  158. metadata +224 -0
@@ -0,0 +1,205 @@
1
+ /*
2
+ fit.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2004 by Yoshiki Tsunesada
5
+
6
+ Ruby/GSL is free software: you can redistribute it and/or modify it
7
+ under the terms of the GNU General Public License.
8
+ This library is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY.
10
+ */
11
+
12
+ #include "rb_gsl_config.h"
13
+ #include "rb_gsl_fit.h"
14
+
15
+ /* linear fit without weights: y = c0 + c1 x */
16
+ /* This returns 7 elements array */
17
+ static VALUE rb_gsl_fit_linear(int argc, VALUE *argv, VALUE obj)
18
+ {
19
+ double *ptrx, *ptry;
20
+ double c0, c1, cov00, cov01, cov11, sumsq;
21
+ int status;
22
+ size_t n, stridex, stridey;
23
+ switch (argc) {
24
+ case 2:
25
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
26
+ ptry = get_vector_ptr(argv[1], &stridey, &n);
27
+ break;
28
+ case 3:
29
+ CHECK_FIXNUM(argv[2]);
30
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
31
+ ptry = get_vector_ptr(argv[1], &stridey, &n);
32
+ n = FIX2INT(argv[2]);
33
+ break;
34
+ default:
35
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
36
+ break;
37
+ }
38
+ status = gsl_fit_linear(ptrx, stridex, ptry, stridey, n, &c0, &c1, &cov00,
39
+ &cov01, &cov11, &sumsq);
40
+ return rb_ary_new3(7, rb_float_new(c0), rb_float_new(c1), rb_float_new(cov00),
41
+ rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
42
+ INT2FIX(status));
43
+ }
44
+
45
+ /* linear fit with weights: y = c0 + c1 x */
46
+ static VALUE rb_gsl_fit_wlinear(int argc, VALUE *argv, VALUE obj)
47
+ {
48
+ double *ptrx, *ptry, *ptrw;
49
+ double c0, c1, cov00, cov01, cov11, sumsq;
50
+ int status;
51
+ size_t n, stridex, stridey, stridew;
52
+ switch (argc) {
53
+ case 3:
54
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
55
+ ptrw = get_vector_ptr(argv[1], &stridew, &n);
56
+ ptry = get_vector_ptr(argv[2], &stridey, &n);
57
+ break;
58
+ case 4:
59
+ CHECK_FIXNUM(argv[3]);
60
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
61
+ ptrw = get_vector_ptr(argv[1], &stridew, &n);
62
+ ptry = get_vector_ptr(argv[2], &stridey, &n);
63
+ n = FIX2INT(argv[3]);
64
+ break;
65
+ default:
66
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
67
+ break;
68
+ }
69
+ status = gsl_fit_wlinear(ptrx, stridex, ptrw, stridew, ptry, stridey,
70
+ n,
71
+ &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
72
+ return rb_ary_new3(7, rb_float_new(c0), rb_float_new(c1), rb_float_new(cov00),
73
+ rb_float_new(cov01), rb_float_new(cov11), rb_float_new(sumsq),
74
+ INT2FIX(status));
75
+ }
76
+
77
+ static VALUE rb_gsl_fit_linear_est(int argc, VALUE *argv, VALUE obj)
78
+ {
79
+ double y, yerr, x, c0, c1, c00, c01, c11;
80
+ int status;
81
+ size_t i;
82
+ switch (argc) {
83
+ case 2:
84
+ x = NUM2DBL(argv[0]);
85
+ if (TYPE(argv[1]) == T_ARRAY) {
86
+ c0 = NUM2DBL(rb_ary_entry(argv[1], 0));
87
+ c1 = NUM2DBL(rb_ary_entry(argv[1], 1));
88
+ c00 = NUM2DBL(rb_ary_entry(argv[1], 2));
89
+ c01 = NUM2DBL(rb_ary_entry(argv[1], 3));
90
+ c11 = NUM2DBL(rb_ary_entry(argv[1], 4));
91
+ } else {
92
+ rb_raise(rb_eTypeError, "argv[1] Array expected");
93
+ }
94
+ break;
95
+ case 6:
96
+ for (i = 0; i < 6; i++) Need_Float(argv[i]);
97
+ x = NUM2DBL(argv[0]);
98
+ c0 = NUM2DBL(argv[1]);
99
+ c1 = NUM2DBL(argv[2]);
100
+ c00 = NUM2DBL(argv[3]);
101
+ c01 = NUM2DBL(argv[4]);
102
+ c11 = NUM2DBL(argv[5]);
103
+ break;
104
+ default:
105
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 6)", argc);
106
+ }
107
+ status = gsl_fit_linear_est(x, c0, c1, c00, c01, c11, &y, &yerr);
108
+ return rb_ary_new3(3, rb_float_new(y), rb_float_new(yerr), INT2FIX(status));
109
+ }
110
+
111
+ static VALUE rb_gsl_fit_mul(int argc, VALUE *argv, VALUE obj)
112
+ {
113
+ double *ptrx, *ptry;
114
+ double c1, cov11, sumsq;
115
+ int status;
116
+ size_t n, stridex, stridey;
117
+ switch (argc) {
118
+ case 2:
119
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
120
+ ptry = get_vector_ptr(argv[1], &stridey, &n);
121
+ break;
122
+ case 3:
123
+ CHECK_FIXNUM(argv[2]);
124
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
125
+ ptry = get_vector_ptr(argv[1], &stridey, &n);
126
+ n = FIX2INT(argv[2]);
127
+ break;
128
+ default:
129
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
130
+ break;
131
+ }
132
+ status = gsl_fit_mul(ptrx, stridex, ptry, stridey, n, &c1, &cov11, &sumsq);
133
+ return rb_ary_new3(4, rb_float_new(c1),
134
+ rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
135
+ }
136
+
137
+ static VALUE rb_gsl_fit_wmul(int argc, VALUE *argv, VALUE obj)
138
+ {
139
+ double *ptrx, *ptry, *ptrw;
140
+ double c1, cov11, sumsq;
141
+ int status;
142
+ size_t n, stridex, stridey, stridew;
143
+ switch (argc) {
144
+ case 3:
145
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
146
+ ptrw = get_vector_ptr(argv[1], &stridew, &n);
147
+ ptry = get_vector_ptr(argv[2], &stridey, &n);
148
+ break;
149
+ case 4:
150
+ CHECK_FIXNUM(argv[3]);
151
+ ptrx = get_vector_ptr(argv[0], &stridex, &n);
152
+ ptrw = get_vector_ptr(argv[1], &stridew, &n);
153
+ ptry = get_vector_ptr(argv[2], &stridey, &n);
154
+ n = FIX2INT(argv[3]);
155
+ break;
156
+ default:
157
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
158
+ break;
159
+ }
160
+ status = gsl_fit_wmul(ptrx, stridex, ptrw, stridew, ptry, stridey,
161
+ n, &c1, &cov11, &sumsq);
162
+ return rb_ary_new3(4, rb_float_new(c1),
163
+ rb_float_new(cov11), rb_float_new(sumsq), INT2FIX(status));
164
+ }
165
+
166
+ static VALUE rb_gsl_fit_mul_est(int argc, VALUE *argv, VALUE obj)
167
+ {
168
+ double y, yerr, x, c1, c11;
169
+ int status;
170
+ switch (argc) {
171
+ case 2:
172
+ Need_Float(argv[0]);
173
+ if (TYPE(argv[1]) == T_ARRAY) {
174
+ c1 = NUM2DBL(rb_ary_entry(argv[1], 0));
175
+ c11 = NUM2DBL(rb_ary_entry(argv[1], 1));
176
+ } else {
177
+ rb_raise(rb_eTypeError, "argv[1]: Array expected");
178
+ }
179
+ x = NUM2DBL(argv[0]);
180
+ break;
181
+ case 3:
182
+ Need_Float(argv[0]); Need_Float(argv[1]); Need_Float(argv[2]);
183
+ x = NUM2DBL(argv[0]);
184
+ c1 = NUM2DBL(argv[1]);
185
+ c11 = NUM2DBL(argv[2]);
186
+ break;
187
+ default:
188
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
189
+ break;
190
+ }
191
+ status = gsl_fit_mul_est(x, c1, c11, &y, &yerr);
192
+ return rb_ary_new3(3, rb_float_new(y), rb_float_new(yerr), INT2FIX(status));
193
+ }
194
+
195
+ void Init_gsl_fit(VALUE module)
196
+ {
197
+ VALUE mgsl_fit;
198
+ mgsl_fit = rb_define_module_under(module, "Fit");
199
+ rb_define_module_function(mgsl_fit, "linear", rb_gsl_fit_linear, -1);
200
+ rb_define_module_function(mgsl_fit, "wlinear", rb_gsl_fit_wlinear, -1);
201
+ rb_define_module_function(mgsl_fit, "linear_est", rb_gsl_fit_linear_est, -1);
202
+ rb_define_module_function(mgsl_fit, "mul", rb_gsl_fit_mul, -1);
203
+ rb_define_module_function(mgsl_fit, "wmul", rb_gsl_fit_wmul, -1);
204
+ rb_define_module_function(mgsl_fit, "mul_est", rb_gsl_fit_mul_est, -1);
205
+ }
@@ -0,0 +1,312 @@
1
+ /****************************************************************************
2
+ * fresnel.c -
3
+ * Calculation of Fresnel integrals by expansion to Chebyshev series
4
+ * Expansions are taken from the book
5
+ * Y.L. Luke. Mathematical functions and their approximations.
6
+ * Moscow, "Mir", 1980. PP. 145-149 (Russian edition)
7
+ ****************************************************************************
8
+ */
9
+ /*
10
+ Modified for Ruby bindings
11
+ 2006/Dec/24 Y. TSUNESADA
12
+ */
13
+ #include <math.h>
14
+ #include "rb_gsl.h"
15
+ #include "rb_gsl_sf.h"
16
+
17
+ static const double sqrt_pi_2 = 1.2533141373155002512078826424; /* sqrt(pi/2) */
18
+ static const double sqrt_2_pi = 0.7978845608028653558798921199; /* sqrt(2/pi) */
19
+ static const double _1_sqrt_2pi = 0.3989422804014326779399460599; /* 1/sqrt(2*pi) */
20
+ static const double pi_2 = 1.5707963267948966192313216916; /* pi/2 */
21
+
22
+ static double f_data_a[18] =
23
+ {
24
+ 0.76435138664186000189,
25
+ -0.43135547547660179313,
26
+ 0.43288199979726653054,
27
+ -0.26973310338387111029,
28
+ 0.08416045320876935378,
29
+ -0.01546524484461381958,
30
+ 0.00187855423439822018,
31
+ -0.00016264977618887547,
32
+ 0.00001057397656383260,
33
+ -0.00000053609339889243,
34
+ 0.00000002181658454933,
35
+ -0.00000000072901621186,
36
+ 0.00000000002037332546,
37
+ -0.00000000000048344033,
38
+ 0.00000000000000986533,
39
+ -0.00000000000000017502,
40
+ 0.00000000000000000272,
41
+ -0.00000000000000000004
42
+ };
43
+
44
+ static double f_data_b[17] =
45
+ {
46
+ 0.63041404314570539241,
47
+ -0.42344511405705333544,
48
+ 0.37617172643343656625,
49
+ -0.16249489154509567415,
50
+ 0.03822255778633008694,
51
+ -0.00564563477132190899,
52
+ 0.00057454951976897367,
53
+ -0.00004287071532102004,
54
+ 0.00000245120749923299,
55
+ -0.00000011098841840868,
56
+ 0.00000000408249731696,
57
+ -0.00000000012449830219,
58
+ 0.00000000000320048425,
59
+ -0.00000000000007032416,
60
+ 0.00000000000000133638,
61
+ -0.00000000000000002219,
62
+ 0.00000000000000000032
63
+ };
64
+
65
+ static double fresnel_cos_0_8(double x)
66
+ {
67
+ double x_8 = x/8.0;
68
+ double xx = 2.0*x_8*x_8 - 1.0;
69
+
70
+ double t0 = 1.0;
71
+ double t1 = xx;
72
+ double sumC = f_data_a[0] + f_data_a[1]*t1;
73
+ double t2;
74
+ int n;
75
+ for (n=2; n < 18; n++)
76
+ {
77
+ t2 = 2.0*xx*t1 - t0;
78
+ sumC += f_data_a[n]*t2;
79
+ t0 = t1; t1 = t2;
80
+ }
81
+ return _1_sqrt_2pi*sqrt(x)*sumC;
82
+ }
83
+
84
+ static double fresnel_sin_0_8(double x)
85
+ {
86
+ double x_8 = x/8.0;
87
+ double xx = 2.0*x_8*x_8 - 1.0;
88
+ double t0 = 1.;
89
+ double t1 = xx;
90
+ double ot1 = x_8;
91
+ double ot2 = 2.0*x_8*t1 - ot1;
92
+ double sumS = f_data_b[0]*ot1 + f_data_b[1]*ot2;
93
+ int n;
94
+ double t2;
95
+ for (n=2; n < 17; n++)
96
+ {
97
+ t2 = 2.0*xx*t1 - t0;
98
+ ot1 = ot2;
99
+ ot2 = 2.0*x_8*t2 - ot1;
100
+ sumS += f_data_b[n]*ot2;
101
+ t0 = t1; t1 = t2;
102
+ }
103
+ return _1_sqrt_2pi*sqrt(x)*sumS;
104
+ }
105
+
106
+ static double f_data_e[41] =
107
+ {
108
+ 0.97462779093296822410,
109
+ -0.02424701873969321371,
110
+ 0.00103400906842977317,
111
+ -0.00008052450246908016,
112
+ 0.00000905962481966582,
113
+ -0.00000131016996757743,
114
+ 0.00000022770820391497,
115
+ -0.00000004558623552026,
116
+ 0.00000001021567537083,
117
+ -0.00000000251114508133,
118
+ 0.00000000066704761275,
119
+ -0.00000000018931512852,
120
+ 0.00000000005689898935,
121
+ -0.00000000001798219359,
122
+ 0.00000000000594162963,
123
+ -0.00000000000204285065,
124
+ 0.00000000000072797580,
125
+ -0.00000000000026797428,
126
+ 0.00000000000010160694,
127
+ -0.00000000000003958559,
128
+ 0.00000000000001581262,
129
+ -0.00000000000000646411,
130
+ 0.00000000000000269981,
131
+ -0.00000000000000115038,
132
+ 0.00000000000000049942,
133
+ -0.00000000000000022064,
134
+ 0.00000000000000009910,
135
+ -0.00000000000000004520,
136
+ 0.00000000000000002092,
137
+ -0.00000000000000000982,
138
+ 0.00000000000000000467,
139
+ -0.00000000000000000225,
140
+ 0.00000000000000000110,
141
+ -0.00000000000000000054,
142
+ 0.00000000000000000027,
143
+ -0.00000000000000000014,
144
+ 0.00000000000000000007,
145
+ -0.00000000000000000004,
146
+ 0.00000000000000000002,
147
+ -0.00000000000000000001,
148
+ 0.00000000000000000001
149
+ };
150
+
151
+ static double f_data_f[35] =
152
+ {
153
+ 0.99461545179407928910,
154
+ -0.00524276766084297210,
155
+ 0.00013325864229883909,
156
+ -0.00000770856452642713,
157
+ 0.00000070848077032045,
158
+ -0.00000008812517411602,
159
+ 0.00000001359784717148,
160
+ -0.00000000246858295747,
161
+ 0.00000000050925789921,
162
+ -0.00000000011653400634,
163
+ 0.00000000002906578309,
164
+ -0.00000000000779847361,
165
+ 0.00000000000222802542,
166
+ -0.00000000000067239338,
167
+ 0.00000000000021296411,
168
+ -0.00000000000007041482,
169
+ 0.00000000000002419805,
170
+ -0.00000000000000861080,
171
+ 0.00000000000000316287,
172
+ -0.00000000000000119596,
173
+ 0.00000000000000046444,
174
+ -0.00000000000000018485,
175
+ 0.00000000000000007527,
176
+ -0.00000000000000003131,
177
+ 0.00000000000000001328,
178
+ -0.00000000000000000574,
179
+ 0.00000000000000000252,
180
+ -0.00000000000000000113,
181
+ 0.00000000000000000051,
182
+ -0.00000000000000000024,
183
+ 0.00000000000000000011,
184
+ -0.00000000000000000005,
185
+ 0.00000000000000000002,
186
+ -0.00000000000000000001,
187
+ 0.00000000000000000001
188
+ };
189
+
190
+ static double fresnel_cos_8_inf(double x)
191
+ {
192
+ double xx = 128.0/(x*x) - 1.0; /* 2.0*(8/x)^2 - 1 */
193
+ double t0 = 1.0;
194
+ double t1 = xx;
195
+ double sumP = f_data_e[0] + f_data_e[1]*t1;
196
+ double sumQ = f_data_f[0] + f_data_f[1]*t1;
197
+ double t2;
198
+ int n;
199
+ for(n = 2; n < 35; n++)
200
+ {
201
+ t2 = 2.0*xx*t1 - t0;
202
+ sumP += f_data_e[n]*t2; /* sumP += f_data_e[n]*ChebyshevT(n,xx) */
203
+ sumQ += f_data_f[n]*t2; /* sumQ += f_data_f[n]*ChebyshevT(n,xx) */
204
+ t0 = t1; t1 = t2;
205
+ }
206
+ for(n = 35; n < 41; n++)
207
+ {
208
+ t2 = 2.0*xx*t1 - t0;
209
+ sumP += f_data_e[n]*t2; /* sumP += f_data_e[n]*ChebyshevT(n,xx) */
210
+ t0 = t1; t1 = t2;
211
+ }
212
+ return 0.5 - _1_sqrt_2pi*(0.5*sumP*cos(x)/x - sumQ*sin(x))/sqrt(x);
213
+ }
214
+
215
+ static double fresnel_sin_8_inf(double x)
216
+ {
217
+ double xx = 128.0/(x*x) - 1.0; /* 2.0*(8/x)^2 - 1 */
218
+ double t0 = 1.0;
219
+ double t1 = xx;
220
+ double sumP = f_data_e[0] + f_data_e[1]*t1;
221
+ double sumQ = f_data_f[0] + f_data_f[1]*t1;
222
+ double t2;
223
+ int n;
224
+ for(n = 2; n < 35; n++)
225
+ {
226
+ t2 = 2.0*xx*t1 - t0;
227
+ sumP += f_data_e[n]*t2; /* sumP += f_data_e[n]*ChebyshevT(n,xx) */
228
+ sumQ += f_data_f[n]*t2; /* sumQ += f_data_f[n]*ChebyshevT(n,xx) */
229
+ t0 = t1; t1 = t2;
230
+ }
231
+ for(n = 35; n < 41; n++)
232
+ {
233
+ t2 = 2.0*xx*t1 - t0;
234
+ sumP += f_data_e[n]*t2; /* sumQ += f_data_f[n]*ChebyshevT(n,xx) */
235
+ t0 = t1; t1 = t2;
236
+ }
237
+ return 0.5 - _1_sqrt_2pi*(0.5*sumP*sin(x)/x + sumQ*cos(x))/sqrt(x);
238
+ }
239
+
240
+
241
+ double fresnel_c(double x)
242
+ {
243
+ double xx = x*x*pi_2;
244
+ double ret_val;
245
+ if(xx<=8.0)
246
+ ret_val = fresnel_cos_0_8(xx);
247
+ else
248
+ ret_val = fresnel_cos_8_inf(xx);
249
+ return (x<0.0) ? -ret_val : ret_val;
250
+ }
251
+
252
+ double fresnel_s(double x)
253
+ {
254
+ double xx = x*x*pi_2;
255
+ double ret_val;
256
+ if(xx<=8.0)
257
+ ret_val = fresnel_sin_0_8(xx);
258
+ else
259
+ ret_val = fresnel_sin_8_inf(xx);
260
+ return (x<0.0) ? -ret_val : ret_val;
261
+ }
262
+
263
+ double fresnel_c1(double x)
264
+ {
265
+ return fresnel_c(x*sqrt_2_pi);
266
+ }
267
+
268
+ double fresnel_s1(double x)
269
+ {
270
+ return fresnel_s(x*sqrt_2_pi);
271
+ }
272
+
273
+ static VALUE rb_fresnel_c(VALUE obj, VALUE x)
274
+ {
275
+ return rb_gsl_sf_eval1(fresnel_c, x);
276
+ }
277
+ static VALUE rb_fresnel_s(VALUE obj, VALUE x)
278
+ {
279
+ return rb_gsl_sf_eval1(fresnel_s, x);
280
+ }
281
+ static VALUE rb_fresnel_c1(VALUE obj, VALUE x)
282
+ {
283
+ return rb_gsl_sf_eval1(fresnel_c1, x);
284
+ }
285
+ static VALUE rb_fresnel_s1(VALUE obj, VALUE x)
286
+ {
287
+ return rb_gsl_sf_eval1(fresnel_s1, x);
288
+ }
289
+ void Init_fresnel(VALUE module)
290
+ {
291
+ VALUE mfresnel;
292
+ mfresnel = rb_define_module_under(module, "Fresnel");
293
+ rb_define_module_function(module, "fresnel_c", rb_fresnel_c, 1);
294
+ rb_define_module_function(module, "fresnel_s", rb_fresnel_s, 1);
295
+ rb_define_module_function(module, "fresnel_c1", rb_fresnel_c1, 1);
296
+ rb_define_module_function(module, "fresnel_s1", rb_fresnel_s1, 1);
297
+ rb_define_module_function(mfresnel, "c", rb_fresnel_c, 1);
298
+ rb_define_module_function(mfresnel, "s", rb_fresnel_s, 1);
299
+ rb_define_module_function(mfresnel, "c1", rb_fresnel_c1, 1);
300
+ rb_define_module_function(mfresnel, "s1", rb_fresnel_s1, 1);
301
+ }
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+