rb-gsl 1.15.3.1
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.
- checksums.yaml +7 -0
- data/AUTHORS +6 -0
- data/COPYING +339 -0
- data/ChangeLog +567 -0
- data/README +32 -0
- data/Rakefile +99 -0
- data/THANKS +17 -0
- data/VERSION +1 -0
- data/examples/alf/alf.gp +15 -0
- data/examples/alf/alf.rb +32 -0
- data/examples/blas/blas.rb +13 -0
- data/examples/blas/dnrm2.rb +16 -0
- data/examples/blas/level1.rb +81 -0
- data/examples/blas/level2.rb +11 -0
- data/examples/blas/level3.rb +12 -0
- data/examples/bspline.rb +57 -0
- data/examples/cdf.rb +16 -0
- data/examples/cheb.rb +21 -0
- data/examples/combination.rb +23 -0
- data/examples/complex/RC-lpf.rb +47 -0
- data/examples/complex/add.rb +36 -0
- data/examples/complex/coerce.rb +14 -0
- data/examples/complex/complex.rb +25 -0
- data/examples/complex/fpmi.rb +70 -0
- data/examples/complex/functions.rb +77 -0
- data/examples/complex/michelson.rb +36 -0
- data/examples/complex/mul.rb +28 -0
- data/examples/complex/oscillator.rb +17 -0
- data/examples/complex/set.rb +37 -0
- data/examples/const/physconst.rb +151 -0
- data/examples/const/travel.rb +45 -0
- data/examples/deriv/demo.rb +13 -0
- data/examples/deriv/deriv.rb +36 -0
- data/examples/deriv/diff.rb +35 -0
- data/examples/dht.rb +42 -0
- data/examples/dirac.rb +56 -0
- data/examples/eigen/eigen.rb +34 -0
- data/examples/eigen/herm.rb +22 -0
- data/examples/eigen/narray.rb +9 -0
- data/examples/eigen/nonsymm.rb +37 -0
- data/examples/eigen/nonsymmv.rb +43 -0
- data/examples/eigen/qhoscillator.gp +35 -0
- data/examples/eigen/qhoscillator.rb +90 -0
- data/examples/eigen/vander.rb +41 -0
- data/examples/fft/fft.rb +17 -0
- data/examples/fft/fft2.rb +17 -0
- data/examples/fft/forward.rb +25 -0
- data/examples/fft/forward2.rb +26 -0
- data/examples/fft/radix2.rb +18 -0
- data/examples/fft/real-halfcomplex.rb +33 -0
- data/examples/fft/real-halfcomplex2.rb +30 -0
- data/examples/fft/realradix2.rb +19 -0
- data/examples/fft/sunspot.dat +256 -0
- data/examples/fft/sunspot.rb +16 -0
- data/examples/fit/expdata.dat +20 -0
- data/examples/fit/expfit.rb +31 -0
- data/examples/fit/gaussfit.rb +29 -0
- data/examples/fit/gaussian_2peaks.rb +34 -0
- data/examples/fit/hillfit.rb +40 -0
- data/examples/fit/lognormal.rb +26 -0
- data/examples/fit/lorentzfit.rb +22 -0
- data/examples/fit/multifit.rb +72 -0
- data/examples/fit/ndlinear.rb +133 -0
- data/examples/fit/nonlinearfit.rb +89 -0
- data/examples/fit/plot.gp +36 -0
- data/examples/fit/polyfit.rb +9 -0
- data/examples/fit/powerfit.rb +21 -0
- data/examples/fit/sigmoidfit.rb +40 -0
- data/examples/fit/sinfit.rb +22 -0
- data/examples/fit/wlinear.rb +46 -0
- data/examples/fresnel.rb +11 -0
- data/examples/function/function.rb +36 -0
- data/examples/function/log.rb +7 -0
- data/examples/function/min.rb +33 -0
- data/examples/function/sin.rb +10 -0
- data/examples/function/synchrotron.rb +18 -0
- data/examples/gallery/butterfly.rb +7 -0
- data/examples/gallery/cayley.rb +12 -0
- data/examples/gallery/cornu.rb +23 -0
- data/examples/gallery/eight.rb +11 -0
- data/examples/gallery/koch.rb +40 -0
- data/examples/gallery/lemniscate.rb +11 -0
- data/examples/gallery/polar.rb +11 -0
- data/examples/gallery/rgplot/cossin.rb +35 -0
- data/examples/gallery/rgplot/rgplot.replaced +0 -0
- data/examples/gallery/rgplot/roesller.rb +55 -0
- data/examples/gallery/roesller.rb +39 -0
- data/examples/gallery/scarabaeus.rb +14 -0
- data/examples/histogram/cauchy.rb +27 -0
- data/examples/histogram/cauchy.sh +2 -0
- data/examples/histogram/exponential.rb +19 -0
- data/examples/histogram/gauss.rb +16 -0
- data/examples/histogram/gsl-histogram.rb +40 -0
- data/examples/histogram/histo2d.rb +31 -0
- data/examples/histogram/histo3d.rb +34 -0
- data/examples/histogram/histogram-pdf.rb +27 -0
- data/examples/histogram/histogram.rb +26 -0
- data/examples/histogram/integral.rb +28 -0
- data/examples/histogram/poisson.rb +27 -0
- data/examples/histogram/power.rb +25 -0
- data/examples/histogram/rebin.rb +17 -0
- data/examples/histogram/smp.dat +5 -0
- data/examples/histogram/xexp.rb +21 -0
- data/examples/integration/ahmed.rb +21 -0
- data/examples/integration/cosmology.rb +75 -0
- data/examples/integration/friedmann.gp +16 -0
- data/examples/integration/friedmann.rb +35 -0
- data/examples/integration/gamma-zeta.rb +35 -0
- data/examples/integration/integration.rb +22 -0
- data/examples/integration/qag.rb +8 -0
- data/examples/integration/qag2.rb +14 -0
- data/examples/integration/qag3.rb +8 -0
- data/examples/integration/qagi.rb +28 -0
- data/examples/integration/qagi2.rb +49 -0
- data/examples/integration/qagiu.rb +29 -0
- data/examples/integration/qagp.rb +20 -0
- data/examples/integration/qags.rb +14 -0
- data/examples/integration/qawc.rb +18 -0
- data/examples/integration/qawf.rb +41 -0
- data/examples/integration/qawo.rb +29 -0
- data/examples/integration/qaws.rb +30 -0
- data/examples/integration/qng.rb +17 -0
- data/examples/interp/demo.gp +20 -0
- data/examples/interp/demo.rb +45 -0
- data/examples/interp/interp.rb +37 -0
- data/examples/interp/points +10 -0
- data/examples/interp/spline.rb +20 -0
- data/examples/jacobi/deriv.rb +40 -0
- data/examples/jacobi/integrate.rb +34 -0
- data/examples/jacobi/interp.rb +43 -0
- data/examples/jacobi/jacobi.rb +11 -0
- data/examples/linalg/HH.rb +15 -0
- data/examples/linalg/HH_narray.rb +13 -0
- data/examples/linalg/LQ_solve.rb +73 -0
- data/examples/linalg/LU.rb +84 -0
- data/examples/linalg/LU2.rb +31 -0
- data/examples/linalg/LU_narray.rb +24 -0
- data/examples/linalg/PTLQ.rb +47 -0
- data/examples/linalg/QR.rb +18 -0
- data/examples/linalg/QRPT.rb +47 -0
- data/examples/linalg/QR_solve.rb +78 -0
- data/examples/linalg/QR_solve_narray.rb +13 -0
- data/examples/linalg/SV.rb +16 -0
- data/examples/linalg/SV_narray.rb +12 -0
- data/examples/linalg/SV_solve.rb +49 -0
- data/examples/linalg/chol.rb +29 -0
- data/examples/linalg/chol_narray.rb +15 -0
- data/examples/linalg/complex.rb +57 -0
- data/examples/linalg/invert_narray.rb +10 -0
- data/examples/math/const.rb +67 -0
- data/examples/math/elementary.rb +35 -0
- data/examples/math/functions.rb +41 -0
- data/examples/math/inf_nan.rb +34 -0
- data/examples/math/minmax.rb +22 -0
- data/examples/math/power.rb +18 -0
- data/examples/math/test.rb +31 -0
- data/examples/matrix/a.dat +0 -0
- data/examples/matrix/add.rb +45 -0
- data/examples/matrix/b.dat +4 -0
- data/examples/matrix/cat.rb +31 -0
- data/examples/matrix/colvectors.rb +24 -0
- data/examples/matrix/complex.rb +41 -0
- data/examples/matrix/det.rb +29 -0
- data/examples/matrix/diagonal.rb +23 -0
- data/examples/matrix/get_all.rb +159 -0
- data/examples/matrix/hilbert.rb +31 -0
- data/examples/matrix/iterator.rb +19 -0
- data/examples/matrix/matrix.rb +57 -0
- data/examples/matrix/minmax.rb +53 -0
- data/examples/matrix/mul.rb +39 -0
- data/examples/matrix/rand.rb +20 -0
- data/examples/matrix/read.rb +29 -0
- data/examples/matrix/rowcol.rb +47 -0
- data/examples/matrix/set.rb +41 -0
- data/examples/matrix/set_all.rb +100 -0
- data/examples/matrix/view.rb +32 -0
- data/examples/matrix/view_all.rb +148 -0
- data/examples/matrix/write.rb +23 -0
- data/examples/min.rb +29 -0
- data/examples/monte/miser.rb +47 -0
- data/examples/monte/monte.rb +47 -0
- data/examples/monte/plain.rb +47 -0
- data/examples/monte/vegas.rb +46 -0
- data/examples/multimin/bundle.rb +66 -0
- data/examples/multimin/cqp.rb +109 -0
- data/examples/multimin/fdfminimizer.rb +40 -0
- data/examples/multimin/fminimizer.rb +41 -0
- data/examples/multiroot/demo.rb +36 -0
- data/examples/multiroot/fdfsolver.rb +50 -0
- data/examples/multiroot/fsolver.rb +33 -0
- data/examples/multiroot/fsolver2.rb +32 -0
- data/examples/multiroot/fsolver3.rb +26 -0
- data/examples/narray/histogram.rb +14 -0
- data/examples/narray/mandel.rb +27 -0
- data/examples/narray/narray.rb +28 -0
- data/examples/narray/narray2.rb +44 -0
- data/examples/narray/sf.rb +26 -0
- data/examples/ntuple/create.rb +17 -0
- data/examples/ntuple/project.rb +31 -0
- data/examples/odeiv/binarysystem.gp +23 -0
- data/examples/odeiv/binarysystem.rb +104 -0
- data/examples/odeiv/demo.gp +24 -0
- data/examples/odeiv/demo.rb +69 -0
- data/examples/odeiv/demo2.gp +26 -0
- data/examples/odeiv/duffing.rb +45 -0
- data/examples/odeiv/frei1.rb +109 -0
- data/examples/odeiv/frei2.rb +76 -0
- data/examples/odeiv/legendre.rb +52 -0
- data/examples/odeiv/odeiv.rb +32 -0
- data/examples/odeiv/odeiv2.rb +45 -0
- data/examples/odeiv/oscillator.rb +42 -0
- data/examples/odeiv/sedov.rb +97 -0
- data/examples/odeiv/whitedwarf.gp +40 -0
- data/examples/odeiv/whitedwarf.rb +158 -0
- data/examples/ool/conmin.rb +100 -0
- data/examples/ool/gencan.rb +99 -0
- data/examples/ool/pgrad.rb +100 -0
- data/examples/ool/spg.rb +100 -0
- data/examples/pdf/bernoulli.rb +5 -0
- data/examples/pdf/beta.rb +7 -0
- data/examples/pdf/binomiral.rb +10 -0
- data/examples/pdf/cauchy.rb +6 -0
- data/examples/pdf/chisq.rb +8 -0
- data/examples/pdf/exponential.rb +7 -0
- data/examples/pdf/exppow.rb +6 -0
- data/examples/pdf/fdist.rb +7 -0
- data/examples/pdf/flat.rb +7 -0
- data/examples/pdf/gamma.rb +8 -0
- data/examples/pdf/gauss-tail.rb +5 -0
- data/examples/pdf/gauss.rb +6 -0
- data/examples/pdf/geometric.rb +5 -0
- data/examples/pdf/gumbel.rb +6 -0
- data/examples/pdf/hypergeometric.rb +11 -0
- data/examples/pdf/landau.rb +5 -0
- data/examples/pdf/laplace.rb +7 -0
- data/examples/pdf/logarithmic.rb +5 -0
- data/examples/pdf/logistic.rb +6 -0
- data/examples/pdf/lognormal.rb +6 -0
- data/examples/pdf/neg-binomiral.rb +10 -0
- data/examples/pdf/pareto.rb +7 -0
- data/examples/pdf/pascal.rb +10 -0
- data/examples/pdf/poisson.rb +5 -0
- data/examples/pdf/rayleigh-tail.rb +6 -0
- data/examples/pdf/rayleigh.rb +6 -0
- data/examples/pdf/tdist.rb +6 -0
- data/examples/pdf/weibull.rb +8 -0
- data/examples/permutation/ex1.rb +22 -0
- data/examples/permutation/permutation.rb +16 -0
- data/examples/poly/bell.rb +6 -0
- data/examples/poly/bessel.rb +6 -0
- data/examples/poly/cheb.rb +6 -0
- data/examples/poly/cheb_II.rb +6 -0
- data/examples/poly/cubic.rb +9 -0
- data/examples/poly/demo.rb +20 -0
- data/examples/poly/eval.rb +28 -0
- data/examples/poly/eval_derivs.rb +14 -0
- data/examples/poly/fit.rb +21 -0
- data/examples/poly/hermite.rb +6 -0
- data/examples/poly/poly.rb +13 -0
- data/examples/poly/quadratic.rb +25 -0
- data/examples/random/diffusion.rb +34 -0
- data/examples/random/gaussian.rb +9 -0
- data/examples/random/generator.rb +27 -0
- data/examples/random/hdsobol.rb +21 -0
- data/examples/random/poisson.rb +9 -0
- data/examples/random/qrng.rb +19 -0
- data/examples/random/randomwalk.rb +37 -0
- data/examples/random/randomwalk2d.rb +19 -0
- data/examples/random/rayleigh.rb +36 -0
- data/examples/random/rng.rb +33 -0
- data/examples/random/rngextra.rb +14 -0
- data/examples/roots/bisection.rb +25 -0
- data/examples/roots/brent.rb +43 -0
- data/examples/roots/demo.rb +30 -0
- data/examples/roots/newton.rb +46 -0
- data/examples/roots/recombination.gp +12 -0
- data/examples/roots/recombination.rb +61 -0
- data/examples/roots/steffenson.rb +48 -0
- data/examples/sf/ShiChi.rb +6 -0
- data/examples/sf/SiCi.rb +6 -0
- data/examples/sf/airy_Ai.rb +8 -0
- data/examples/sf/airy_Bi.rb +8 -0
- data/examples/sf/bessel_IK.rb +12 -0
- data/examples/sf/bessel_JY.rb +13 -0
- data/examples/sf/beta_inc.rb +9 -0
- data/examples/sf/clausen.rb +6 -0
- data/examples/sf/dawson.rb +5 -0
- data/examples/sf/debye.rb +9 -0
- data/examples/sf/dilog.rb +6 -0
- data/examples/sf/ellint.rb +6 -0
- data/examples/sf/expint.rb +8 -0
- data/examples/sf/fermi.rb +10 -0
- data/examples/sf/gamma_inc_P.rb +9 -0
- data/examples/sf/gegenbauer.rb +8 -0
- data/examples/sf/hyperg.rb +7 -0
- data/examples/sf/laguerre.rb +19 -0
- data/examples/sf/lambertW.rb +5 -0
- data/examples/sf/legendre_P.rb +10 -0
- data/examples/sf/lngamma.rb +5 -0
- data/examples/sf/psi.rb +54 -0
- data/examples/sf/sphbessel.gp +27 -0
- data/examples/sf/sphbessel.rb +30 -0
- data/examples/sf/synchrotron.rb +5 -0
- data/examples/sf/transport.rb +10 -0
- data/examples/sf/zetam1.rb +5 -0
- data/examples/siman.rb +44 -0
- data/examples/sort/heapsort.rb +23 -0
- data/examples/sort/heapsort_vector_complex.rb +21 -0
- data/examples/sort/sort.rb +23 -0
- data/examples/sort/sort2.rb +16 -0
- data/examples/stats/mean.rb +17 -0
- data/examples/stats/statistics.rb +18 -0
- data/examples/stats/test.rb +9 -0
- data/examples/sum.rb +34 -0
- data/examples/tamu_anova.rb +18 -0
- data/examples/vector/a.dat +0 -0
- data/examples/vector/add.rb +56 -0
- data/examples/vector/b.dat +4 -0
- data/examples/vector/c.dat +3 -0
- data/examples/vector/collect.rb +26 -0
- data/examples/vector/compare.rb +28 -0
- data/examples/vector/complex.rb +51 -0
- data/examples/vector/complex_get_all.rb +85 -0
- data/examples/vector/complex_set_all.rb +131 -0
- data/examples/vector/complex_view_all.rb +77 -0
- data/examples/vector/connect.rb +22 -0
- data/examples/vector/decimate.rb +38 -0
- data/examples/vector/diff.rb +31 -0
- data/examples/vector/filescan.rb +17 -0
- data/examples/vector/floor.rb +23 -0
- data/examples/vector/get_all.rb +82 -0
- data/examples/vector/gnuplot.rb +38 -0
- data/examples/vector/graph.rb +28 -0
- data/examples/vector/histogram.rb +22 -0
- data/examples/vector/linspace.rb +24 -0
- data/examples/vector/log.rb +17 -0
- data/examples/vector/logic.rb +33 -0
- data/examples/vector/logspace.rb +25 -0
- data/examples/vector/minmax.rb +47 -0
- data/examples/vector/mul.rb +49 -0
- data/examples/vector/narray.rb +46 -0
- data/examples/vector/read.rb +29 -0
- data/examples/vector/set.rb +35 -0
- data/examples/vector/set_all.rb +121 -0
- data/examples/vector/smpv.dat +15 -0
- data/examples/vector/test.rb +43 -0
- data/examples/vector/test_gslblock.rb +58 -0
- data/examples/vector/vector.rb +110 -0
- data/examples/vector/view.rb +35 -0
- data/examples/vector/view_all.rb +73 -0
- data/examples/vector/where.rb +29 -0
- data/examples/vector/write.rb +24 -0
- data/examples/vector/zip.rb +34 -0
- data/examples/wavelet/ecg.dat +256 -0
- data/examples/wavelet/wavelet1.rb +50 -0
- data/ext/alf.c +206 -0
- data/ext/array.c +642 -0
- data/ext/array_complex.c +248 -0
- data/ext/blas.c +29 -0
- data/ext/blas1.c +734 -0
- data/ext/blas2.c +1093 -0
- data/ext/blas3.c +881 -0
- data/ext/block.c +44 -0
- data/ext/block_source.c +887 -0
- data/ext/bspline.c +130 -0
- data/ext/bundle.c +3 -0
- data/ext/cdf.c +754 -0
- data/ext/cheb.c +542 -0
- data/ext/combination.c +283 -0
- data/ext/common.c +325 -0
- data/ext/complex.c +1004 -0
- data/ext/const.c +673 -0
- data/ext/const_additional.c +120 -0
- data/ext/cqp.c +283 -0
- data/ext/deriv.c +195 -0
- data/ext/dht.c +361 -0
- data/ext/diff.c +166 -0
- data/ext/dirac.c +389 -0
- data/ext/eigen.c +2373 -0
- data/ext/error.c +193 -0
- data/ext/extconf.rb +303 -0
- data/ext/fcmp.c +66 -0
- data/ext/fft.c +1102 -0
- data/ext/fit.c +205 -0
- data/ext/fresnel.c +312 -0
- data/ext/function.c +524 -0
- data/ext/geometry.c +139 -0
- data/ext/graph.c +1640 -0
- data/ext/gsl.c +280 -0
- data/ext/gsl_narray.c +804 -0
- data/ext/histogram.c +1991 -0
- data/ext/histogram2d.c +1068 -0
- data/ext/histogram3d.c +884 -0
- data/ext/histogram3d_source.c +750 -0
- data/ext/histogram_find.c +101 -0
- data/ext/histogram_oper.c +159 -0
- data/ext/ieee.c +100 -0
- data/ext/integration.c +1179 -0
- data/ext/interp.c +512 -0
- data/ext/jacobi.c +739 -0
- data/ext/linalg.c +4042 -0
- data/ext/linalg_complex.c +739 -0
- data/ext/math.c +725 -0
- data/ext/matrix.c +39 -0
- data/ext/matrix_complex.c +1737 -0
- data/ext/matrix_double.c +560 -0
- data/ext/matrix_int.c +256 -0
- data/ext/matrix_source.c +2734 -0
- data/ext/min.c +250 -0
- data/ext/monte.c +992 -0
- data/ext/multifit.c +1871 -0
- data/ext/multimin.c +806 -0
- data/ext/multimin_fsdf.c +156 -0
- data/ext/multiroots.c +955 -0
- data/ext/multiset.c +214 -0
- data/ext/ndlinear.c +321 -0
- data/ext/nmf.c +171 -0
- data/ext/nmf_wrap.c +75 -0
- data/ext/ntuple.c +469 -0
- data/ext/odeiv.c +962 -0
- data/ext/ool.c +879 -0
- data/ext/oper_complex_source.c +253 -0
- data/ext/permutation.c +596 -0
- data/ext/poly.c +42 -0
- data/ext/poly2.c +265 -0
- data/ext/poly_source.c +1915 -0
- data/ext/qrng.c +171 -0
- data/ext/randist.c +1873 -0
- data/ext/rational.c +480 -0
- data/ext/rng.c +612 -0
- data/ext/root.c +408 -0
- data/ext/sf.c +1494 -0
- data/ext/sf_airy.c +200 -0
- data/ext/sf_bessel.c +871 -0
- data/ext/sf_clausen.c +28 -0
- data/ext/sf_coulomb.c +206 -0
- data/ext/sf_coupling.c +121 -0
- data/ext/sf_dawson.c +29 -0
- data/ext/sf_debye.c +157 -0
- data/ext/sf_dilog.c +43 -0
- data/ext/sf_elementary.c +46 -0
- data/ext/sf_ellint.c +206 -0
- data/ext/sf_elljac.c +30 -0
- data/ext/sf_erfc.c +93 -0
- data/ext/sf_exp.c +169 -0
- data/ext/sf_expint.c +211 -0
- data/ext/sf_fermi_dirac.c +148 -0
- data/ext/sf_gamma.c +347 -0
- data/ext/sf_gegenbauer.c +97 -0
- data/ext/sf_hyperg.c +203 -0
- data/ext/sf_laguerre.c +113 -0
- data/ext/sf_lambert.c +47 -0
- data/ext/sf_legendre.c +368 -0
- data/ext/sf_log.c +105 -0
- data/ext/sf_mathieu.c +238 -0
- data/ext/sf_power.c +47 -0
- data/ext/sf_psi.c +98 -0
- data/ext/sf_synchrotron.c +48 -0
- data/ext/sf_transport.c +76 -0
- data/ext/sf_trigonometric.c +210 -0
- data/ext/sf_zeta.c +119 -0
- data/ext/signal.c +308 -0
- data/ext/siman.c +717 -0
- data/ext/sort.c +208 -0
- data/ext/spline.c +395 -0
- data/ext/stats.c +800 -0
- data/ext/sum.c +168 -0
- data/ext/tamu_anova.c +56 -0
- data/ext/tensor.c +38 -0
- data/ext/tensor_source.c +1123 -0
- data/ext/vector.c +38 -0
- data/ext/vector_complex.c +2246 -0
- data/ext/vector_double.c +1438 -0
- data/ext/vector_int.c +204 -0
- data/ext/vector_source.c +3336 -0
- data/ext/wavelet.c +945 -0
- data/include/rb_gsl.h +158 -0
- data/include/rb_gsl_array.h +238 -0
- data/include/rb_gsl_cheb.h +21 -0
- data/include/rb_gsl_common.h +348 -0
- data/include/rb_gsl_complex.h +25 -0
- data/include/rb_gsl_config.h +62 -0
- data/include/rb_gsl_const.h +29 -0
- data/include/rb_gsl_dirac.h +13 -0
- data/include/rb_gsl_eigen.h +17 -0
- data/include/rb_gsl_fft.h +62 -0
- data/include/rb_gsl_fit.h +25 -0
- data/include/rb_gsl_function.h +27 -0
- data/include/rb_gsl_graph.h +70 -0
- data/include/rb_gsl_histogram.h +63 -0
- data/include/rb_gsl_histogram3d.h +97 -0
- data/include/rb_gsl_integration.h +17 -0
- data/include/rb_gsl_interp.h +46 -0
- data/include/rb_gsl_linalg.h +25 -0
- data/include/rb_gsl_math.h +26 -0
- data/include/rb_gsl_odeiv.h +21 -0
- data/include/rb_gsl_poly.h +71 -0
- data/include/rb_gsl_rational.h +37 -0
- data/include/rb_gsl_rng.h +21 -0
- data/include/rb_gsl_root.h +22 -0
- data/include/rb_gsl_sf.h +119 -0
- data/include/rb_gsl_statistics.h +17 -0
- data/include/rb_gsl_tensor.h +45 -0
- data/include/rb_gsl_with_narray.h +29 -0
- data/include/templates_off.h +87 -0
- data/include/templates_on.h +241 -0
- data/lib/gsl.rb +3 -0
- data/lib/gsl/gnuplot.rb +41 -0
- data/lib/gsl/oper.rb +68 -0
- data/lib/ool.rb +22 -0
- data/lib/ool/conmin.rb +30 -0
- data/lib/rbgsl.rb +3 -0
- data/rdoc/alf.rdoc +77 -0
- data/rdoc/blas.rdoc +269 -0
- data/rdoc/bspline.rdoc +42 -0
- data/rdoc/changes.rdoc +164 -0
- data/rdoc/cheb.rdoc +99 -0
- data/rdoc/cholesky_complex.rdoc +46 -0
- data/rdoc/combi.rdoc +125 -0
- data/rdoc/complex.rdoc +210 -0
- data/rdoc/const.rdoc +546 -0
- data/rdoc/dht.rdoc +122 -0
- data/rdoc/diff.rdoc +133 -0
- data/rdoc/ehandling.rdoc +50 -0
- data/rdoc/eigen.rdoc +401 -0
- data/rdoc/fft.rdoc +535 -0
- data/rdoc/fit.rdoc +284 -0
- data/rdoc/function.rdoc +94 -0
- data/rdoc/graph.rdoc +137 -0
- data/rdoc/hist.rdoc +409 -0
- data/rdoc/hist2d.rdoc +279 -0
- data/rdoc/hist3d.rdoc +112 -0
- data/rdoc/index.rdoc +62 -0
- data/rdoc/integration.rdoc +398 -0
- data/rdoc/interp.rdoc +231 -0
- data/rdoc/intro.rdoc +27 -0
- data/rdoc/linalg.rdoc +681 -0
- data/rdoc/linalg_complex.rdoc +88 -0
- data/rdoc/math.rdoc +276 -0
- data/rdoc/matrix.rdoc +1093 -0
- data/rdoc/min.rdoc +189 -0
- data/rdoc/monte.rdoc +234 -0
- data/rdoc/multimin.rdoc +312 -0
- data/rdoc/multiroot.rdoc +293 -0
- data/rdoc/narray.rdoc +177 -0
- data/rdoc/ndlinear.rdoc +250 -0
- data/rdoc/nonlinearfit.rdoc +348 -0
- data/rdoc/ntuple.rdoc +88 -0
- data/rdoc/odeiv.rdoc +378 -0
- data/rdoc/perm.rdoc +221 -0
- data/rdoc/poly.rdoc +335 -0
- data/rdoc/qrng.rdoc +90 -0
- data/rdoc/randist.rdoc +233 -0
- data/rdoc/ref.rdoc +93 -0
- data/rdoc/rng.rdoc +203 -0
- data/rdoc/rngextra.rdoc +11 -0
- data/rdoc/roots.rdoc +305 -0
- data/rdoc/screenshot.rdoc +40 -0
- data/rdoc/sf.rdoc +1622 -0
- data/rdoc/siman.rdoc +89 -0
- data/rdoc/sort.rdoc +94 -0
- data/rdoc/start.rdoc +16 -0
- data/rdoc/stats.rdoc +219 -0
- data/rdoc/sum.rdoc +65 -0
- data/rdoc/tensor.rdoc +251 -0
- data/rdoc/tut.rdoc +5 -0
- data/rdoc/use.rdoc +177 -0
- data/rdoc/vector.rdoc +1243 -0
- data/rdoc/vector_complex.rdoc +347 -0
- data/rdoc/wavelet.rdoc +218 -0
- data/setup.rb +1585 -0
- data/tests/blas/amax.rb +14 -0
- data/tests/blas/asum.rb +16 -0
- data/tests/blas/axpy.rb +25 -0
- data/tests/blas/copy.rb +23 -0
- data/tests/blas/dot.rb +23 -0
- data/tests/bspline.rb +53 -0
- data/tests/cdf.rb +1388 -0
- data/tests/cheb.rb +112 -0
- data/tests/combination.rb +123 -0
- data/tests/complex.rb +17 -0
- data/tests/const.rb +24 -0
- data/tests/deriv.rb +85 -0
- data/tests/dht/dht1.rb +17 -0
- data/tests/dht/dht2.rb +23 -0
- data/tests/dht/dht3.rb +23 -0
- data/tests/dht/dht4.rb +23 -0
- data/tests/diff.rb +78 -0
- data/tests/eigen/eigen.rb +220 -0
- data/tests/eigen/gen.rb +105 -0
- data/tests/eigen/genherm.rb +66 -0
- data/tests/eigen/gensymm.rb +68 -0
- data/tests/eigen/nonsymm.rb +53 -0
- data/tests/eigen/nonsymmv.rb +53 -0
- data/tests/eigen/symm-herm.rb +74 -0
- data/tests/err.rb +58 -0
- data/tests/fit.rb +124 -0
- data/tests/gsl_test.rb +118 -0
- data/tests/gsl_test2.rb +110 -0
- data/tests/histo.rb +12 -0
- data/tests/integration/integration1.rb +72 -0
- data/tests/integration/integration2.rb +71 -0
- data/tests/integration/integration3.rb +71 -0
- data/tests/integration/integration4.rb +71 -0
- data/tests/interp.rb +45 -0
- data/tests/linalg/HH.rb +64 -0
- data/tests/linalg/LU.rb +47 -0
- data/tests/linalg/QR.rb +77 -0
- data/tests/linalg/SV.rb +24 -0
- data/tests/linalg/TDN.rb +116 -0
- data/tests/linalg/TDS.rb +122 -0
- data/tests/linalg/bidiag.rb +73 -0
- data/tests/linalg/cholesky.rb +20 -0
- data/tests/linalg/linalg.rb +158 -0
- data/tests/matrix/matrix_complex_test.rb +36 -0
- data/tests/matrix/matrix_nmf_test.rb +39 -0
- data/tests/matrix/matrix_test.rb +48 -0
- data/tests/min.rb +99 -0
- data/tests/monte/miser.rb +31 -0
- data/tests/monte/vegas.rb +45 -0
- data/tests/multifit/test_2dgauss.rb +112 -0
- data/tests/multifit/test_brown.rb +90 -0
- data/tests/multifit/test_enso.rb +246 -0
- data/tests/multifit/test_filip.rb +155 -0
- data/tests/multifit/test_gauss.rb +97 -0
- data/tests/multifit/test_longley.rb +110 -0
- data/tests/multifit/test_multifit.rb +52 -0
- data/tests/multimin.rb +139 -0
- data/tests/multiroot.rb +131 -0
- data/tests/multiset.rb +52 -0
- data/tests/narray/blas_dnrm2.rb +20 -0
- data/tests/odeiv.rb +353 -0
- data/tests/poly/poly.rb +290 -0
- data/tests/poly/special.rb +65 -0
- data/tests/qrng.rb +131 -0
- data/tests/quartic.rb +29 -0
- data/tests/randist.rb +134 -0
- data/tests/rng.rb +305 -0
- data/tests/roots.rb +76 -0
- data/tests/run-test.sh +17 -0
- data/tests/sf/gsl_test_sf.rb +249 -0
- data/tests/sf/test_airy.rb +83 -0
- data/tests/sf/test_bessel.rb +306 -0
- data/tests/sf/test_coulomb.rb +17 -0
- data/tests/sf/test_dilog.rb +25 -0
- data/tests/sf/test_gamma.rb +209 -0
- data/tests/sf/test_hyperg.rb +356 -0
- data/tests/sf/test_legendre.rb +227 -0
- data/tests/sf/test_mathieu.rb +59 -0
- data/tests/sf/test_mode.rb +19 -0
- data/tests/sf/test_sf.rb +839 -0
- data/tests/stats.rb +174 -0
- data/tests/stats_mt.rb +16 -0
- data/tests/sum.rb +98 -0
- data/tests/sys.rb +323 -0
- data/tests/tensor.rb +419 -0
- data/tests/vector/vector_complex_test.rb +101 -0
- data/tests/vector/vector_test.rb +141 -0
- data/tests/wavelet.rb +142 -0
- metadata +789 -0
data/ext/poly.c
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
/*
|
2
|
+
poly.c
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
4
|
+
(C) Copyright 2001-2006 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
|
+
#include "rb_gsl_config.h"
|
12
|
+
#include "rb_gsl_poly.h"
|
13
|
+
#include "rb_gsl_array.h"
|
14
|
+
#include "rb_gsl_common.h"
|
15
|
+
#ifdef HAVE_NARARY_H
|
16
|
+
#include "narray.h"
|
17
|
+
#endif
|
18
|
+
|
19
|
+
void Init_gsl_poly_init(VALUE module);
|
20
|
+
void Init_gsl_poly_int_init(VALUE module);
|
21
|
+
void Init_gsl_poly2(VALUE module);
|
22
|
+
|
23
|
+
#define BASE_DOUBLE
|
24
|
+
#include "templates_on.h"
|
25
|
+
#include "poly_source.c"
|
26
|
+
#include "templates_off.h"
|
27
|
+
void Init_gsl_poly(VALUE module)
|
28
|
+
{
|
29
|
+
Init_gsl_poly_init(module);
|
30
|
+
}
|
31
|
+
|
32
|
+
#undef BASE_DOUBLE
|
33
|
+
|
34
|
+
#define BASE_INT
|
35
|
+
#include "templates_on.h"
|
36
|
+
#include "poly_source.c"
|
37
|
+
#include "templates_off.h"
|
38
|
+
void Init_gsl_poly_int(VALUE module)
|
39
|
+
{
|
40
|
+
Init_gsl_poly_int_init(module);
|
41
|
+
}
|
42
|
+
#undef BASE_INT
|
data/ext/poly2.c
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
/*
|
2
|
+
poly2.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
|
+
#include "rb_gsl_config.h"
|
12
|
+
#include "rb_gsl_poly.h"
|
13
|
+
#include "rb_gsl_math.h"
|
14
|
+
#include "rb_gsl_array.h"
|
15
|
+
#include <gsl/gsl_sf_gamma.h>
|
16
|
+
|
17
|
+
static gsl_poly_int* mygsl_poly_hermite(int n1)
|
18
|
+
{
|
19
|
+
size_t n;
|
20
|
+
gsl_vector_int *p1, *p2, *p0;
|
21
|
+
int coef1[2] = {0, 2};
|
22
|
+
int coef2[3] = {-2, 0, 4};
|
23
|
+
if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
24
|
+
p0 = gsl_vector_int_calloc(n1 + 1);
|
25
|
+
switch (n1) {
|
26
|
+
case 0:
|
27
|
+
gsl_vector_int_set(p0, 0, 1);
|
28
|
+
break;
|
29
|
+
case 1:
|
30
|
+
memcpy(p0->data, coef1, 2*sizeof(int));
|
31
|
+
break;
|
32
|
+
case 2:
|
33
|
+
memcpy(p0->data, coef2, 3*sizeof(int));
|
34
|
+
break;
|
35
|
+
default:
|
36
|
+
p1 = gsl_vector_int_calloc(n1 + 1);
|
37
|
+
p2 = gsl_vector_int_calloc(n1 + 1);
|
38
|
+
memcpy(p1->data, coef2, 3*sizeof(int));
|
39
|
+
memcpy(p2->data, coef1, 2*sizeof(int));
|
40
|
+
for (n = 2; n < n1; n++) {
|
41
|
+
gsl_vector_int_memcpy(p0, p1);
|
42
|
+
mygsl_vector_int_shift_scale2(p0, n);
|
43
|
+
gsl_vector_int_scale(p2, 2*n);
|
44
|
+
|
45
|
+
gsl_vector_int_sub(p0, p2);
|
46
|
+
/* save for the next iteration */
|
47
|
+
gsl_vector_int_memcpy(p2, p1);
|
48
|
+
gsl_vector_int_memcpy(p1, p0);
|
49
|
+
}
|
50
|
+
gsl_vector_int_free(p2);
|
51
|
+
gsl_vector_int_free(p1);
|
52
|
+
break;
|
53
|
+
}
|
54
|
+
return p0;
|
55
|
+
}
|
56
|
+
|
57
|
+
static gsl_poly_int* mygsl_poly_cheb(int n1)
|
58
|
+
{
|
59
|
+
size_t n;
|
60
|
+
gsl_vector_int *p1, *p2, *p0;
|
61
|
+
int coef1[2] = {0, 1};
|
62
|
+
int coef2[3] = {-1, 0, 2};
|
63
|
+
if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
64
|
+
p0 = gsl_vector_int_calloc(n1 + 1);
|
65
|
+
switch (n1) {
|
66
|
+
case 0:
|
67
|
+
gsl_vector_int_set(p0, 0, 1);
|
68
|
+
break;
|
69
|
+
case 1:
|
70
|
+
memcpy(p0->data, coef1, 2*sizeof(int));
|
71
|
+
break;
|
72
|
+
case 2:
|
73
|
+
memcpy(p0->data, coef2, 3*sizeof(int));
|
74
|
+
break;
|
75
|
+
default:
|
76
|
+
p1 = gsl_vector_int_calloc(n1 + 1);
|
77
|
+
p2 = gsl_vector_int_calloc(n1 + 1);
|
78
|
+
memcpy(p1->data, coef2, 3*sizeof(int));
|
79
|
+
memcpy(p2->data, coef1, 2*sizeof(int));
|
80
|
+
for (n = 2; n < n1; n++) {
|
81
|
+
gsl_vector_int_memcpy(p0, p1);
|
82
|
+
mygsl_vector_int_shift_scale2(p0, n);
|
83
|
+
|
84
|
+
gsl_vector_int_sub(p0, p2);
|
85
|
+
/* save for the next iteration */
|
86
|
+
gsl_vector_int_memcpy(p2, p1);
|
87
|
+
gsl_vector_int_memcpy(p1, p0);
|
88
|
+
}
|
89
|
+
gsl_vector_int_free(p2);
|
90
|
+
gsl_vector_int_free(p1);
|
91
|
+
break;
|
92
|
+
}
|
93
|
+
return p0;
|
94
|
+
}
|
95
|
+
|
96
|
+
static gsl_poly_int* mygsl_poly_chebII(int n1)
|
97
|
+
{
|
98
|
+
size_t n;
|
99
|
+
gsl_vector_int *p1, *p2, *p0;
|
100
|
+
int coef1[2] = {0, 2};
|
101
|
+
int coef2[3] = {-1, 0, 4};
|
102
|
+
if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
103
|
+
p0 = gsl_vector_int_calloc(n1 + 1);
|
104
|
+
switch (n1) {
|
105
|
+
case 0:
|
106
|
+
gsl_vector_int_set(p0, 0, 1);
|
107
|
+
break;
|
108
|
+
case 1:
|
109
|
+
memcpy(p0->data, coef1, 2*sizeof(int));
|
110
|
+
break;
|
111
|
+
case 2:
|
112
|
+
memcpy(p0->data, coef2, 3*sizeof(int));
|
113
|
+
break;
|
114
|
+
default:
|
115
|
+
p1 = gsl_vector_int_calloc(n1 + 1);
|
116
|
+
p2 = gsl_vector_int_calloc(n1 + 1);
|
117
|
+
memcpy(p1->data, coef2, 3*sizeof(int));
|
118
|
+
memcpy(p2->data, coef1, 2*sizeof(int));
|
119
|
+
for (n = 2; n < n1; n++) {
|
120
|
+
gsl_vector_int_memcpy(p0, p1);
|
121
|
+
mygsl_vector_int_shift_scale2(p0, n);
|
122
|
+
gsl_vector_int_sub(p0, p2);
|
123
|
+
/* save for the next iteration */
|
124
|
+
gsl_vector_int_memcpy(p2, p1);
|
125
|
+
gsl_vector_int_memcpy(p1, p0);
|
126
|
+
}
|
127
|
+
gsl_vector_int_free(p2);
|
128
|
+
gsl_vector_int_free(p1);
|
129
|
+
break;
|
130
|
+
}
|
131
|
+
return p0;
|
132
|
+
}
|
133
|
+
|
134
|
+
static gsl_poly_int* mygsl_poly_laguerre(int n)
|
135
|
+
{
|
136
|
+
size_t m, k;
|
137
|
+
int val;
|
138
|
+
gsl_vector_int *p0;
|
139
|
+
if (n < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
140
|
+
p0 = gsl_vector_int_calloc(n + 1);
|
141
|
+
switch (n) {
|
142
|
+
case 0:
|
143
|
+
gsl_vector_int_set(p0, 0, 1);
|
144
|
+
break;
|
145
|
+
case 1:
|
146
|
+
gsl_vector_int_set(p0, 0, 1);
|
147
|
+
gsl_vector_int_set(p0, 1, -1);
|
148
|
+
break;
|
149
|
+
default:
|
150
|
+
k = gsl_sf_fact(n);
|
151
|
+
for (m = 0; m <= n; m++) {
|
152
|
+
val = k*k/gsl_sf_fact(n-m)/gsl_pow_2(gsl_sf_fact(m));
|
153
|
+
if (m%2 == 1) val *= -1;
|
154
|
+
gsl_vector_int_set(p0, m, val);
|
155
|
+
}
|
156
|
+
break;
|
157
|
+
}
|
158
|
+
return p0;
|
159
|
+
}
|
160
|
+
|
161
|
+
static gsl_poly_int* mygsl_poly_bessel(int n)
|
162
|
+
{
|
163
|
+
size_t k;
|
164
|
+
gsl_vector_int *p0;
|
165
|
+
if (n < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
166
|
+
p0 = gsl_vector_int_calloc(n + 1);
|
167
|
+
for (k = 0; k <= n; k++) {
|
168
|
+
gsl_vector_int_set(p0, k, gsl_sf_fact(n+k)/gsl_sf_fact(n-k)/gsl_sf_fact(k)/((int) pow(2, k)));
|
169
|
+
}
|
170
|
+
return p0;
|
171
|
+
}
|
172
|
+
|
173
|
+
static gsl_poly_int* mygsl_poly_bell(int n1)
|
174
|
+
{
|
175
|
+
size_t n, j;
|
176
|
+
gsl_vector_int *p1, *p0;
|
177
|
+
int coef1[2] = {0, 1};
|
178
|
+
int coef2[3] = {0, 1, 1};
|
179
|
+
if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
180
|
+
p0 = gsl_vector_int_calloc(n1 + 1);
|
181
|
+
switch (n1) {
|
182
|
+
case 0:
|
183
|
+
gsl_vector_int_set(p0, 0, 1);
|
184
|
+
break;
|
185
|
+
case 1:
|
186
|
+
memcpy(p0->data, coef1, 2*sizeof(int));
|
187
|
+
break;
|
188
|
+
case 2:
|
189
|
+
memcpy(p0->data, coef2, 3*sizeof(int));
|
190
|
+
break;
|
191
|
+
default:
|
192
|
+
p1 = gsl_vector_int_calloc(n1 + 1);
|
193
|
+
memcpy(p1->data, coef2, 3*sizeof(int));
|
194
|
+
for (n = 2; n < n1; n++) {
|
195
|
+
gsl_vector_int_memcpy(p0, p1);
|
196
|
+
mygsl_vector_int_shift(p0, n);
|
197
|
+
for (j = 0; j < n; j++) {
|
198
|
+
gsl_vector_int_set(p1, j, gsl_vector_int_get(p1, j+1)*(j+1));
|
199
|
+
}
|
200
|
+
gsl_vector_int_set(p1, n, 0);
|
201
|
+
mygsl_vector_int_shift(p1, n);
|
202
|
+
gsl_vector_int_add(p0, p1);
|
203
|
+
/* save for the next iteration */
|
204
|
+
gsl_vector_int_memcpy(p1, p0);
|
205
|
+
}
|
206
|
+
gsl_vector_int_free(p1);
|
207
|
+
break;
|
208
|
+
}
|
209
|
+
return p0;
|
210
|
+
}
|
211
|
+
|
212
|
+
static VALUE rb_gsl_poly_define_poly(VALUE klass, VALUE order,
|
213
|
+
gsl_poly_int* (*f)(int n1)) {
|
214
|
+
int n1;
|
215
|
+
gsl_poly_int *pnew = NULL;
|
216
|
+
CHECK_FIXNUM(order);
|
217
|
+
n1 = FIX2INT(order);
|
218
|
+
if (n1 < 0) rb_raise(rb_eArgError, "order must be >= 0");
|
219
|
+
pnew = (*f)(n1);
|
220
|
+
return Data_Wrap_Struct(cgsl_poly_int, 0, gsl_vector_int_free, pnew);
|
221
|
+
}
|
222
|
+
|
223
|
+
static VALUE rb_gsl_poly_hermite(VALUE klass, VALUE order)
|
224
|
+
{
|
225
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_hermite);
|
226
|
+
}
|
227
|
+
|
228
|
+
static VALUE rb_gsl_poly_cheb(VALUE klass, VALUE order)
|
229
|
+
{
|
230
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_cheb);
|
231
|
+
}
|
232
|
+
|
233
|
+
static VALUE rb_gsl_poly_chebII(VALUE klass, VALUE order)
|
234
|
+
{
|
235
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_chebII);
|
236
|
+
}
|
237
|
+
|
238
|
+
static VALUE rb_gsl_poly_laguerre(VALUE klass, VALUE order)
|
239
|
+
{
|
240
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_laguerre);
|
241
|
+
}
|
242
|
+
|
243
|
+
static VALUE rb_gsl_poly_bessel(VALUE klass, VALUE order)
|
244
|
+
{
|
245
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_bessel);
|
246
|
+
}
|
247
|
+
|
248
|
+
static VALUE rb_gsl_poly_bell(VALUE klass, VALUE order)
|
249
|
+
{
|
250
|
+
return rb_gsl_poly_define_poly(klass, order, mygsl_poly_bell);
|
251
|
+
}
|
252
|
+
|
253
|
+
void Init_gsl_poly2(VALUE module)
|
254
|
+
{
|
255
|
+
rb_define_singleton_method(cgsl_poly, "hermite", rb_gsl_poly_hermite, 1);
|
256
|
+
rb_define_singleton_method(cgsl_poly, "cheb", rb_gsl_poly_cheb, 1);
|
257
|
+
rb_define_singleton_method(cgsl_poly, "chebyshev", rb_gsl_poly_cheb, 1);
|
258
|
+
rb_define_singleton_method(cgsl_poly, "cheb_I", rb_gsl_poly_cheb, 1);
|
259
|
+
rb_define_singleton_method(cgsl_poly, "chebyshev_I", rb_gsl_poly_cheb, 1);
|
260
|
+
rb_define_singleton_method(cgsl_poly, "cheb_II", rb_gsl_poly_chebII, 1);
|
261
|
+
rb_define_singleton_method(cgsl_poly, "chebyshev_II", rb_gsl_poly_chebII, 1);
|
262
|
+
rb_define_singleton_method(cgsl_poly, "bessel", rb_gsl_poly_bessel, 1);
|
263
|
+
rb_define_singleton_method(cgsl_poly, "bell", rb_gsl_poly_bell, 1);
|
264
|
+
rb_define_singleton_method(cgsl_poly, "laguerre", rb_gsl_poly_laguerre, 1);
|
265
|
+
}
|
data/ext/poly_source.c
ADDED
@@ -0,0 +1,1915 @@
|
|
1
|
+
/*
|
2
|
+
poly_source.c
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
4
|
+
(C) Copyright 2001-2006 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
|
+
#ifdef BASE_DOUBLE
|
13
|
+
#define NUMCONV(x) NUM2DBL(x)
|
14
|
+
#define NUMCONV2(x) NUM2DBL(x)
|
15
|
+
#define MAT_ROW_COL MATRIX_ROW_COL
|
16
|
+
#define MAT_P MATRIX_P
|
17
|
+
#define MAT_ROW_P MATRIX_ROW_P
|
18
|
+
#define MAT_COL_P MATRIX_COL_P
|
19
|
+
#define C_TO_VALUE rb_float_new
|
20
|
+
#define C_TO_VALUE2 rb_float_new
|
21
|
+
#define CHECK_MAT CHECK_MATRIX
|
22
|
+
#define MAT_VIEW_P MATRIX_VIEW_P
|
23
|
+
#define PRINTF_FORMAT "%4.3e "
|
24
|
+
#define VEC_ROW_COL VECTOR_ROW_COL
|
25
|
+
#define VEC_P VECTOR_P
|
26
|
+
#define VEC_ROW_P VECTOR_ROW_P
|
27
|
+
#define VEC_COL_P VECTOR_COL_P
|
28
|
+
#define CHECK_VEC CHECK_VECTOR
|
29
|
+
#define VEC_VIEW_P VECTOR_VIEW_P
|
30
|
+
#elif defined(BASE_INT)
|
31
|
+
#define NUMCONV(x) NUM2DBL(x)
|
32
|
+
#define NUMCONV2(x) NUM2INT(x)
|
33
|
+
#define PRINTF_FORMAT "%d "
|
34
|
+
#define MAT_ROW_COL MATRIX_INT_ROW_COL
|
35
|
+
#define MAT_P MATRIX_INT_P
|
36
|
+
#define C_TO_VALUE INT2FIX
|
37
|
+
#define C_TO_VALUE2 INT2NUM
|
38
|
+
#define MAT_ROW_P MATRIX_INT_ROW_P
|
39
|
+
#define MAT_COL_P MATRIX_INT_COL_P
|
40
|
+
#define CHECK_MAT CHECK_MATRIX_INT
|
41
|
+
#define MAT_VIEW_P MATRIX_INT_VIEW_P
|
42
|
+
#define VEC_ROW_COL VECTOR_INT_ROW_COL
|
43
|
+
#define VEC_P VECTOR_INT_P
|
44
|
+
#define VEC_ROW_P VECTOR_INT_ROW_P
|
45
|
+
#define VEC_COL_P VECTOR_INT_COL_P
|
46
|
+
#define CHECK_VEC CHECK_VECTOR_INT
|
47
|
+
#define VEC_VIEW_P VECTOR_INT_VIEW_P
|
48
|
+
#endif
|
49
|
+
|
50
|
+
#ifdef BASE_DOUBLE
|
51
|
+
VALUE cgsl_poly, cgsl_poly_int;
|
52
|
+
VALUE cgsl_poly_workspace;
|
53
|
+
VALUE cgsl_poly_complex_workspace;
|
54
|
+
#ifdef GSL_1_1_LATER
|
55
|
+
VALUE cgsl_poly_dd;
|
56
|
+
VALUE cgsl_poly_taylor;
|
57
|
+
#endif
|
58
|
+
#endif
|
59
|
+
|
60
|
+
#ifdef BASE_INT
|
61
|
+
double gsl_poly_int_eval(const BASE c[], const int len, const double x)
|
62
|
+
{
|
63
|
+
int i;
|
64
|
+
double ans = (double) c[len-1];
|
65
|
+
for(i=len-1; i>0; i--) ans = (double) c[i-1] + x * ans;
|
66
|
+
return ans;
|
67
|
+
}
|
68
|
+
#endif
|
69
|
+
#ifdef BASE_DOUBLE
|
70
|
+
#ifdef HAVE_NARRAY_H
|
71
|
+
#include "rb_gsl_with_narray.h"
|
72
|
+
#endif
|
73
|
+
#ifdef GSL_1_11_LATER
|
74
|
+
static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b);
|
75
|
+
#endif
|
76
|
+
static VALUE rb_gsl_poly_eval_singleton(VALUE klass, VALUE a, VALUE x)
|
77
|
+
{
|
78
|
+
gsl_vector *v = NULL, *vx, *vnew;
|
79
|
+
gsl_matrix *mx, *mnew;
|
80
|
+
double rslt;
|
81
|
+
int flag = 0;
|
82
|
+
size_t i, N, n;
|
83
|
+
VALUE val;
|
84
|
+
double *ptr0;
|
85
|
+
double *ptr1, *ptr2;
|
86
|
+
#ifdef HAVE_NARRAY_H
|
87
|
+
int shape[1];
|
88
|
+
#endif
|
89
|
+
#ifdef GSL_1_11_LATER
|
90
|
+
gsl_complex *z, zz;
|
91
|
+
gsl_vector_complex *vz, *vznew;
|
92
|
+
if (rb_obj_is_kind_of(a, cgsl_vector_complex))
|
93
|
+
return rb_gsl_complex_poly_complex_eval(a, x);
|
94
|
+
#endif
|
95
|
+
switch (TYPE(a)) {
|
96
|
+
case T_ARRAY:
|
97
|
+
#ifdef GSL_1_11_LATER
|
98
|
+
if (rb_obj_is_kind_of(rb_ary_entry(a, 0), cgsl_complex))
|
99
|
+
return rb_gsl_complex_poly_complex_eval(a, x);
|
100
|
+
#endif
|
101
|
+
v = make_cvector_from_rarray(a);
|
102
|
+
N = v->size;
|
103
|
+
ptr0 = v->data;
|
104
|
+
flag = 1;
|
105
|
+
break;
|
106
|
+
default:
|
107
|
+
if (rb_obj_is_kind_of(a, cgsl_vector)) {
|
108
|
+
Data_Get_Struct(a, gsl_vector, v);
|
109
|
+
N = v->size;
|
110
|
+
ptr0 = v->data;
|
111
|
+
#ifdef HAVE_NARRAY_H
|
112
|
+
} else if (NA_IsNArray(a)) {
|
113
|
+
N = NA_TOTAL(a);
|
114
|
+
ptr0 = NA_PTR_TYPE(a, double*);
|
115
|
+
#endif
|
116
|
+
} else {
|
117
|
+
rb_raise(rb_eTypeError, "Wrong argument type %s (Array, GSL::Vector or NArray expected)",
|
118
|
+
rb_class2name(CLASS_OF(a)));
|
119
|
+
}
|
120
|
+
}
|
121
|
+
switch (TYPE(x)) {
|
122
|
+
case T_FIXNUM:
|
123
|
+
case T_BIGNUM:
|
124
|
+
case T_FLOAT:
|
125
|
+
val = rb_float_new(gsl_poly_eval(ptr0, N, NUM2DBL(x)));
|
126
|
+
break;
|
127
|
+
case T_ARRAY:
|
128
|
+
n = RARRAY_LEN(x);
|
129
|
+
val = rb_ary_new2(n);
|
130
|
+
for (i = 0; i < n; i++) {
|
131
|
+
rslt = gsl_poly_eval(ptr0, N, NUM2DBL(rb_ary_entry(x, i)));
|
132
|
+
rb_ary_store(val, i, rb_float_new(rslt));
|
133
|
+
}
|
134
|
+
break;
|
135
|
+
default:
|
136
|
+
if (rb_obj_is_kind_of(x, cgsl_vector)) {
|
137
|
+
Data_Get_Struct(x, gsl_vector, vx);
|
138
|
+
vnew = gsl_vector_alloc(vx->size);
|
139
|
+
val = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
140
|
+
n = vx->size;
|
141
|
+
ptr1 = vx->data;
|
142
|
+
ptr2 = vnew->data;
|
143
|
+
} else if (rb_obj_is_kind_of(x, cgsl_matrix)) {
|
144
|
+
Data_Get_Struct(x, gsl_matrix, mx);
|
145
|
+
mnew = gsl_matrix_alloc(mx->size1, mx->size2);
|
146
|
+
val = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
147
|
+
n = mx->size1*mx->size2;
|
148
|
+
ptr1 = mx->data;
|
149
|
+
ptr2 = mnew->data;
|
150
|
+
#ifdef HAVE_NARRAY_H
|
151
|
+
} else if (NA_IsNArray(x)) {
|
152
|
+
shape[0] = NA_TOTAL(x);
|
153
|
+
n = shape[0];
|
154
|
+
val = na_make_object(NA_DFLOAT, 1, shape, CLASS_OF(x));
|
155
|
+
ptr1 = NA_PTR_TYPE(x, double*);
|
156
|
+
ptr2 = NA_PTR_TYPE(val, double*);
|
157
|
+
#endif
|
158
|
+
#ifdef GSL_1_11_LATER
|
159
|
+
} else if (rb_obj_is_kind_of(x, cgsl_complex)) {
|
160
|
+
Data_Get_Struct(x, gsl_complex, z);
|
161
|
+
zz = gsl_poly_complex_eval(ptr0, N, *z);
|
162
|
+
z = make_complex(GSL_REAL(zz), GSL_IMAG(zz));
|
163
|
+
if (flag == 1) gsl_vector_free(v);
|
164
|
+
return Data_Wrap_Struct(cgsl_complex, 0, free, z);
|
165
|
+
} else if (rb_obj_is_kind_of(x, cgsl_vector_complex)) {
|
166
|
+
Data_Get_Struct(x, gsl_vector_complex, vz);
|
167
|
+
vznew = gsl_vector_complex_alloc(vz->size);
|
168
|
+
for (i = 0; i < vz->size; i++) {
|
169
|
+
zz = gsl_poly_complex_eval(ptr0, N, gsl_vector_complex_get(vz, i));
|
170
|
+
gsl_vector_complex_set(vznew, i, zz);
|
171
|
+
}
|
172
|
+
if (flag == 1) gsl_vector_free(v);
|
173
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
|
174
|
+
#endif
|
175
|
+
} else {
|
176
|
+
rb_raise(rb_eTypeError, "Wrong argument type %s (A number, Array, GSL::Vector or NArray expected)",
|
177
|
+
rb_class2name(CLASS_OF(a)));
|
178
|
+
}
|
179
|
+
for (i = 0; i < n; i++) {
|
180
|
+
ptr2[i] = gsl_poly_eval(ptr0, N, ptr1[i]);
|
181
|
+
}
|
182
|
+
}
|
183
|
+
if (flag == 1) gsl_vector_free(v);
|
184
|
+
return val;
|
185
|
+
}
|
186
|
+
#ifdef GSL_1_11_LATER
|
187
|
+
static VALUE rb_gsl_complex_poly_complex_eval(VALUE a, VALUE b)
|
188
|
+
{
|
189
|
+
gsl_vector_complex *coef, *zb, *vnew;
|
190
|
+
gsl_complex *zc;
|
191
|
+
gsl_complex z, *zx, *res;
|
192
|
+
VALUE ret;
|
193
|
+
size_t i, N;
|
194
|
+
int flag = 0;
|
195
|
+
if (rb_obj_is_kind_of(a, cgsl_vector_complex)) {
|
196
|
+
Data_Get_Struct(a, gsl_vector_complex, coef);
|
197
|
+
N = coef->size;
|
198
|
+
zc = (gsl_complex*) coef->data;
|
199
|
+
} else if (TYPE(a) == T_ARRAY) {
|
200
|
+
N = RARRAY_LEN(a);
|
201
|
+
zc = (gsl_complex*) malloc(sizeof(gsl_complex));
|
202
|
+
flag = 1;
|
203
|
+
for (i = 0; i < N; i++) {
|
204
|
+
Data_Get_Struct(rb_ary_entry(a, i), gsl_complex, zx);
|
205
|
+
zc[i] = *zx;
|
206
|
+
}
|
207
|
+
} else {
|
208
|
+
rb_raise(rb_eTypeError, "rb_gsl_complex_poly_complex_solve: wrong argument type %s (GSL::Vector::Complex or Array expected)\n", rb_class2name(CLASS_OF(a)));
|
209
|
+
}
|
210
|
+
|
211
|
+
switch (TYPE(b)) {
|
212
|
+
case T_FIXNUM:
|
213
|
+
case T_BIGNUM:
|
214
|
+
case T_FLOAT:
|
215
|
+
res = (gsl_complex*) malloc(sizeof(gsl_complex));
|
216
|
+
ret = Data_Wrap_Struct(cgsl_complex, 0, free, res);
|
217
|
+
GSL_SET_REAL(&z, NUM2DBL(b));
|
218
|
+
GSL_SET_IMAG(&z, 0.0);
|
219
|
+
*res = gsl_complex_poly_complex_eval(zc, coef->size, z);
|
220
|
+
break;
|
221
|
+
case T_ARRAY:
|
222
|
+
ret = rb_ary_new2(RARRAY_LEN(b));
|
223
|
+
for (i = 0; i < RARRAY_LEN(b); i++) {
|
224
|
+
Data_Get_Struct(rb_ary_entry(b, i), gsl_complex, zx);
|
225
|
+
res = (gsl_complex*) malloc(sizeof(gsl_complex));
|
226
|
+
*res = gsl_complex_poly_complex_eval(zc, N, *zx);
|
227
|
+
rb_ary_store(ret, i, Data_Wrap_Struct(cgsl_complex, 0, free, res));
|
228
|
+
}
|
229
|
+
break;
|
230
|
+
default:
|
231
|
+
if (rb_obj_is_kind_of(b, cgsl_complex)) {
|
232
|
+
res = (gsl_complex*) malloc(sizeof(gsl_complex));
|
233
|
+
ret = Data_Wrap_Struct(cgsl_complex, 0, free, res);
|
234
|
+
Data_Get_Struct(b, gsl_complex, zx);
|
235
|
+
*res = gsl_complex_poly_complex_eval(zc, N, *zx);
|
236
|
+
} else if (rb_obj_is_kind_of(b, cgsl_vector_complex)) {
|
237
|
+
Data_Get_Struct(b, gsl_vector_complex, zb);
|
238
|
+
vnew = gsl_vector_complex_alloc(zb->size);
|
239
|
+
ret = Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
|
240
|
+
for (i = 0; i < zb->size; i++) {
|
241
|
+
z = gsl_vector_complex_get(zb, i);
|
242
|
+
gsl_vector_complex_set(vnew, i, gsl_complex_poly_complex_eval(zc, N, z));
|
243
|
+
}
|
244
|
+
} else {
|
245
|
+
rb_raise(rb_eTypeError, "Wrong argument type %s.\n", rb_class2name(CLASS_OF(b)));
|
246
|
+
}
|
247
|
+
}
|
248
|
+
if (flag == 1) free(zc);
|
249
|
+
return ret;
|
250
|
+
}
|
251
|
+
#endif
|
252
|
+
#endif
|
253
|
+
|
254
|
+
static VALUE FUNCTION(rb_gsl_poly,eval)(VALUE obj, VALUE xx)
|
255
|
+
{
|
256
|
+
GSL_TYPE(gsl_poly) *p = NULL;
|
257
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
258
|
+
GSL_TYPE(gsl_matrix) *m = NULL;
|
259
|
+
gsl_vector *vnew = NULL;
|
260
|
+
gsl_matrix *mnew = NULL;
|
261
|
+
VALUE x, ary;
|
262
|
+
size_t i, j;
|
263
|
+
#ifdef BASE_DOUBLE
|
264
|
+
#ifdef HAVE_NARRAY_H
|
265
|
+
struct NARRAY *na;
|
266
|
+
double *ptr1, *ptr2;
|
267
|
+
size_t n;
|
268
|
+
#endif
|
269
|
+
#ifdef GSL_1_11_LATER
|
270
|
+
gsl_complex *z, zz;
|
271
|
+
gsl_vector_complex *vz, *vznew;
|
272
|
+
#endif
|
273
|
+
#endif
|
274
|
+
|
275
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_poly), p);
|
276
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
277
|
+
switch (TYPE(xx)) {
|
278
|
+
case T_FIXNUM:
|
279
|
+
case T_BIGNUM:
|
280
|
+
case T_FLOAT:
|
281
|
+
return rb_float_new(FUNCTION(gsl_poly,eval)(p->data, p->size, NUM2DBL(xx)));
|
282
|
+
break;
|
283
|
+
case T_ARRAY:
|
284
|
+
ary = rb_ary_new2(RARRAY_LEN(xx));
|
285
|
+
for (i = 0; i < RARRAY_LEN(xx); i++) {
|
286
|
+
x = rb_ary_entry(xx, i);
|
287
|
+
Need_Float(x);
|
288
|
+
rb_ary_store(ary, i, rb_float_new(FUNCTION(gsl_poly,eval)(p->data, p->size, NUM2DBL(x))));
|
289
|
+
}
|
290
|
+
return ary;
|
291
|
+
break;
|
292
|
+
default:
|
293
|
+
#ifdef BASE_DOUBLE
|
294
|
+
#ifdef HAVE_NARRAY_H
|
295
|
+
if (NA_IsNArray(xx)) {
|
296
|
+
GetNArray(xx, na);
|
297
|
+
ptr1 = (double*) na->ptr;
|
298
|
+
n = na->total;
|
299
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
300
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
301
|
+
for (i = 0; i < n; i++) ptr2[i] = FUNCTION(gsl_poly,eval)(p->data,p->size,ptr1[i]);
|
302
|
+
return ary;
|
303
|
+
}
|
304
|
+
#endif
|
305
|
+
#endif
|
306
|
+
if (VEC_P(xx)) {
|
307
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
|
308
|
+
vnew = gsl_vector_alloc(v->size);
|
309
|
+
for (i = 0; i < v->size; i++) {
|
310
|
+
gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_vector,get)(v, i)));
|
311
|
+
}
|
312
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
313
|
+
} else if (MAT_P(xx)) {
|
314
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
|
315
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
316
|
+
for (i = 0; i < m->size1; i++) {
|
317
|
+
for (j = 0; j < m->size2; j++) {
|
318
|
+
gsl_matrix_set(mnew, i, j,
|
319
|
+
FUNCTION(gsl_poly,eval)(p->data, p->size, FUNCTION(gsl_matrix,get)(m, i, j)));
|
320
|
+
}
|
321
|
+
}
|
322
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
323
|
+
#ifdef BASE_DOUBLE
|
324
|
+
#ifdef GSL_1_11_LATER
|
325
|
+
} else if (rb_obj_is_kind_of(xx, cgsl_complex)) {
|
326
|
+
Data_Get_Struct(xx, gsl_complex, z);
|
327
|
+
zz = gsl_poly_complex_eval(p->data, p->size, *z);
|
328
|
+
z = make_complex(GSL_REAL(zz), GSL_IMAG(zz));
|
329
|
+
return Data_Wrap_Struct(cgsl_complex, 0, free, z);
|
330
|
+
} else if (rb_obj_is_kind_of(xx, cgsl_vector_complex)) {
|
331
|
+
Data_Get_Struct(xx, gsl_vector_complex, vz);
|
332
|
+
vznew = gsl_vector_complex_alloc(vz->size);
|
333
|
+
for (i = 0; i < vz->size; i++) {
|
334
|
+
zz = gsl_poly_complex_eval(p->data, p->size, gsl_vector_complex_get(vz, i));
|
335
|
+
gsl_vector_complex_set(vznew, i, zz);
|
336
|
+
}
|
337
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vznew);
|
338
|
+
#endif
|
339
|
+
#endif
|
340
|
+
} else {
|
341
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
342
|
+
}
|
343
|
+
break;
|
344
|
+
}
|
345
|
+
return Qnil; /* never reach here */
|
346
|
+
}
|
347
|
+
|
348
|
+
/* singleton method */
|
349
|
+
static VALUE FUNCTION(rb_gsl_poly,eval2)(int argc, VALUE *argv, VALUE obj)
|
350
|
+
{
|
351
|
+
GSL_TYPE(gsl_poly) *p = NULL;
|
352
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
353
|
+
GSL_TYPE(gsl_matrix) *m = NULL;
|
354
|
+
gsl_vector *vnew = NULL;
|
355
|
+
gsl_matrix *mnew = NULL;
|
356
|
+
VALUE xx, x, ary;
|
357
|
+
size_t i, j, size;
|
358
|
+
#ifdef BASE_DOUBLE
|
359
|
+
#ifdef HAVE_NARRAY_H
|
360
|
+
struct NARRAY *na;
|
361
|
+
double *ptr1, *ptr2;
|
362
|
+
#endif
|
363
|
+
#endif
|
364
|
+
switch (argc) {
|
365
|
+
case 2:
|
366
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), p);
|
367
|
+
size = p->size;
|
368
|
+
xx = argv[1];
|
369
|
+
break;
|
370
|
+
case 3:
|
371
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), p);
|
372
|
+
size = FIX2INT(argv[1]);
|
373
|
+
xx = argv[2];
|
374
|
+
break;
|
375
|
+
default:
|
376
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
|
377
|
+
break;
|
378
|
+
}
|
379
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
380
|
+
switch (TYPE(xx)) {
|
381
|
+
case T_FIXNUM:
|
382
|
+
case T_BIGNUM:
|
383
|
+
case T_FLOAT:
|
384
|
+
return rb_float_new(FUNCTION(gsl_poly,eval)(p->data, size, NUM2DBL(xx)));
|
385
|
+
break;
|
386
|
+
case T_ARRAY:
|
387
|
+
ary = rb_ary_new2(RARRAY_LEN(xx));
|
388
|
+
for (i = 0; i < RARRAY_LEN(xx); i++) {
|
389
|
+
x = rb_ary_entry(xx, i);
|
390
|
+
Need_Float(x);
|
391
|
+
rb_ary_store(ary, i, rb_float_new(FUNCTION(gsl_poly,eval)(p->data, size, NUM2DBL(x))));
|
392
|
+
}
|
393
|
+
return ary;
|
394
|
+
break;
|
395
|
+
default:
|
396
|
+
#ifdef BASE_DOUBLE
|
397
|
+
#ifdef HAVE_NARRAY_H
|
398
|
+
if (NA_IsNArray(xx)) {
|
399
|
+
GetNArray(xx, na);
|
400
|
+
ptr1 = (double*) na->ptr;
|
401
|
+
size = na->total;
|
402
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
403
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
404
|
+
for (i = 0; i < size; i++) ptr2[i] = FUNCTION(gsl_poly,eval)(p->data,p->size,ptr1[i]);
|
405
|
+
return ary;
|
406
|
+
}
|
407
|
+
#endif
|
408
|
+
#endif
|
409
|
+
if (VEC_P(xx)) {
|
410
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
|
411
|
+
vnew = gsl_vector_alloc(v->size);
|
412
|
+
for (i = 0; i < v->size; i++) {
|
413
|
+
gsl_vector_set(vnew, i, FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_vector,get)(v, i)));
|
414
|
+
}
|
415
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
416
|
+
} else if (MAT_P(xx)) {
|
417
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
|
418
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
419
|
+
for (i = 0; i < m->size1; i++) {
|
420
|
+
for (j = 0; j < m->size2; j++) {
|
421
|
+
gsl_matrix_set(mnew, i, j,
|
422
|
+
FUNCTION(gsl_poly,eval)(p->data, size, FUNCTION(gsl_matrix,get)(m, i, j)));
|
423
|
+
}
|
424
|
+
}
|
425
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
426
|
+
} else {
|
427
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
428
|
+
}
|
429
|
+
break;
|
430
|
+
}
|
431
|
+
return Qnil; /* never reach here */
|
432
|
+
}
|
433
|
+
|
434
|
+
/* ax*x + bx + c = 0 */
|
435
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_quadratic)(int argc, VALUE *argv, VALUE obj)
|
436
|
+
{
|
437
|
+
double x0, x1;
|
438
|
+
GSL_TYPE(gsl_poly) *v = NULL;
|
439
|
+
gsl_vector *r;
|
440
|
+
int n;
|
441
|
+
switch (argc) {
|
442
|
+
case 3:
|
443
|
+
n = gsl_poly_solve_quadratic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
|
444
|
+
&x0, &x1);
|
445
|
+
break;
|
446
|
+
case 1:
|
447
|
+
switch (TYPE(argv[0])) {
|
448
|
+
case T_ARRAY:
|
449
|
+
n = gsl_poly_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
450
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
451
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
452
|
+
&x0, &x1);
|
453
|
+
break;
|
454
|
+
default:
|
455
|
+
CHECK_VEC(argv[0]);
|
456
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_poly), v);
|
457
|
+
n = gsl_poly_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
|
458
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
459
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
460
|
+
&x0, &x1);
|
461
|
+
break;
|
462
|
+
}
|
463
|
+
break;
|
464
|
+
default:
|
465
|
+
rb_raise(rb_eArgError,
|
466
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
467
|
+
break;
|
468
|
+
}
|
469
|
+
// If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
|
470
|
+
// empty, so just return an empty Array.
|
471
|
+
if(n == 0) {
|
472
|
+
return rb_ary_new();
|
473
|
+
}
|
474
|
+
r = gsl_vector_alloc(n);
|
475
|
+
switch(n) {
|
476
|
+
case 2: gsl_vector_set(r, 1, x1); /* fall through */
|
477
|
+
case 1: gsl_vector_set(r, 0, x0);
|
478
|
+
}
|
479
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
480
|
+
}
|
481
|
+
|
482
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic)(int argc, VALUE *argv, VALUE obj)
|
483
|
+
{
|
484
|
+
gsl_complex z0, z1;
|
485
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
486
|
+
gsl_vector_complex *r = NULL;
|
487
|
+
int n;
|
488
|
+
switch (argc) {
|
489
|
+
case 3:
|
490
|
+
n = gsl_poly_complex_solve_quadratic(NUMCONV2(argv[0]),
|
491
|
+
NUMCONV2(argv[1]), NUMCONV2(argv[2]),
|
492
|
+
&z0, &z1);
|
493
|
+
break;
|
494
|
+
case 1:
|
495
|
+
switch (TYPE(argv[0])) {
|
496
|
+
case T_ARRAY:
|
497
|
+
n = gsl_poly_complex_solve_quadratic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
498
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
499
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
500
|
+
&z0, &z1);
|
501
|
+
break;
|
502
|
+
default:
|
503
|
+
CHECK_VEC(argv[0]);
|
504
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
505
|
+
n = gsl_poly_complex_solve_quadratic(FUNCTION(gsl_vector,get)(v, 0),
|
506
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
507
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
508
|
+
&z0, &z1);
|
509
|
+
break;
|
510
|
+
}
|
511
|
+
break;
|
512
|
+
default:
|
513
|
+
rb_raise(rb_eArgError,
|
514
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
515
|
+
break;
|
516
|
+
}
|
517
|
+
// If n == 0, we want to return an empty gsl_vector, but gsl_vectors can'y be
|
518
|
+
// empty, so just return an empty Array.
|
519
|
+
if(n == 0) {
|
520
|
+
return rb_ary_new();
|
521
|
+
}
|
522
|
+
r = gsl_vector_complex_alloc(n);
|
523
|
+
switch(n) {
|
524
|
+
case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
|
525
|
+
case 1: gsl_vector_complex_set(r, 0, z0);
|
526
|
+
}
|
527
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
528
|
+
}
|
529
|
+
|
530
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_cubic)(int argc, VALUE *argv, VALUE obj)
|
531
|
+
{
|
532
|
+
double x0, x1, x2;
|
533
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
534
|
+
gsl_vector *r = NULL;
|
535
|
+
int n;
|
536
|
+
switch (argc) {
|
537
|
+
case 3:
|
538
|
+
n = gsl_poly_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
|
539
|
+
&x0, &x1, &x2);
|
540
|
+
break;
|
541
|
+
case 1:
|
542
|
+
switch (TYPE(argv[0])) {
|
543
|
+
case T_ARRAY:
|
544
|
+
n = gsl_poly_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
545
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
546
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
547
|
+
&x0, &x1, &x2);
|
548
|
+
break;
|
549
|
+
default:
|
550
|
+
CHECK_VEC(argv[0]);
|
551
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
552
|
+
n = gsl_poly_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
|
553
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
554
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
555
|
+
&x0, &x1, &x2);
|
556
|
+
break;
|
557
|
+
}
|
558
|
+
break;
|
559
|
+
default:
|
560
|
+
rb_raise(rb_eArgError,
|
561
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
562
|
+
break;
|
563
|
+
}
|
564
|
+
r = gsl_vector_alloc(n);
|
565
|
+
switch(n) {
|
566
|
+
case 3: gsl_vector_set(r, 2, x2); /* fall through */
|
567
|
+
case 2: gsl_vector_set(r, 1, x1); /* fall through */
|
568
|
+
case 1: gsl_vector_set(r, 0, x0);
|
569
|
+
}
|
570
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
571
|
+
}
|
572
|
+
|
573
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic)(int argc, VALUE *argv, VALUE obj)
|
574
|
+
{
|
575
|
+
gsl_complex z0, z1, z2;
|
576
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
577
|
+
gsl_vector_complex *r = NULL;
|
578
|
+
int n;
|
579
|
+
switch (argc) {
|
580
|
+
case 3:
|
581
|
+
n = gsl_poly_complex_solve_cubic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
|
582
|
+
&z0, &z1, &z2);
|
583
|
+
break;
|
584
|
+
case 1:
|
585
|
+
switch (TYPE(argv[0])) {
|
586
|
+
case T_ARRAY:
|
587
|
+
n = gsl_poly_complex_solve_cubic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
588
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
589
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
590
|
+
&z0, &z1, &z2);
|
591
|
+
break;
|
592
|
+
default:
|
593
|
+
CHECK_VEC(argv[0]);
|
594
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
595
|
+
n = gsl_poly_complex_solve_cubic(FUNCTION(gsl_vector,get)(v, 0),
|
596
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
597
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
598
|
+
&z0, &z1, &z2);
|
599
|
+
break;
|
600
|
+
}
|
601
|
+
break;
|
602
|
+
default:
|
603
|
+
rb_raise(rb_eArgError,
|
604
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
605
|
+
break;
|
606
|
+
}
|
607
|
+
r = gsl_vector_complex_alloc(n);
|
608
|
+
switch(n) {
|
609
|
+
case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
|
610
|
+
case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
|
611
|
+
case 1: gsl_vector_complex_set(r, 0, z0);
|
612
|
+
}
|
613
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
614
|
+
}
|
615
|
+
|
616
|
+
#ifdef HAVE_POLY_SOLVE_QUARTIC
|
617
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_quartic)(int argc, VALUE *argv, VALUE obj)
|
618
|
+
{
|
619
|
+
double x0, x1, x2, x3;
|
620
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
621
|
+
gsl_vector *r = NULL;
|
622
|
+
int n;
|
623
|
+
switch (argc) {
|
624
|
+
case 4:
|
625
|
+
n = gsl_poly_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]), NUMCONV2(argv[2]),
|
626
|
+
NUMCONV2(argv[3]),
|
627
|
+
&x0, &x1, &x2, &x3);
|
628
|
+
break;
|
629
|
+
case 1:
|
630
|
+
switch (TYPE(argv[0])) {
|
631
|
+
case T_ARRAY:
|
632
|
+
n = gsl_poly_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
633
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
634
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
635
|
+
NUMCONV2(rb_ary_entry(argv[0], 3)),
|
636
|
+
&x0, &x1, &x2, &x3);
|
637
|
+
break;
|
638
|
+
default:
|
639
|
+
CHECK_VEC(argv[0]);
|
640
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
641
|
+
n = gsl_poly_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
|
642
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
643
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
644
|
+
FUNCTION(gsl_vector,get)(v, 3),
|
645
|
+
&x0, &x1, &x2, &x3);
|
646
|
+
break;
|
647
|
+
}
|
648
|
+
break;
|
649
|
+
default:
|
650
|
+
rb_raise(rb_eArgError,
|
651
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
652
|
+
break;
|
653
|
+
}
|
654
|
+
r = gsl_vector_alloc(n);
|
655
|
+
switch(n) {
|
656
|
+
case 4: gsl_vector_set(r, 3, x3); /* fall through */
|
657
|
+
case 3: gsl_vector_set(r, 2, x2); /* fall through */
|
658
|
+
case 2: gsl_vector_set(r, 1, x1); /* fall through */
|
659
|
+
case 1: gsl_vector_set(r, 0, x0);
|
660
|
+
}
|
661
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
662
|
+
}
|
663
|
+
|
664
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic)(int argc, VALUE *argv, VALUE obj)
|
665
|
+
{
|
666
|
+
gsl_complex z0, z1, z2, z3;
|
667
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
668
|
+
gsl_vector_complex *r = NULL;
|
669
|
+
int n;
|
670
|
+
switch (argc) {
|
671
|
+
case 4:
|
672
|
+
n = gsl_poly_complex_solve_quartic(NUMCONV2(argv[0]), NUMCONV2(argv[1]),
|
673
|
+
NUMCONV2(argv[2]), NUMCONV2(argv[3]),
|
674
|
+
&z0, &z1, &z2, &z3);
|
675
|
+
break;
|
676
|
+
case 1:
|
677
|
+
switch (TYPE(argv[0])) {
|
678
|
+
case T_ARRAY:
|
679
|
+
n = gsl_poly_complex_solve_quartic(NUMCONV2(rb_ary_entry(argv[0], 0)),
|
680
|
+
NUMCONV2(rb_ary_entry(argv[0], 1)),
|
681
|
+
NUMCONV2(rb_ary_entry(argv[0], 2)),
|
682
|
+
NUMCONV2(rb_ary_entry(argv[0], 3)),
|
683
|
+
&z0, &z1, &z2, &z3);
|
684
|
+
break;
|
685
|
+
default:
|
686
|
+
CHECK_VEC(argv[0]);
|
687
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
688
|
+
n = gsl_poly_complex_solve_quartic(FUNCTION(gsl_vector,get)(v, 0),
|
689
|
+
FUNCTION(gsl_vector,get)(v, 1),
|
690
|
+
FUNCTION(gsl_vector,get)(v, 2),
|
691
|
+
FUNCTION(gsl_vector,get)(v, 3),
|
692
|
+
&z0, &z1, &z2, &z3);
|
693
|
+
break;
|
694
|
+
}
|
695
|
+
break;
|
696
|
+
default:
|
697
|
+
rb_raise(rb_eArgError,
|
698
|
+
"wrong number of arguments (3 numbers or 1 array or 1 vector)");
|
699
|
+
break;
|
700
|
+
}
|
701
|
+
r = gsl_vector_complex_alloc(n);
|
702
|
+
switch(n) {
|
703
|
+
case 4: gsl_vector_complex_set(r, 0, z0); /* fall through */
|
704
|
+
case 3: gsl_vector_complex_set(r, 1, z1); /* fall through */
|
705
|
+
case 2: gsl_vector_complex_set(r, 2, z2); /* fall through */
|
706
|
+
case 1: gsl_vector_complex_set(r, 3, z3);
|
707
|
+
}
|
708
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
709
|
+
}
|
710
|
+
|
711
|
+
#endif
|
712
|
+
/* singleton method */
|
713
|
+
VALUE FUNCTION(rb_gsl_poly,complex_solve)(int argc, VALUE *argv, VALUE obj)
|
714
|
+
{
|
715
|
+
int size = -1, size2;
|
716
|
+
gsl_poly_complex_workspace *w = NULL;
|
717
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
718
|
+
gsl_vector *a = NULL, *z = NULL;
|
719
|
+
gsl_complex c;
|
720
|
+
gsl_vector_complex *r = NULL;
|
721
|
+
int i, flag = 0;
|
722
|
+
// local variable "status" declared and set, but never used
|
723
|
+
//int status;
|
724
|
+
|
725
|
+
switch (argc) {
|
726
|
+
case 1:
|
727
|
+
break;
|
728
|
+
case 2:
|
729
|
+
if (TYPE(argv[1]) == T_FIXNUM) size = FIX2INT(argv[1]);
|
730
|
+
break;
|
731
|
+
case 3:
|
732
|
+
if (TYPE(argv[1]) == T_FIXNUM) size = FIX2INT(argv[1]);
|
733
|
+
break;
|
734
|
+
default:
|
735
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-3)", argc);
|
736
|
+
break;
|
737
|
+
}
|
738
|
+
|
739
|
+
switch (TYPE(argv[0])) {
|
740
|
+
case T_ARRAY:
|
741
|
+
if (size < 0) size = RARRAY_LEN(argv[0]);
|
742
|
+
a = gsl_vector_alloc(size);
|
743
|
+
for (i = 0; i < size; i++) gsl_vector_set(a, i, NUMCONV2(rb_ary_entry(argv[0], i)));
|
744
|
+
break;
|
745
|
+
case T_FIXNUM:
|
746
|
+
case T_BIGNUM:
|
747
|
+
case T_FLOAT:
|
748
|
+
if (rb_obj_is_kind_of(argv[argc-1], cgsl_poly_workspace)) size = argc - 1;
|
749
|
+
else size = argc;
|
750
|
+
a = gsl_vector_alloc(size);
|
751
|
+
for (i = 0; i < size; i++) gsl_vector_set(a, i, NUMCONV2(argv[i]));
|
752
|
+
break;
|
753
|
+
default:
|
754
|
+
if (rb_obj_is_kind_of(argv[0], GSL_TYPE(cgsl_vector))) {
|
755
|
+
Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
|
756
|
+
if (size < 0) size = v->size;
|
757
|
+
} else {
|
758
|
+
rb_raise(rb_eTypeError, "wrong argument type (Array, Vector, or Numeric expected");
|
759
|
+
}
|
760
|
+
a = gsl_vector_alloc(v->size);
|
761
|
+
for (i = 0; i < size; i++) gsl_vector_set(a, i, FUNCTION(gsl_vector,get)(v, i));
|
762
|
+
break;
|
763
|
+
}
|
764
|
+
size2 = 2*(size - 1);
|
765
|
+
z = gsl_vector_alloc(size2);
|
766
|
+
if (rb_obj_is_kind_of(argv[argc-1], cgsl_poly_workspace)
|
767
|
+
|| rb_obj_is_kind_of(argv[argc-1], cgsl_poly_complex_workspace)) {
|
768
|
+
Data_Get_Struct(argv[argc-1], gsl_poly_complex_workspace, w);
|
769
|
+
flag = 0;
|
770
|
+
} else {
|
771
|
+
w = gsl_poly_complex_workspace_alloc(size);
|
772
|
+
flag = 1;
|
773
|
+
}
|
774
|
+
/*status =*/ gsl_poly_complex_solve(a->data, size, w, z->data);
|
775
|
+
|
776
|
+
if (flag == 1) gsl_poly_complex_workspace_free(w);
|
777
|
+
gsl_vector_free(a);
|
778
|
+
r = gsl_vector_complex_alloc(size - 1);
|
779
|
+
for (i = 0; i < size - 1; i++) {
|
780
|
+
c.dat[0] = gsl_vector_get(z, i*2);
|
781
|
+
c.dat[1] = gsl_vector_get(z, i*2+1);
|
782
|
+
gsl_vector_complex_set(r, i, c);
|
783
|
+
}
|
784
|
+
gsl_vector_free(z);
|
785
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
786
|
+
}
|
787
|
+
|
788
|
+
|
789
|
+
/* a2 x*x + a1 x + a0 = 0 */
|
790
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_quadratic2)(VALUE obj)
|
791
|
+
{
|
792
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
793
|
+
gsl_vector *r = NULL;
|
794
|
+
gsl_vector_complex *r2 = NULL;
|
795
|
+
double a2, a1, a0;
|
796
|
+
double d; /* determinant */
|
797
|
+
double x0, x1;
|
798
|
+
int n;
|
799
|
+
gsl_complex z0, z1;
|
800
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
801
|
+
if (v->size < 3) {
|
802
|
+
rb_raise(rb_eArgError, "the order of the object is less than 3.");
|
803
|
+
}
|
804
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2); /* coefficients */
|
805
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1);
|
806
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0);
|
807
|
+
d = a1*a1 - 4.0*a2*a0; /* determinant */
|
808
|
+
if (d >= 0.0) {
|
809
|
+
n = gsl_poly_solve_quadratic(a2, a1, a0, &x0, &x1);
|
810
|
+
r = gsl_vector_alloc(n);
|
811
|
+
switch(n) {
|
812
|
+
case 2: gsl_vector_set(r, 1, x1); /* fall through */
|
813
|
+
case 1: gsl_vector_set(r, 0, x0);
|
814
|
+
}
|
815
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
816
|
+
} else {
|
817
|
+
n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
|
818
|
+
r2 = gsl_vector_complex_alloc(n);
|
819
|
+
switch(n) {
|
820
|
+
case 2: gsl_vector_complex_set(r2, 1, z1); /* fall through */
|
821
|
+
case 1: gsl_vector_complex_set(r2, 0, z0);
|
822
|
+
}
|
823
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r2);
|
824
|
+
}
|
825
|
+
|
826
|
+
}
|
827
|
+
|
828
|
+
|
829
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_quadratic2)(VALUE obj)
|
830
|
+
{
|
831
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
832
|
+
gsl_vector_complex *r = NULL;
|
833
|
+
double a2, a1, a0;
|
834
|
+
int n;
|
835
|
+
gsl_complex z0, z1;
|
836
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
837
|
+
if (v->size < 3) {
|
838
|
+
rb_raise(rb_eArgError, "the order of the object is less than 3.");
|
839
|
+
}
|
840
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2); /* coefficients */
|
841
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1);
|
842
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0);
|
843
|
+
n = gsl_poly_complex_solve_quadratic(a2, a1, a0, &z0, &z1);
|
844
|
+
r = gsl_vector_complex_alloc(n);
|
845
|
+
switch(n) {
|
846
|
+
case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
|
847
|
+
case 1: gsl_vector_complex_set(r, 0, z0);
|
848
|
+
}
|
849
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
850
|
+
}
|
851
|
+
|
852
|
+
/* x**3 + a2 x**2 + a1 x + a0 = 0 */
|
853
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_cubic2)(VALUE obj)
|
854
|
+
{
|
855
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
856
|
+
gsl_vector *r = NULL;
|
857
|
+
double a3, a2, a1, a0;
|
858
|
+
double x0, x1, x2;
|
859
|
+
int n;
|
860
|
+
|
861
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
862
|
+
if (v->size < 4) {
|
863
|
+
rb_raise(rb_eArgError, "the order of the object is less than 4.");
|
864
|
+
}
|
865
|
+
a3 = FUNCTION(gsl_vector,get)(v, 3);
|
866
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2)/a3; /* coefficients */
|
867
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
|
868
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
|
869
|
+
n = gsl_poly_solve_cubic(a2, a1, a0, &x0, &x1, &x2);
|
870
|
+
r = gsl_vector_alloc(n);
|
871
|
+
switch(n) {
|
872
|
+
case 3: gsl_vector_set(r, 2, x2); /* fall through */
|
873
|
+
case 2: gsl_vector_set(r, 1, x1); /* fall through */
|
874
|
+
case 1: gsl_vector_set(r, 0, x0);
|
875
|
+
}
|
876
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
877
|
+
}
|
878
|
+
|
879
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_cubic2)(VALUE obj)
|
880
|
+
{
|
881
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
882
|
+
gsl_vector_complex *r = NULL;
|
883
|
+
double a3, a2, a1, a0;
|
884
|
+
int n;
|
885
|
+
gsl_complex z0, z1, z2;
|
886
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
887
|
+
if (v->size < 4) {
|
888
|
+
rb_raise(rb_eArgError, "the order of the object is less than 4.");
|
889
|
+
}
|
890
|
+
a3 = FUNCTION(gsl_vector,get)(v, 3);
|
891
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2)/a3; /* coefficients */
|
892
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1)/a3;
|
893
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0)/a3;
|
894
|
+
n = gsl_poly_complex_solve_cubic(a2, a1, a0, &z0, &z1, &z2);
|
895
|
+
r = gsl_vector_complex_alloc(n);
|
896
|
+
switch(n) {
|
897
|
+
case 3: gsl_vector_complex_set(r, 2, z2); /* fall through */
|
898
|
+
case 2: gsl_vector_complex_set(r, 1, z1); /* fall through */
|
899
|
+
case 1: gsl_vector_complex_set(r, 0, z0);
|
900
|
+
}
|
901
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
902
|
+
}
|
903
|
+
|
904
|
+
#ifdef HAVE_POLY_SOLVE_QUARTIC
|
905
|
+
/* a4 x**4 + a3 x**3 + a2 x**2 + a1 x + a0 = 0 */
|
906
|
+
static VALUE FUNCTION(rb_gsl_poly,solve_quartic2)(VALUE obj)
|
907
|
+
{
|
908
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
909
|
+
gsl_vector *r = NULL;
|
910
|
+
double a4, a3, a2, a1, a0;
|
911
|
+
double x0, x1, x2, x3;
|
912
|
+
int n;
|
913
|
+
|
914
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
915
|
+
if (v->size < 5) {
|
916
|
+
rb_raise(rb_eArgError, "the order of the object is less than 4.");
|
917
|
+
}
|
918
|
+
a4 = FUNCTION(gsl_vector,get)(v, 4);
|
919
|
+
a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
|
920
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2)/a4; /* coefficients */
|
921
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
|
922
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
|
923
|
+
n = gsl_poly_solve_quartic(a3, a2, a1, a0, &x0, &x1, &x2, &x3);
|
924
|
+
r = gsl_vector_alloc(3);
|
925
|
+
r = gsl_vector_alloc(4);
|
926
|
+
gsl_vector_set(r, 0, x0);
|
927
|
+
gsl_vector_set(r, 1, x1);
|
928
|
+
gsl_vector_set(r, 2, x2);
|
929
|
+
gsl_vector_set(r, 3, x3);
|
930
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, r);
|
931
|
+
}
|
932
|
+
|
933
|
+
static VALUE FUNCTION(rb_gsl_poly,complex_solve_quartic2)(VALUE obj)
|
934
|
+
{
|
935
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
936
|
+
gsl_vector_complex *r = NULL;
|
937
|
+
double a4, a3, a2, a1, a0;
|
938
|
+
int n;
|
939
|
+
gsl_complex z0, z1, z2, z3;
|
940
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
941
|
+
if (v->size < 5) {
|
942
|
+
rb_raise(rb_eArgError, "the order of the object is less than 4.");
|
943
|
+
}
|
944
|
+
a4 = FUNCTION(gsl_vector,get)(v, 4);
|
945
|
+
a3 = FUNCTION(gsl_vector,get)(v, 3)/a4;
|
946
|
+
a2 = FUNCTION(gsl_vector,get)(v, 2)/a4; /* coefficients */
|
947
|
+
a1 = FUNCTION(gsl_vector,get)(v, 1)/a4;
|
948
|
+
a0 = FUNCTION(gsl_vector,get)(v, 0)/a4;
|
949
|
+
n = gsl_poly_complex_solve_quartic(a3, a2, a1, a0, &z0, &z1, &z2, &z3);
|
950
|
+
r = gsl_vector_complex_alloc(4);
|
951
|
+
gsl_vector_complex_set(r, 0, z0);
|
952
|
+
gsl_vector_complex_set(r, 1, z1);
|
953
|
+
gsl_vector_complex_set(r, 2, z2);
|
954
|
+
gsl_vector_complex_set(r, 3, z3);
|
955
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
956
|
+
}
|
957
|
+
|
958
|
+
#endif
|
959
|
+
|
960
|
+
/* method */
|
961
|
+
VALUE FUNCTION(rb_gsl_poly,complex_solve2)(int argc, VALUE *argv, VALUE obj)
|
962
|
+
{
|
963
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
964
|
+
gsl_vector *a = NULL, *z = NULL;
|
965
|
+
size_t size, size2, i;
|
966
|
+
gsl_poly_complex_workspace *w = NULL;
|
967
|
+
gsl_complex c;
|
968
|
+
gsl_vector_complex *r = NULL;
|
969
|
+
int flag = 0;
|
970
|
+
// local variable "status" declared and set, but never used
|
971
|
+
//int status;
|
972
|
+
|
973
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
974
|
+
size = v->size;
|
975
|
+
size2 = 2*(size - 1);
|
976
|
+
z = gsl_vector_alloc(size2);
|
977
|
+
a = gsl_vector_alloc(v->size);
|
978
|
+
for (i = 0; i < v->size; i++) {
|
979
|
+
gsl_vector_set(a, i, FUNCTION(gsl_vector,get)(v, i));
|
980
|
+
}
|
981
|
+
|
982
|
+
if (argc == 1 && rb_obj_is_kind_of(argv[0], cgsl_poly_workspace)) {
|
983
|
+
Data_Get_Struct(argv[0], gsl_poly_complex_workspace, w);
|
984
|
+
flag = 0;
|
985
|
+
} else {
|
986
|
+
w = gsl_poly_complex_workspace_alloc(size);
|
987
|
+
flag = 1;
|
988
|
+
}
|
989
|
+
|
990
|
+
/*status =*/ gsl_poly_complex_solve(a->data, size, w, z->data);
|
991
|
+
|
992
|
+
r = gsl_vector_complex_alloc(size - 1);
|
993
|
+
for (i = 0; i < size - 1; i++) {
|
994
|
+
c.dat[0] = gsl_vector_get(z, i*2);
|
995
|
+
c.dat[1] = gsl_vector_get(z, i*2+1);
|
996
|
+
gsl_vector_complex_set(r, i, c);
|
997
|
+
}
|
998
|
+
gsl_vector_free(a);
|
999
|
+
gsl_vector_free(z);
|
1000
|
+
if (flag == 1) gsl_poly_complex_workspace_free(w);
|
1001
|
+
return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, r);
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
#ifdef BASE_INT
|
1005
|
+
static VALUE rb_gsl_poly_int_to_f(VALUE obj)
|
1006
|
+
{
|
1007
|
+
gsl_vector *v;
|
1008
|
+
gsl_vector_int *vi;
|
1009
|
+
size_t i;
|
1010
|
+
Data_Get_Struct(obj, gsl_vector_int, vi);
|
1011
|
+
v = gsl_vector_alloc(vi->size);
|
1012
|
+
for (i = 0; i < v->size; i++)
|
1013
|
+
gsl_vector_set(v, i, (double) gsl_vector_int_get(vi, i));
|
1014
|
+
return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v);
|
1015
|
+
}
|
1016
|
+
#endif
|
1017
|
+
|
1018
|
+
#ifdef BASE_DOUBLE
|
1019
|
+
static VALUE rb_gsl_poly_to_i(VALUE obj)
|
1020
|
+
{
|
1021
|
+
gsl_vector *v;
|
1022
|
+
gsl_vector_int *vi;
|
1023
|
+
size_t i;
|
1024
|
+
Data_Get_Struct(obj, gsl_vector, v);
|
1025
|
+
vi = gsl_vector_int_alloc(v->size);
|
1026
|
+
for (i = 0; i < v->size; i++)
|
1027
|
+
gsl_vector_int_set(vi, i, (int) gsl_vector_get(v, i));
|
1028
|
+
return Data_Wrap_Struct(cgsl_poly_int, 0, gsl_vector_int_free, vi);
|
1029
|
+
}
|
1030
|
+
|
1031
|
+
static VALUE FUNCTION(rb_gsl_poly,workspace_new)(VALUE klass, VALUE n)
|
1032
|
+
{
|
1033
|
+
gsl_poly_complex_workspace *w = NULL;
|
1034
|
+
w = gsl_poly_complex_workspace_alloc(FIX2INT(n));
|
1035
|
+
return Data_Wrap_Struct(klass, 0, gsl_poly_complex_workspace_free, w);
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
#ifdef GSL_1_1_LATER
|
1039
|
+
|
1040
|
+
/* singleton method of the class Poly */
|
1041
|
+
static VALUE rb_gsl_poly_dd_init(VALUE obj, VALUE vxa, VALUE vya)
|
1042
|
+
{
|
1043
|
+
gsl_vector *xa = NULL, *ya = NULL;
|
1044
|
+
gsl_poly *dd = NULL;
|
1045
|
+
Data_Get_Struct(vxa, gsl_vector, xa);
|
1046
|
+
Data_Get_Struct(vya, gsl_vector, ya);
|
1047
|
+
dd = gsl_vector_alloc(xa->size);
|
1048
|
+
gsl_poly_dd_init(dd->data, xa->data, ya->data, xa->size);
|
1049
|
+
return Data_Wrap_Struct(cgsl_poly_dd, 0, gsl_vector_free, dd);
|
1050
|
+
}
|
1051
|
+
|
1052
|
+
static VALUE rb_gsl_poly_dd_eval(VALUE obj, VALUE xxa, VALUE xx)
|
1053
|
+
{
|
1054
|
+
gsl_vector *v = NULL;
|
1055
|
+
gsl_matrix *m = NULL;
|
1056
|
+
gsl_vector *dd = NULL, *xa, *vnew = NULL;
|
1057
|
+
gsl_matrix *mnew = NULL;
|
1058
|
+
VALUE x, ary;
|
1059
|
+
size_t size, i, j;
|
1060
|
+
Data_Get_Struct(obj, gsl_vector, dd);
|
1061
|
+
CHECK_VECTOR(xxa);
|
1062
|
+
Data_Get_Struct(xxa, gsl_vector, xa);
|
1063
|
+
switch (TYPE(xx)) {
|
1064
|
+
case T_FIXNUM:
|
1065
|
+
case T_BIGNUM:
|
1066
|
+
case T_FLOAT:
|
1067
|
+
return rb_float_new(gsl_poly_dd_eval(dd->data, xa->data, dd->size,
|
1068
|
+
NUM2DBL(xx)));
|
1069
|
+
break;
|
1070
|
+
case T_ARRAY:
|
1071
|
+
size = RARRAY_LEN(xx);
|
1072
|
+
ary = rb_ary_new2(size);
|
1073
|
+
for (i = 0; i < size; i++) {
|
1074
|
+
x = rb_ary_entry(xx, i);
|
1075
|
+
Need_Float(x);
|
1076
|
+
rb_ary_store(ary, i,
|
1077
|
+
rb_float_new(gsl_poly_dd_eval(dd->data, xa->data,
|
1078
|
+
dd->size, NUM2DBL(x))));
|
1079
|
+
}
|
1080
|
+
return ary;
|
1081
|
+
break;
|
1082
|
+
default:
|
1083
|
+
if (VEC_P(xx)) {
|
1084
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_vector), v);
|
1085
|
+
size = v->size;
|
1086
|
+
vnew = gsl_vector_alloc(v->size);
|
1087
|
+
for (i = 0; i < size; i++) {
|
1088
|
+
gsl_vector_set(vnew, i,
|
1089
|
+
gsl_poly_dd_eval(dd->data, xa->data,
|
1090
|
+
dd->size, FUNCTION(gsl_vector,get)(v, i)));
|
1091
|
+
}
|
1092
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
1093
|
+
} else if (MAT_P(xx)) {
|
1094
|
+
Data_Get_Struct(xx, GSL_TYPE(gsl_matrix), m);
|
1095
|
+
size = m->size1;
|
1096
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
1097
|
+
for (i = 0; i < m->size1; i++) {
|
1098
|
+
for (j = 0; j < m->size2; j++) {
|
1099
|
+
gsl_matrix_set(mnew, i, j,
|
1100
|
+
gsl_poly_dd_eval(dd->data, xa->data,
|
1101
|
+
dd->size, gsl_matrix_get(m, i, j)));
|
1102
|
+
}
|
1103
|
+
}
|
1104
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
1105
|
+
} else {
|
1106
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
1107
|
+
}
|
1108
|
+
break;
|
1109
|
+
}
|
1110
|
+
return Qnil; /* never reach here */
|
1111
|
+
}
|
1112
|
+
|
1113
|
+
static VALUE rb_gsl_poly_dd_taylor(int argc, VALUE *argv, VALUE obj)
|
1114
|
+
{
|
1115
|
+
gsl_vector *dd = NULL;
|
1116
|
+
gsl_vector *xa, *c = NULL, *w = NULL;
|
1117
|
+
double xp;
|
1118
|
+
size_t size;
|
1119
|
+
int flag = 0;
|
1120
|
+
Data_Get_Struct(obj, gsl_vector, dd);
|
1121
|
+
switch (argc) {
|
1122
|
+
case 2:
|
1123
|
+
size = dd->size;
|
1124
|
+
xp = NUM2DBL(argv[0]);
|
1125
|
+
CHECK_VECTOR(argv[1]);
|
1126
|
+
Data_Get_Struct(argv[1], gsl_vector, xa);
|
1127
|
+
w = gsl_vector_alloc(size);
|
1128
|
+
flag = 1;
|
1129
|
+
break;
|
1130
|
+
case 3:
|
1131
|
+
xp = NUM2DBL(argv[0]);
|
1132
|
+
CHECK_VECTOR(argv[1]);
|
1133
|
+
Data_Get_Struct(argv[1], gsl_vector, xa);
|
1134
|
+
if (TYPE(argv[2]) == T_FIXNUM) {
|
1135
|
+
size = FIX2INT(argv[2]);
|
1136
|
+
w = gsl_vector_alloc(size);
|
1137
|
+
flag = 1;
|
1138
|
+
} else {
|
1139
|
+
CHECK_VEC(argv[2]);
|
1140
|
+
Data_Get_Struct(argv[2], GSL_TYPE(gsl_vector), w);
|
1141
|
+
size = dd->size;
|
1142
|
+
}
|
1143
|
+
break;
|
1144
|
+
case 4:
|
1145
|
+
Need_Float(argv[0]);
|
1146
|
+
CHECK_VECTOR(argv[1]);
|
1147
|
+
CHECK_FIXNUM(argv[2]);
|
1148
|
+
CHECK_VECTOR(argv[3]);
|
1149
|
+
xp = NUM2DBL(argv[0]);
|
1150
|
+
Data_Get_Struct(argv[1], gsl_vector, xa);
|
1151
|
+
size = FIX2INT(argv[2]);
|
1152
|
+
Data_Get_Struct(argv[3], GSL_TYPE(gsl_vector), w);
|
1153
|
+
break;
|
1154
|
+
default:
|
1155
|
+
rb_raise(rb_eArgError, "wrong number of arguments");
|
1156
|
+
}
|
1157
|
+
c = gsl_vector_alloc(size);
|
1158
|
+
gsl_poly_dd_taylor(c->data, xp, dd->data, xa->data, size, w->data);
|
1159
|
+
if (flag == 1) gsl_vector_free(w);
|
1160
|
+
return Data_Wrap_Struct(cgsl_poly_taylor, 0, gsl_vector_free, c);
|
1161
|
+
}
|
1162
|
+
|
1163
|
+
#endif
|
1164
|
+
#endif
|
1165
|
+
|
1166
|
+
static VALUE FUNCTION(rb_gsl_poly,order)(VALUE obj)
|
1167
|
+
{
|
1168
|
+
GSL_TYPE(gsl_vector) *v = NULL;
|
1169
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1170
|
+
return INT2FIX(v->size - 1);
|
1171
|
+
}
|
1172
|
+
|
1173
|
+
int FUNCTION(gsl_poly,conv)(const BASE *a, size_t na, const BASE *b, size_t nb,
|
1174
|
+
BASE *c, size_t *nc)
|
1175
|
+
{
|
1176
|
+
BASE x;
|
1177
|
+
size_t i, j;
|
1178
|
+
*nc = na + nb - 1;
|
1179
|
+
for (i = 0; i < *nc; i++) c[i] = 0;
|
1180
|
+
for (i = 0; i < *nc; i++) {
|
1181
|
+
if (i >= na) break;
|
1182
|
+
x = a[i];
|
1183
|
+
for (j = 0; j < *nc; j++) {
|
1184
|
+
if (j >= nb) break;
|
1185
|
+
else c[i+j] += x*b[j];
|
1186
|
+
}
|
1187
|
+
}
|
1188
|
+
return 0;
|
1189
|
+
}
|
1190
|
+
|
1191
|
+
GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,conv_vector)(const GSL_TYPE(gsl_vector) *v1, const GSL_TYPE(gsl_vector) *v2)
|
1192
|
+
{
|
1193
|
+
GSL_TYPE(gsl_vector) *vnew = NULL;
|
1194
|
+
size_t n, tmp;
|
1195
|
+
if (v1->size == 1) {
|
1196
|
+
vnew = FUNCTION(make_vector,clone)(v2);
|
1197
|
+
FUNCTION(gsl_vector,scale)(vnew, FUNCTION(gsl_vector,get)(v1, 0));
|
1198
|
+
return vnew;
|
1199
|
+
} else if (v2->size == 1) {
|
1200
|
+
vnew = FUNCTION(make_vector,clone)(v1);
|
1201
|
+
FUNCTION(gsl_vector,scale)(vnew, FUNCTION(gsl_vector,get)(v2, 0));
|
1202
|
+
return vnew;
|
1203
|
+
} else {
|
1204
|
+
n = v1->size + v2->size - 1;
|
1205
|
+
vnew = FUNCTION(gsl_vector,calloc)(n);
|
1206
|
+
FUNCTION(gsl_poly,conv)(v1->data, v1->size, v2->data, v2->size, vnew->data, &tmp);
|
1207
|
+
return vnew;
|
1208
|
+
}
|
1209
|
+
}
|
1210
|
+
|
1211
|
+
GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,reduce)(const GSL_TYPE(gsl_vector) *v)
|
1212
|
+
{
|
1213
|
+
size_t i, nn = v->size;
|
1214
|
+
GSL_TYPE(gsl_vector) *vnew = NULL;
|
1215
|
+
for (i = v->size-1; 0 <= (int) i; i--) {
|
1216
|
+
if (!gsl_fcmp(FUNCTION(gsl_vector,get)(v, i), 0.0, 1e-10)) {
|
1217
|
+
nn = i;
|
1218
|
+
break;
|
1219
|
+
}
|
1220
|
+
}
|
1221
|
+
if (nn == 0) nn = v->size;
|
1222
|
+
vnew = FUNCTION(gsl_vector,alloc)(nn);
|
1223
|
+
for (i = 0; i < nn; i++) {
|
1224
|
+
FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i));
|
1225
|
+
}
|
1226
|
+
return vnew;
|
1227
|
+
}
|
1228
|
+
|
1229
|
+
GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deriv)(const GSL_TYPE(gsl_vector) *v)
|
1230
|
+
{
|
1231
|
+
GSL_TYPE(gsl_vector) *vnew = NULL;
|
1232
|
+
size_t i;
|
1233
|
+
vnew = FUNCTION(gsl_vector,alloc)(v->size - 1);
|
1234
|
+
for (i = 0; i < v->size - 1; i++) {
|
1235
|
+
FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i+1)*(i+1));
|
1236
|
+
}
|
1237
|
+
return vnew;
|
1238
|
+
}
|
1239
|
+
|
1240
|
+
GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,integ)(const GSL_TYPE(gsl_vector) *v)
|
1241
|
+
{
|
1242
|
+
GSL_TYPE(gsl_vector) *vnew = NULL;
|
1243
|
+
size_t i;
|
1244
|
+
vnew = FUNCTION(gsl_vector,alloc)(v->size + 1);
|
1245
|
+
FUNCTION(gsl_vector,set)(vnew, 0, 0.0);
|
1246
|
+
for (i = 1; i < v->size + 1; i++) {
|
1247
|
+
FUNCTION(gsl_vector,set)(vnew, i, FUNCTION(gsl_vector,get)(v, i-1)/i);
|
1248
|
+
}
|
1249
|
+
return vnew;
|
1250
|
+
}
|
1251
|
+
|
1252
|
+
GSL_TYPE(gsl_vector)* FUNCTION(gsl_poly,deconv_vector)(const GSL_TYPE(gsl_vector) *c, const GSL_TYPE(gsl_vector) *a,
|
1253
|
+
GSL_TYPE(gsl_vector) **r)
|
1254
|
+
{
|
1255
|
+
GSL_TYPE(gsl_vector) *vnew = NULL, *a2 = NULL, *c2 = NULL, *vtmp = NULL;
|
1256
|
+
GSL_TYPE(gsl_vector) *rtmp = NULL;
|
1257
|
+
BASE x, y, z, aa;
|
1258
|
+
size_t n, i, j, k, jj;
|
1259
|
+
c2 = FUNCTION(gsl_poly,reduce)(c);
|
1260
|
+
a2 = FUNCTION(gsl_poly,reduce)(a);
|
1261
|
+
n = c2->size - a2->size + 1;
|
1262
|
+
vnew = FUNCTION(gsl_vector,calloc)(n);
|
1263
|
+
rtmp = FUNCTION(gsl_vector,alloc)(c2->size - 1);
|
1264
|
+
aa = FUNCTION(gsl_vector,get)(a2, a2->size - 1);
|
1265
|
+
FUNCTION(gsl_vector,set)(vnew, n-1, FUNCTION(gsl_vector,get)(c2, c2->size-1)/aa);
|
1266
|
+
for (i = n - 2, k = 1; k < n; i--, k++) {
|
1267
|
+
x = FUNCTION(gsl_vector,get)(c2, c2->size-1-k);
|
1268
|
+
for (j = n-1; j >= 0; j--) {
|
1269
|
+
z = FUNCTION(gsl_vector,get)(vnew, j);
|
1270
|
+
jj = c2->size-1-k-j;
|
1271
|
+
if (jj > k || jj < 0) continue;
|
1272
|
+
y = FUNCTION(gsl_vector,get)(a2, jj);
|
1273
|
+
x -= y*z;
|
1274
|
+
}
|
1275
|
+
FUNCTION(gsl_vector,set)(vnew, i, x/aa);
|
1276
|
+
}
|
1277
|
+
vtmp = FUNCTION(gsl_poly,conv_vector)(vnew, a2);
|
1278
|
+
for (i = 0; i < rtmp->size; i++) {
|
1279
|
+
x = FUNCTION(gsl_vector,get)(c2, i);
|
1280
|
+
y = FUNCTION(gsl_vector,get)(vtmp, i);
|
1281
|
+
FUNCTION(gsl_vector,set)(rtmp, i, x - y);
|
1282
|
+
}
|
1283
|
+
*r = FUNCTION(gsl_poly,reduce)(rtmp);
|
1284
|
+
FUNCTION(gsl_vector,free)(rtmp);
|
1285
|
+
FUNCTION(gsl_vector,free)(vtmp);
|
1286
|
+
FUNCTION(gsl_vector,free)(c2);
|
1287
|
+
FUNCTION(gsl_vector,free)(a2);
|
1288
|
+
return vnew;
|
1289
|
+
}
|
1290
|
+
|
1291
|
+
GSL_TYPE(gsl_poly)* FUNCTION(get_poly,get)(VALUE obj, int *flag)
|
1292
|
+
{
|
1293
|
+
GSL_TYPE(gsl_poly) *p = NULL;
|
1294
|
+
size_t i;
|
1295
|
+
switch (TYPE(obj)) {
|
1296
|
+
case T_ARRAY:
|
1297
|
+
p = FUNCTION(gsl_vector,alloc)(RARRAY_LEN(obj));
|
1298
|
+
for (i = 0; i < p->size; i++) FUNCTION(gsl_vector,set)(p, i, (BASE) NUM2DBL(rb_ary_entry(obj, i)));
|
1299
|
+
*flag = 1;
|
1300
|
+
break;
|
1301
|
+
case T_FLOAT:
|
1302
|
+
case T_FIXNUM:
|
1303
|
+
p = FUNCTION(gsl_vector,alloc)(1);
|
1304
|
+
FUNCTION(gsl_vector,set)(p, 0, (BASE) NUM2DBL(obj));
|
1305
|
+
*flag = 1;
|
1306
|
+
break;
|
1307
|
+
default:
|
1308
|
+
CHECK_VEC(obj);
|
1309
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), p);
|
1310
|
+
*flag = 0;
|
1311
|
+
break;
|
1312
|
+
}
|
1313
|
+
return p;
|
1314
|
+
}
|
1315
|
+
|
1316
|
+
static VALUE FUNCTION(rb_gsl_poly,conv)(VALUE obj, VALUE bb)
|
1317
|
+
{
|
1318
|
+
GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL, *vnew = NULL;
|
1319
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1320
|
+
switch (TYPE(bb)) {
|
1321
|
+
case T_FIXNUM:
|
1322
|
+
case T_FLOAT:
|
1323
|
+
vnew = FUNCTION(gsl_vector,alloc)(v->size);
|
1324
|
+
FUNCTION(gsl_vector,memcpy)(vnew, v);
|
1325
|
+
FUNCTION(gsl_vector,scale)(vnew, (BASE) NUM2DBL(bb));
|
1326
|
+
break;
|
1327
|
+
default:
|
1328
|
+
CHECK_VEC(bb);
|
1329
|
+
Data_Get_Struct(bb, GSL_TYPE(gsl_vector), v2);
|
1330
|
+
vnew = FUNCTION(gsl_poly,conv_vector)(v, v2);
|
1331
|
+
break;
|
1332
|
+
}
|
1333
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1334
|
+
}
|
1335
|
+
|
1336
|
+
VALUE FUNCTION(rb_gsl_poly,deconv)(VALUE obj, VALUE bb)
|
1337
|
+
{
|
1338
|
+
GSL_TYPE(gsl_poly) *v = NULL, *v2 = NULL, *vnew = NULL, *r = NULL;
|
1339
|
+
int flag = 0;
|
1340
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1341
|
+
switch (TYPE(bb)) {
|
1342
|
+
case T_ARRAY:
|
1343
|
+
v2 = FUNCTION(get_poly,get)(bb, &flag);
|
1344
|
+
break;
|
1345
|
+
case T_FLOAT:
|
1346
|
+
case T_FIXNUM:
|
1347
|
+
v2 = FUNCTION(gsl_vector,alloc)(1);
|
1348
|
+
FUNCTION(gsl_vector,set)(v2, 0, (BASE) NUM2DBL(bb));
|
1349
|
+
break;
|
1350
|
+
default:
|
1351
|
+
CHECK_VEC(bb);
|
1352
|
+
Data_Get_Struct(bb, GSL_TYPE(gsl_vector), v2);
|
1353
|
+
break;
|
1354
|
+
}
|
1355
|
+
vnew = FUNCTION(gsl_poly,deconv_vector)(v, v2, &r);
|
1356
|
+
if (flag == 1) FUNCTION(gsl_vector,free)(v2);
|
1357
|
+
if (FUNCTION(gsl_vector,isnull)(r))
|
1358
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1359
|
+
else
|
1360
|
+
return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
|
1361
|
+
Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
|
1362
|
+
}
|
1363
|
+
|
1364
|
+
static VALUE FUNCTION(rb_gsl_poly,reduce)(VALUE obj)
|
1365
|
+
{
|
1366
|
+
GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
|
1367
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1368
|
+
vnew = FUNCTION(gsl_poly,reduce)(v);
|
1369
|
+
if (vnew == NULL) {
|
1370
|
+
return Qnil;
|
1371
|
+
} else if (vnew->size == 0) {
|
1372
|
+
return Qnil;
|
1373
|
+
} else if (FUNCTION(gsl_vector,isnull)(vnew)) {
|
1374
|
+
return INT2FIX(0);
|
1375
|
+
} else if (vnew->size == 1) {
|
1376
|
+
return rb_float_new(FUNCTION(gsl_vector,get)(vnew, 0));
|
1377
|
+
} else {
|
1378
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1379
|
+
}
|
1380
|
+
return Qnil; /* never reach here */
|
1381
|
+
}
|
1382
|
+
|
1383
|
+
static VALUE FUNCTION(rb_gsl_poly,deriv)(VALUE obj)
|
1384
|
+
{
|
1385
|
+
GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
|
1386
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1387
|
+
vnew = FUNCTION(gsl_poly,deriv)(v);
|
1388
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1389
|
+
}
|
1390
|
+
|
1391
|
+
static VALUE FUNCTION(rb_gsl_poly,integ)(VALUE obj)
|
1392
|
+
{
|
1393
|
+
GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
|
1394
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1395
|
+
vnew = FUNCTION(gsl_poly,integ)(v);
|
1396
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1397
|
+
}
|
1398
|
+
|
1399
|
+
static VALUE FUNCTION(rb_gsl_poly,conv2)(VALUE klass, VALUE v1, VALUE v2)
|
1400
|
+
{
|
1401
|
+
GSL_TYPE(gsl_poly) *p1 = NULL, *p2 = NULL, *p3 = NULL;
|
1402
|
+
int flag1 = 0, flag2 = 0;
|
1403
|
+
size_t i;
|
1404
|
+
VALUE ary;
|
1405
|
+
p1 = FUNCTION(get_poly,get)(v1, &flag1);
|
1406
|
+
p2 = FUNCTION(get_poly,get)(v2, &flag2);
|
1407
|
+
p3 = FUNCTION(gsl_poly,conv_vector)(p1, p2);
|
1408
|
+
if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
|
1409
|
+
if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
|
1410
|
+
if (flag1 == 1 && flag2 == 1) {
|
1411
|
+
ary = rb_ary_new2(p3->size);
|
1412
|
+
for (i = 0; i < p3->size; i++)
|
1413
|
+
rb_ary_store(ary, i, C_TO_VALUE2(FUNCTION(gsl_vector,get)(p3, i)));
|
1414
|
+
FUNCTION(gsl_vector,free)(p3);
|
1415
|
+
return ary;
|
1416
|
+
} else {
|
1417
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), p3);
|
1418
|
+
}
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
static VALUE FUNCTION(rb_gsl_poly,deconv2)(VALUE klass, VALUE v1, VALUE v2)
|
1422
|
+
{
|
1423
|
+
GSL_TYPE(gsl_poly) *p1 = NULL, *p2 = NULL;
|
1424
|
+
GSL_TYPE(gsl_poly) *r = NULL, *vnew = NULL;
|
1425
|
+
int flag1 = 0, flag2 = 0;
|
1426
|
+
p1 = FUNCTION(get_poly,get)(v1, &flag1);
|
1427
|
+
p2 = FUNCTION(get_poly,get)(v2, &flag2);
|
1428
|
+
vnew = FUNCTION(gsl_poly,deconv_vector)(p1, p2, &r);
|
1429
|
+
if (flag1 == 1) FUNCTION(gsl_vector,free)(p1);
|
1430
|
+
if (flag2 == 1) FUNCTION(gsl_vector,free)(p2);
|
1431
|
+
if (FUNCTION(gsl_vector,isnull)(r))
|
1432
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1433
|
+
else
|
1434
|
+
return rb_ary_new3(2, Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew),
|
1435
|
+
Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), r));
|
1436
|
+
}
|
1437
|
+
|
1438
|
+
GSL_TYPE(gsl_poly)* FUNCTION(gsl_poly,add)(const GSL_TYPE(gsl_poly) *a,
|
1439
|
+
const GSL_TYPE(gsl_poly) *b)
|
1440
|
+
{
|
1441
|
+
GSL_TYPE(gsl_poly) *c = NULL;
|
1442
|
+
const GSL_TYPE(gsl_poly) *longer;
|
1443
|
+
size_t i, n;
|
1444
|
+
if (a->size > b->size) {
|
1445
|
+
c = FUNCTION(gsl_vector,alloc)(a->size);
|
1446
|
+
longer = a;
|
1447
|
+
} else {
|
1448
|
+
c = FUNCTION(gsl_vector,alloc)(b->size);
|
1449
|
+
longer = b;
|
1450
|
+
}
|
1451
|
+
n = GSL_MIN(a->size, b->size);
|
1452
|
+
for (i = 0; i < n; i++) {
|
1453
|
+
FUNCTION(gsl_vector,set)(c, i, FUNCTION(gsl_vector,get)(a, i) + FUNCTION(gsl_vector,get)(b, i));
|
1454
|
+
}
|
1455
|
+
for (i = n; i < c->size; i++)
|
1456
|
+
FUNCTION(gsl_vector,set)(c, i, FUNCTION(gsl_vector,get)(longer, i));
|
1457
|
+
return c;
|
1458
|
+
}
|
1459
|
+
|
1460
|
+
static VALUE FUNCTION(rb_gsl_poly,add)(VALUE obj, VALUE bb)
|
1461
|
+
{
|
1462
|
+
GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL, *vb = NULL;
|
1463
|
+
BASE b;
|
1464
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1465
|
+
switch (TYPE(bb)) {
|
1466
|
+
case T_FLOAT:
|
1467
|
+
case T_FIXNUM:
|
1468
|
+
b = (BASE) NUM2DBL(bb);
|
1469
|
+
vnew = FUNCTION(gsl_vector,alloc)(v->size);
|
1470
|
+
FUNCTION(gsl_vector,memcpy)(vnew, v);
|
1471
|
+
FUNCTION(gsl_vector,set)(vnew, 0, FUNCTION(gsl_vector,get)(v, 0) + b);
|
1472
|
+
break;
|
1473
|
+
default:
|
1474
|
+
CHECK_VEC(bb);
|
1475
|
+
Data_Get_Struct(bb, GSL_TYPE(gsl_vector), vb);
|
1476
|
+
vnew = FUNCTION(gsl_poly,add)(v, vb);
|
1477
|
+
}
|
1478
|
+
return Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vnew);
|
1479
|
+
}
|
1480
|
+
|
1481
|
+
static VALUE rb_gsl_poly_uminus(VALUE obj);
|
1482
|
+
static VALUE rb_gsl_poly_int_uminus(VALUE obj);
|
1483
|
+
static VALUE FUNCTION(rb_gsl_poly,sub)(VALUE obj, VALUE bb)
|
1484
|
+
{
|
1485
|
+
switch (TYPE(bb)) {
|
1486
|
+
case T_FLOAT:
|
1487
|
+
case T_FIXNUM:
|
1488
|
+
return FUNCTION(rb_gsl_poly,add)(obj, C_TO_VALUE2(-(BASE)NUM2DBL(bb)));
|
1489
|
+
break;
|
1490
|
+
default:
|
1491
|
+
CHECK_VEC(bb);
|
1492
|
+
return FUNCTION(rb_gsl_poly,add)(obj, FUNCTION(rb_gsl_poly,uminus)(bb));
|
1493
|
+
break;
|
1494
|
+
}
|
1495
|
+
}
|
1496
|
+
|
1497
|
+
static VALUE FUNCTION(rb_gsl_poly,uminus)(VALUE obj)
|
1498
|
+
{
|
1499
|
+
GSL_TYPE(gsl_poly) *p = NULL, *pnew = NULL;
|
1500
|
+
size_t i;
|
1501
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), p);
|
1502
|
+
pnew = FUNCTION(gsl_vector,alloc)(p->size);
|
1503
|
+
for (i = 0; i < pnew->size; i++) FUNCTION(gsl_vector,set)(pnew, i, -FUNCTION(gsl_vector,get)(p, i));
|
1504
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), pnew);
|
1505
|
+
}
|
1506
|
+
|
1507
|
+
static VALUE FUNCTION(rb_gsl_poly,uplus)(VALUE obj)
|
1508
|
+
{
|
1509
|
+
return obj;
|
1510
|
+
}
|
1511
|
+
|
1512
|
+
static VALUE FUNCTION(rb_gsl_poly,coerce)(VALUE obj, VALUE other)
|
1513
|
+
{
|
1514
|
+
GSL_TYPE(gsl_vector) *vb;
|
1515
|
+
switch (TYPE(other)) {
|
1516
|
+
case T_FLOAT:
|
1517
|
+
case T_FIXNUM:
|
1518
|
+
vb = FUNCTION(gsl_vector,calloc)(1);
|
1519
|
+
FUNCTION(gsl_vector,set)(vb, 0, (BASE) NUM2DBL(other));
|
1520
|
+
return rb_ary_new3(2, Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vb),
|
1521
|
+
obj);
|
1522
|
+
break;
|
1523
|
+
default:
|
1524
|
+
CHECK_VEC(other);
|
1525
|
+
return rb_ary_new3(3, other, obj);
|
1526
|
+
break;
|
1527
|
+
}
|
1528
|
+
}
|
1529
|
+
|
1530
|
+
static VALUE FUNCTION(rb_gsl_poly,to_gv)(VALUE obj)
|
1531
|
+
{
|
1532
|
+
GSL_TYPE(gsl_vector) *v, *vnew = NULL;
|
1533
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
|
1534
|
+
vnew = FUNCTION(make_vector,clone)(v);
|
1535
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
|
1536
|
+
}
|
1537
|
+
|
1538
|
+
static VALUE FUNCTION(rb_gsl_poly,companion_matrix)(VALUE obj)
|
1539
|
+
{
|
1540
|
+
GSL_TYPE(gsl_poly) *p = NULL;
|
1541
|
+
BASE z;
|
1542
|
+
gsl_matrix *m;
|
1543
|
+
size_t i, j, size;
|
1544
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_poly), p);
|
1545
|
+
size = p->size - 1;
|
1546
|
+
m = gsl_matrix_calloc(size, size);
|
1547
|
+
z = FUNCTION(gsl_vector,get)(p, size);
|
1548
|
+
for (j = 0; j < size; j++)
|
1549
|
+
gsl_matrix_set(m, 0, size-j-1, -FUNCTION(gsl_vector,get)(p, j)/z);
|
1550
|
+
for (i = 1; i < size; i++) {
|
1551
|
+
gsl_matrix_set(m, i, i-1, 1.0);
|
1552
|
+
}
|
1553
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, m);
|
1554
|
+
}
|
1555
|
+
|
1556
|
+
static VALUE FUNCTION(rb_gsl_poly,info)(VALUE obj)
|
1557
|
+
{
|
1558
|
+
GSL_TYPE(gsl_poly) *v;
|
1559
|
+
char buf[256];
|
1560
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_poly), v);
|
1561
|
+
sprintf(buf, "Class: %s\n", rb_class2name(CLASS_OF(obj)));
|
1562
|
+
#ifdef RUBY_1_9_LATER
|
1563
|
+
sprintf(buf, "%sSuperClass: %s\n", buf, rb_class2name(RCLASS_SUPER(CLASS_OF(obj))));
|
1564
|
+
#else
|
1565
|
+
sprintf(buf, "%sSuperClass: %s\n", buf, rb_class2name(RCLASS(CLASS_OF(obj))->super));
|
1566
|
+
#endif
|
1567
|
+
sprintf(buf, "%sOrder: %d\n", buf, (int) v->size-1);
|
1568
|
+
return rb_str_new2(buf);
|
1569
|
+
}
|
1570
|
+
|
1571
|
+
#ifdef BASE_DOUBLE
|
1572
|
+
#include "rb_gsl_fit.h"
|
1573
|
+
/* singleton */
|
1574
|
+
static VALUE rb_gsl_poly_fit(int argc, VALUE *argv, VALUE obj)
|
1575
|
+
{
|
1576
|
+
gsl_multifit_linear_workspace *space = NULL;
|
1577
|
+
gsl_matrix *X = NULL, *cov = NULL;
|
1578
|
+
gsl_vector *x, *y = NULL, *c = NULL;
|
1579
|
+
gsl_vector_view xx, yy;
|
1580
|
+
size_t order, i, j;
|
1581
|
+
double chisq, val;
|
1582
|
+
int status, flag = 0;
|
1583
|
+
VALUE vc, vcov;
|
1584
|
+
if (argc != 3 && argc != 4)
|
1585
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc);
|
1586
|
+
x = &xx.vector;
|
1587
|
+
y = &yy.vector;
|
1588
|
+
Data_Get_Vector(argv[0], x);
|
1589
|
+
Data_Get_Vector(argv[1], y);
|
1590
|
+
order = NUM2INT(argv[2]);
|
1591
|
+
if (argc == 4) {
|
1592
|
+
Data_Get_Struct(argv[3], gsl_multifit_linear_workspace, space);
|
1593
|
+
} else {
|
1594
|
+
space = gsl_multifit_linear_alloc(x->size, order + 1);
|
1595
|
+
flag = 1;
|
1596
|
+
}
|
1597
|
+
cov = gsl_matrix_alloc(order + 1, order + 1);
|
1598
|
+
c = gsl_vector_alloc(order + 1);
|
1599
|
+
X = gsl_matrix_alloc(x->size, order + 1);
|
1600
|
+
for (i = 0; i < x->size; i++) {
|
1601
|
+
val = 1.0;
|
1602
|
+
gsl_matrix_set(X, i, 0, val);
|
1603
|
+
for (j = 1; j <= order; j++) {
|
1604
|
+
val *= gsl_vector_get(x, i);
|
1605
|
+
gsl_matrix_set(X, i, j, val);
|
1606
|
+
}
|
1607
|
+
}
|
1608
|
+
status = gsl_multifit_linear(X, y, c, cov, &chisq, space);
|
1609
|
+
if (flag == 1) gsl_multifit_linear_free(space);
|
1610
|
+
vc = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, c);
|
1611
|
+
vcov = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, cov);
|
1612
|
+
gsl_matrix_free(X);
|
1613
|
+
return rb_ary_new3(4, vc, vcov, rb_float_new(chisq), INT2FIX(status));
|
1614
|
+
}
|
1615
|
+
|
1616
|
+
static VALUE rb_gsl_poly_wfit(int argc, VALUE *argv, VALUE obj)
|
1617
|
+
{
|
1618
|
+
gsl_multifit_linear_workspace *space = NULL;
|
1619
|
+
gsl_matrix *X = NULL, *cov = NULL;
|
1620
|
+
gsl_vector *x, *y = NULL, *w, *c = NULL;
|
1621
|
+
size_t order, i, j;
|
1622
|
+
double chisq, val;
|
1623
|
+
int status, flag = 0;
|
1624
|
+
VALUE vc, vcov;
|
1625
|
+
if (argc != 4 && argc != 5)
|
1626
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc);
|
1627
|
+
Data_Get_Vector(argv[0], x);
|
1628
|
+
Data_Get_Vector(argv[1], w);
|
1629
|
+
Data_Get_Vector(argv[2], y);
|
1630
|
+
order = NUM2INT(argv[3]);
|
1631
|
+
if (argc == 5) {
|
1632
|
+
Data_Get_Struct(argv[4], gsl_multifit_linear_workspace, space);
|
1633
|
+
} else {
|
1634
|
+
space = gsl_multifit_linear_alloc(x->size, order + 1);
|
1635
|
+
flag = 1;
|
1636
|
+
}
|
1637
|
+
cov = gsl_matrix_alloc(order + 1, order + 1);
|
1638
|
+
c = gsl_vector_alloc(order + 1);
|
1639
|
+
X = gsl_matrix_alloc(x->size, order + 1);
|
1640
|
+
for (i = 0; i < x->size; i++) {
|
1641
|
+
val = 1.0;
|
1642
|
+
gsl_matrix_set(X, i, 0, val);
|
1643
|
+
for (j = 1; j <= order; j++) {
|
1644
|
+
val *= gsl_vector_get(x, i);
|
1645
|
+
gsl_matrix_set(X, i, j, val);
|
1646
|
+
}
|
1647
|
+
}
|
1648
|
+
status = gsl_multifit_wlinear(X, w, y, c, cov, &chisq, space);
|
1649
|
+
if (flag == 1) gsl_multifit_linear_free(space);
|
1650
|
+
vc = Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, c);
|
1651
|
+
vcov = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, cov);
|
1652
|
+
gsl_matrix_free(X);
|
1653
|
+
return rb_ary_new3(4, vc, vcov, rb_float_new(chisq), INT2FIX(status));
|
1654
|
+
}
|
1655
|
+
#endif
|
1656
|
+
|
1657
|
+
#ifdef BASE_DOUBLE
|
1658
|
+
#ifdef GSL_1_13_LATER
|
1659
|
+
static VALUE rb_gsl_poly_eval_derivs_singleton(int argc, VALUE *argv, VALUE klass)
|
1660
|
+
{
|
1661
|
+
VALUE ary;
|
1662
|
+
gsl_vector *v = NULL, *v2 = NULL;
|
1663
|
+
size_t i, lenc, lenres;
|
1664
|
+
#ifdef HAVE_NARRAY_H
|
1665
|
+
struct NARRAY *na;
|
1666
|
+
double *ptr1, *ptr2;
|
1667
|
+
int shape[1];
|
1668
|
+
#endif
|
1669
|
+
|
1670
|
+
if (argc < 2) rb_raise(rb_eArgError, "Wrong number of arguments (%d for >= 2)", argc);
|
1671
|
+
if (rb_obj_is_kind_of(argv[0], rb_cArray)) {
|
1672
|
+
v = gsl_vector_alloc(RARRAY_LEN(argv[0]));
|
1673
|
+
lenc = v->size;
|
1674
|
+
for (i = 0; i < lenc; i++) {
|
1675
|
+
gsl_vector_set(v, i, NUM2DBL(rb_ary_entry(argv[0], i)));
|
1676
|
+
}
|
1677
|
+
if (argc == 2) lenres = lenc + 1;
|
1678
|
+
else lenres = FIX2INT(argv[2]);
|
1679
|
+
v2 = gsl_vector_alloc(lenres);
|
1680
|
+
gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[1]), v2->data, lenres);
|
1681
|
+
ary = rb_ary_new2(lenres);
|
1682
|
+
for (i = 0; i < lenres; i++) {
|
1683
|
+
rb_ary_store(ary, i, rb_float_new(gsl_vector_get(v2, i)));
|
1684
|
+
}
|
1685
|
+
gsl_vector_free(v2);
|
1686
|
+
gsl_vector_free(v);
|
1687
|
+
return ary;
|
1688
|
+
}
|
1689
|
+
if (rb_obj_is_kind_of(argv[0], cgsl_vector)) {
|
1690
|
+
Data_Get_Struct(argv[0], gsl_vector, v);
|
1691
|
+
lenc = v->size;
|
1692
|
+
if (argc == 2) lenres = lenc + 1;
|
1693
|
+
else lenres = FIX2INT(argv[2]);
|
1694
|
+
v2 = gsl_vector_alloc(lenres);
|
1695
|
+
gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[1]), v2->data, lenres);
|
1696
|
+
return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v2);
|
1697
|
+
}
|
1698
|
+
#ifdef HAVE_NARRAY_H
|
1699
|
+
if (NA_IsNArray(argv[0])) {
|
1700
|
+
GetNArray(argv[0], na);
|
1701
|
+
ptr1 = (double*) na->ptr;
|
1702
|
+
lenc = na->total;
|
1703
|
+
if (argc == 2) lenres = lenc + 1;
|
1704
|
+
else lenres = FIX2INT(argv[2]);
|
1705
|
+
shape[0] = lenres;
|
1706
|
+
ary = na_make_object(NA_DFLOAT, na->rank, shape, CLASS_OF(argv[0]));
|
1707
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
1708
|
+
gsl_poly_eval_derivs(ptr1, lenc, NUM2DBL(argv[1]), ptr2, lenres);
|
1709
|
+
return ary;
|
1710
|
+
}
|
1711
|
+
#endif
|
1712
|
+
return Qnil; // Never comes here
|
1713
|
+
}
|
1714
|
+
static VALUE rb_gsl_poly_eval_derivs(int argc, VALUE *argv, VALUE obj)
|
1715
|
+
{
|
1716
|
+
gsl_vector *v, *v2;
|
1717
|
+
size_t lenc, lenres;
|
1718
|
+
Data_Get_Struct(obj, gsl_vector, v);
|
1719
|
+
lenc = v->size;
|
1720
|
+
switch (argc) {
|
1721
|
+
case 1:
|
1722
|
+
lenres = lenc + 1;
|
1723
|
+
break;
|
1724
|
+
case 2:
|
1725
|
+
lenres = FIX2INT(argv[1]);
|
1726
|
+
break;
|
1727
|
+
default:
|
1728
|
+
rb_raise(rb_eArgError, "Wrong number of arguments (%d for > 1)", argc);
|
1729
|
+
}
|
1730
|
+
v2 = gsl_vector_alloc(lenres);
|
1731
|
+
gsl_poly_eval_derivs(v->data, lenc, NUM2DBL(argv[0]), v2->data, lenres);
|
1732
|
+
return Data_Wrap_Struct(cgsl_poly, 0, gsl_vector_free, v2);
|
1733
|
+
}
|
1734
|
+
#endif
|
1735
|
+
#endif
|
1736
|
+
|
1737
|
+
void FUNCTION(Init_gsl_poly,init)(VALUE module)
|
1738
|
+
{
|
1739
|
+
#ifdef BASE_DOUBLE
|
1740
|
+
VALUE mgsl_poly_complex;
|
1741
|
+
cgsl_poly = rb_define_class_under(module, "Poly", cgsl_vector);
|
1742
|
+
cgsl_poly_int = rb_define_class_under(cgsl_poly, "Int", cgsl_vector_int);
|
1743
|
+
|
1744
|
+
cgsl_poly_workspace = rb_define_class_under(cgsl_poly, "Workspace", cGSL_Object);
|
1745
|
+
mgsl_poly_complex = rb_define_module_under(cgsl_poly, "Complex");
|
1746
|
+
cgsl_poly_complex_workspace = rb_define_class_under(mgsl_poly_complex,
|
1747
|
+
"Workspace", cGSL_Object);
|
1748
|
+
rb_define_singleton_method(cgsl_poly_workspace, "alloc",
|
1749
|
+
rb_gsl_poly_workspace_new, 1);
|
1750
|
+
rb_define_singleton_method(cgsl_poly_complex_workspace, "alloc",
|
1751
|
+
rb_gsl_poly_workspace_new, 1);
|
1752
|
+
|
1753
|
+
rb_define_singleton_method(mgsl_poly_complex, "solve_quadratic",
|
1754
|
+
FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
|
1755
|
+
rb_define_singleton_method(mgsl_poly_complex, "solve_cubic",
|
1756
|
+
FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
|
1757
|
+
#ifdef HAVE_POLY_SOLVE_QUARTIC
|
1758
|
+
rb_define_singleton_method(mgsl_poly_complex, "solve_quartic",
|
1759
|
+
FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
|
1760
|
+
#endif
|
1761
|
+
|
1762
|
+
rb_define_singleton_method(mgsl_poly_complex, "solve",
|
1763
|
+
FUNCTION(rb_gsl_poly,complex_solve), -1);
|
1764
|
+
rb_define_singleton_method(mgsl_poly_complex, "roots",
|
1765
|
+
FUNCTION(rb_gsl_poly,complex_solve), -1);
|
1766
|
+
#endif
|
1767
|
+
|
1768
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
|
1769
|
+
FUNCTION(rb_gsl_poly,solve_quadratic), -1);
|
1770
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_cubic",
|
1771
|
+
FUNCTION(rb_gsl_poly,solve_cubic), -1);
|
1772
|
+
|
1773
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
|
1774
|
+
FUNCTION(rb_gsl_poly,complex_solve_quadratic), -1);
|
1775
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
|
1776
|
+
FUNCTION(rb_gsl_poly,complex_solve_cubic), -1);
|
1777
|
+
#ifdef HAVE_POLY_SOLVE_QUARTIC
|
1778
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve_quartic",
|
1779
|
+
FUNCTION(rb_gsl_poly,solve_quartic), -1);
|
1780
|
+
|
1781
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
|
1782
|
+
FUNCTION(rb_gsl_poly,complex_solve_quartic), -1);
|
1783
|
+
#endif
|
1784
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "complex_solve",
|
1785
|
+
FUNCTION(rb_gsl_poly,complex_solve), -1);
|
1786
|
+
|
1787
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "solve",
|
1788
|
+
FUNCTION(rb_gsl_poly,complex_solve), -1);
|
1789
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "roots",
|
1790
|
+
FUNCTION(rb_gsl_poly,complex_solve), -1);
|
1791
|
+
|
1792
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "eval",
|
1793
|
+
FUNCTION(rb_gsl_poly,eval2), -1);
|
1794
|
+
|
1795
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "eval",
|
1796
|
+
FUNCTION(rb_gsl_poly,eval), 1);
|
1797
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "at", "eval");
|
1798
|
+
|
1799
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "solve_quadratic",
|
1800
|
+
FUNCTION(rb_gsl_poly,solve_quadratic2), 0);
|
1801
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quadratic",
|
1802
|
+
FUNCTION(rb_gsl_poly,complex_solve_quadratic2), 0);
|
1803
|
+
|
1804
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "solve_cubic",
|
1805
|
+
FUNCTION(rb_gsl_poly,solve_cubic2), 0);
|
1806
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_cubic",
|
1807
|
+
FUNCTION(rb_gsl_poly,complex_solve_cubic2), 0);
|
1808
|
+
|
1809
|
+
#ifdef HAVE_POLY_SOLVE_QUARTIC
|
1810
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "solve_quartic",
|
1811
|
+
FUNCTION(rb_gsl_poly,solve_quartic2), 0);
|
1812
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve_quartic",
|
1813
|
+
FUNCTION(rb_gsl_poly,complex_solve_quartic2), 0);
|
1814
|
+
#endif
|
1815
|
+
|
1816
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "complex_solve",
|
1817
|
+
FUNCTION(rb_gsl_poly,complex_solve2), -1);
|
1818
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "solve", "complex_solve");
|
1819
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "roots", "complex_solve");
|
1820
|
+
|
1821
|
+
#ifdef BASE_INT
|
1822
|
+
rb_define_method(cgsl_poly_int, "to_f", rb_gsl_poly_int_to_f, 0);
|
1823
|
+
#endif
|
1824
|
+
|
1825
|
+
#ifdef BASE_DOUBLE
|
1826
|
+
// rb_define_singleton_method(cgsl_poly, "eval", rb_gsl_poly_eval_singleton, 2);
|
1827
|
+
rb_define_method(cgsl_poly, "to_i", rb_gsl_poly_to_i, 0);
|
1828
|
+
#ifdef GSL_1_11_LATER
|
1829
|
+
rb_define_singleton_method(cgsl_poly, "complex_eval", rb_gsl_poly_eval_singleton, 2);
|
1830
|
+
rb_define_method(cgsl_vector_complex, "eval", rb_gsl_complex_poly_complex_eval, 1);
|
1831
|
+
#endif
|
1832
|
+
#ifdef GSL_1_1_LATER
|
1833
|
+
cgsl_poly_dd = rb_define_class_under(cgsl_poly, "DividedDifference", cgsl_poly);
|
1834
|
+
cgsl_poly_taylor = rb_define_class_under(cgsl_poly, "Taylor", cgsl_poly);
|
1835
|
+
rb_define_singleton_method(cgsl_poly, "dd_init", rb_gsl_poly_dd_init, 2);
|
1836
|
+
|
1837
|
+
rb_define_method(cgsl_poly_dd, "eval",rb_gsl_poly_dd_eval, 2);
|
1838
|
+
rb_define_method(cgsl_poly_dd, "taylor", rb_gsl_poly_dd_taylor, -1);
|
1839
|
+
#endif
|
1840
|
+
#endif
|
1841
|
+
|
1842
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "order", FUNCTION(rb_gsl_poly,order), 0);
|
1843
|
+
|
1844
|
+
/*****/
|
1845
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "conv", FUNCTION(rb_gsl_poly,conv), 1);
|
1846
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "*", "conv");
|
1847
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "conv",
|
1848
|
+
FUNCTION(rb_gsl_poly,conv2), 2);
|
1849
|
+
|
1850
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "deconv",
|
1851
|
+
FUNCTION(rb_gsl_poly,deconv), 1);
|
1852
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "deconv",
|
1853
|
+
FUNCTION(rb_gsl_poly,deconv2), 2);
|
1854
|
+
|
1855
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "reduce",
|
1856
|
+
FUNCTION(rb_gsl_poly,reduce), 1);
|
1857
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "deriv", FUNCTION(rb_gsl_poly,deriv), 1);
|
1858
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "integ", FUNCTION(rb_gsl_poly,integ), 1);
|
1859
|
+
|
1860
|
+
/*****/
|
1861
|
+
|
1862
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "add", FUNCTION(rb_gsl_poly,add), 1);
|
1863
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "+", "add");
|
1864
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "sub", FUNCTION(rb_gsl_poly,sub), 1);
|
1865
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "-", "sub");
|
1866
|
+
|
1867
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "-@", FUNCTION(rb_gsl_poly,uminus), 0);
|
1868
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "+@", FUNCTION(rb_gsl_poly,uplus), 0);
|
1869
|
+
|
1870
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "coerce",
|
1871
|
+
FUNCTION(rb_gsl_poly,coerce), 1);
|
1872
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "to_gv", FUNCTION(rb_gsl_poly,to_gv), 0);
|
1873
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "to_v", "to_gv");
|
1874
|
+
|
1875
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "companion_matrix",
|
1876
|
+
FUNCTION(rb_gsl_poly,companion_matrix), 0);
|
1877
|
+
rb_define_alias(GSL_TYPE(cgsl_poly), "compan", "companion_matrix");
|
1878
|
+
|
1879
|
+
/*****/
|
1880
|
+
rb_define_method(GSL_TYPE(cgsl_poly), "info",
|
1881
|
+
FUNCTION(rb_gsl_poly,info), 0);
|
1882
|
+
|
1883
|
+
#ifdef BASE_DOUBLE
|
1884
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "fit",
|
1885
|
+
FUNCTION(rb_gsl_poly,fit), -1);
|
1886
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_poly), "wfit",
|
1887
|
+
FUNCTION(rb_gsl_poly,wfit), -1);
|
1888
|
+
|
1889
|
+
#ifdef GSL_1_13_LATER
|
1890
|
+
rb_define_singleton_method(cgsl_poly, "eval_derivs", rb_gsl_poly_eval_derivs_singleton, -1);
|
1891
|
+
rb_define_method(cgsl_vector, "eval_derivs", rb_gsl_poly_eval_derivs, -1);
|
1892
|
+
#endif
|
1893
|
+
|
1894
|
+
#endif
|
1895
|
+
}
|
1896
|
+
|
1897
|
+
#undef NUMCONV
|
1898
|
+
#undef NUMCONV2
|
1899
|
+
#undef PRINTF_FORMAT
|
1900
|
+
#undef VEC_ROW_COL
|
1901
|
+
#undef VEC_P
|
1902
|
+
#undef C_TO_VALUE
|
1903
|
+
#undef C_TO_VALUE2
|
1904
|
+
#undef VEC_COL_P
|
1905
|
+
#undef VEC_ROW_P
|
1906
|
+
#undef CHECK_VEC
|
1907
|
+
#undef VEC_VIEW_P
|
1908
|
+
|
1909
|
+
#undef MAT_ROW_COL
|
1910
|
+
#undef MAT_P
|
1911
|
+
#undef C_TO_VALUE
|
1912
|
+
#undef MAT_COL_P
|
1913
|
+
#undef MAT_ROW_P
|
1914
|
+
#undef CHECK_MAT
|
1915
|
+
#undef MAT_VIEW_P
|