cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

bessel_functions.cpp (16409B)


      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2016 Gael Guennebaud <gael.guennebaud@inria.fr>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #include "main.h"
     11 #include "../Eigen/SpecialFunctions"
     12 
     13 template<typename X, typename Y>
     14 void verify_component_wise(const X& x, const Y& y)
     15 {
     16   for(Index i=0; i<x.size(); ++i)
     17   {
     18     if((numext::isfinite)(y(i))) {
     19       VERIFY_IS_APPROX( x(i), y(i) );
     20     }
     21     else if((numext::isnan)(y(i)))
     22       VERIFY((numext::isnan)(x(i)));
     23     else
     24       VERIFY_IS_EQUAL( x(i), y(i) );
     25   }
     26 }
     27 
     28 template<typename ArrayType> void array_bessel_functions() 
     29 {
     30   // Test Bessel function i0. Reference results obtained with SciPy.
     31   {
     32     ArrayType x(21);
     33     ArrayType expected(21);
     34     ArrayType res(21);
     35 
     36     x << -20.0, -18.0, -16.0, -14.0, -12.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0,
     37         2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0;
     38 
     39     expected << 4.35582826e+07, 6.21841242e+06, 8.93446228e+05, 1.29418563e+05,
     40        1.89489253e+04, 2.81571663e+03, 4.27564116e+02, 6.72344070e+01,
     41        1.13019220e+01, 2.27958530e+00, 1.00000000e+00, 2.27958530e+00,
     42        1.13019220e+01, 6.72344070e+01, 4.27564116e+02, 2.81571663e+03,
     43        1.89489253e+04, 1.29418563e+05, 8.93446228e+05, 6.21841242e+06,
     44        4.35582826e+07;
     45 
     46     CALL_SUBTEST(res = bessel_i0(x);
     47                  verify_component_wise(res, expected););
     48   }
     49 
     50   // Test Bessel function i0e. Reference results obtained with SciPy.
     51   {
     52     ArrayType x(21);
     53     ArrayType expected(21);
     54     ArrayType res(21);
     55 
     56     x << -20.0, -18.0, -16.0, -14.0, -12.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0,
     57         2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0;
     58 
     59     expected << 0.0897803118848, 0.0947062952128, 0.100544127361,
     60         0.107615251671, 0.116426221213, 0.127833337163, 0.143431781857,
     61         0.16665743264, 0.207001921224, 0.308508322554, 1.0, 0.308508322554,
     62         0.207001921224, 0.16665743264, 0.143431781857, 0.127833337163,
     63         0.116426221213, 0.107615251671, 0.100544127361, 0.0947062952128,
     64         0.0897803118848;
     65 
     66     CALL_SUBTEST(res = bessel_i0e(x);
     67                  verify_component_wise(res, expected););
     68   }
     69 
     70   // Test Bessel function i1. Reference results obtained with SciPy.
     71   {
     72     ArrayType x(21);
     73     ArrayType expected(21);
     74     ArrayType res(21);
     75 
     76     x << -20.0, -18.0, -16.0, -14.0, -12.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0,
     77         2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0;
     78 
     79     expected << -4.24549734e+07, -6.04313324e+06, -8.65059436e+05, -1.24707259e+05,
     80        -1.81413488e+04, -2.67098830e+03, -3.99873137e+02, -6.13419368e+01,
     81        -9.75946515e+00, -1.59063685e+00,  0.00000000e+00,  1.59063685e+00,
     82         9.75946515e+00,  6.13419368e+01,  3.99873137e+02,  2.67098830e+03,
     83         1.81413488e+04,  1.24707259e+05,  8.65059436e+05,  6.04313324e+06,
     84         4.24549734e+07;
     85 
     86     CALL_SUBTEST(res = bessel_i1(x);
     87                  verify_component_wise(res, expected););
     88   }
     89 
     90   // Test Bessel function i1e. Reference results obtained with SciPy.
     91   {
     92     ArrayType x(21);
     93     ArrayType expected(21);
     94     ArrayType res(21);
     95 
     96     x << -20.0, -18.0, -16.0, -14.0, -12.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0,
     97         2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0;
     98 
     99     expected << -0.0875062221833, -0.092036796872, -0.0973496147565,
    100         -0.103697667463, -0.11146429929, -0.121262681384, -0.134142493293,
    101         -0.152051459309, -0.178750839502, -0.215269289249, 0.0, 0.215269289249,
    102         0.178750839502, 0.152051459309, 0.134142493293, 0.121262681384,
    103         0.11146429929, 0.103697667463, 0.0973496147565, 0.092036796872,
    104         0.0875062221833;
    105 
    106     CALL_SUBTEST(res = bessel_i1e(x);
    107                  verify_component_wise(res, expected););
    108   }
    109 
    110   // Test Bessel function j0. Reference results obtained with SciPy.
    111   {
    112     ArrayType x(77);
    113     ArrayType expected(77);
    114     ArrayType res(77);
    115 
    116     x << -38., -37., -36., -35., -34., -33., -32., -31., -30.,
    117       -29., -28., -27., -26., -25., -24., -23., -22., -21., -20., -19.,
    118       -18., -17., -16., -15., -14., -13., -12., -11., -10.,  -9.,  -8.,
    119        -7.,  -6.,  -5.,  -4.,  -3.,  -2.,  -1.,   0.,   1.,   2.,   3.,
    120         4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.,  12.,  13.,  14.,
    121        15.,  16.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,  25.,
    122        26.,  27.,  28.,  29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,
    123        37.,  38.;
    124 
    125     expected << 0.11433274,  0.01086237, -0.10556738,
    126              -0.12684568, -0.03042119,  0.09727067,  0.13807901,  0.05120815,
    127              -0.08636798, -0.14784876, -0.07315701,  0.07274192,  0.15599932,
    128               0.09626678, -0.05623027, -0.16241278, -0.12065148,  0.03657907,
    129               0.16702466,  0.14662944, -0.01335581, -0.16985425, -0.17489907,
    130              -0.01422447,  0.17107348,  0.2069261 ,  0.04768931, -0.1711903 ,
    131              -0.24593576, -0.09033361,  0.17165081,  0.30007927,  0.15064526,
    132              -0.17759677, -0.39714981, -0.26005195,  0.22389078,  0.76519769,
    133               1.        ,  0.76519769,  0.22389078, -0.26005195, -0.39714981,
    134              -0.17759677,  0.15064526,  0.30007927,  0.17165081, -0.09033361,
    135              -0.24593576, -0.1711903 ,  0.04768931,  0.2069261 ,  0.17107348,
    136              -0.01422447, -0.17489907, -0.16985425, -0.01335581,  0.14662944,
    137               0.16702466,  0.03657907, -0.12065148, -0.16241278, -0.05623027,
    138               0.09626678,  0.15599932,  0.07274192, -0.07315701, -0.14784876,
    139              -0.08636798,  0.05120815,  0.13807901,  0.09727067, -0.03042119,
    140              -0.12684568, -0.10556738,  0.01086237,  0.11433274;
    141 
    142     CALL_SUBTEST(res = bessel_j0(x);
    143                  verify_component_wise(res, expected););
    144   }
    145 
    146   // Test Bessel function j1. Reference results obtained with SciPy.
    147   {
    148     ArrayType x(81);
    149     ArrayType expected(81);
    150     ArrayType res(81);
    151 
    152     x << -40., -39., -38., -37., -36., -35., -34., -33., -32., -31., -30.,
    153       -29., -28., -27., -26., -25., -24., -23., -22., -21., -20., -19.,
    154       -18., -17., -16., -15., -14., -13., -12., -11., -10.,  -9.,  -8.,
    155        -7.,  -6.,  -5.,  -4.,  -3.,  -2.,  -1.,   0.,   1.,   2.,   3.,
    156         4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.,  12.,  13.,  14.,
    157        15.,  16.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,  25.,
    158        26.,  27.,  28.,  29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,
    159        37.,  38.,  39.,  40.;
    160 
    161     expected << -0.12603832, -0.0640561 ,  0.05916189,  0.13058004,  0.08232981,
    162              -0.04399094, -0.13297118, -0.10061965,  0.02658903,  0.13302432,
    163               0.11875106, -0.0069342 , -0.13055149, -0.13658472, -0.01504573,
    164               0.12535025,  0.15403807,  0.03951932, -0.11717779, -0.17112027,
    165              -0.06683312,  0.10570143,  0.18799489,  0.09766849, -0.09039718,
    166              -0.20510404, -0.13337515,  0.07031805,  0.2234471 ,  0.1767853 ,
    167              -0.04347275, -0.24531179, -0.23463635,  0.00468282,  0.27668386,
    168               0.32757914,  0.06604333, -0.33905896, -0.57672481, -0.44005059,
    169               0.        ,  0.44005059,  0.57672481,  0.33905896, -0.06604333,
    170              -0.32757914, -0.27668386, -0.00468282,  0.23463635,  0.24531179,
    171               0.04347275, -0.1767853 , -0.2234471 , -0.07031805,  0.13337515,
    172               0.20510404,  0.09039718, -0.09766849, -0.18799489, -0.10570143,
    173               0.06683312,  0.17112027,  0.11717779, -0.03951932, -0.15403807,
    174              -0.12535025,  0.01504573,  0.13658472,  0.13055149,  0.0069342 ,
    175              -0.11875106, -0.13302432, -0.02658903,  0.10061965,  0.13297118,
    176               0.04399094, -0.08232981, -0.13058004, -0.05916189,  0.0640561 ,
    177               0.12603832;
    178 
    179     CALL_SUBTEST(res = bessel_j1(x);
    180                  verify_component_wise(res, expected););
    181   }
    182   // Test Bessel function k0e. Reference results obtained with SciPy.
    183   {
    184     ArrayType x(42);
    185     ArrayType expected(42);
    186     ArrayType res(42);
    187 
    188     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    189        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    190        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    191        39., 40.;
    192 
    193     expected << 1.97933385, 1.52410939, 1.14446308, 0.84156822,
    194              0.6977616 , 0.60929767, 0.54780756, 0.50186313, 0.4658451 ,
    195              0.43662302, 0.41229555, 0.39163193, 0.3737955 , 0.35819488,
    196              0.34439865, 0.33208364, 0.32100235, 0.31096159, 0.30180802,
    197              0.29341821, 0.28569149, 0.27854488, 0.2719092 , 0.26572635,
    198              0.25994703, 0.25452917, 0.2494366 , 0.24463801, 0.24010616,
    199              0.23581722, 0.23175022, 0.22788667, 0.22421014, 0.22070602,
    200              0.21736123, 0.21416406, 0.21110397, 0.20817141, 0.20535778,
    201              0.20265524, 0.20005668, 0.19755558;
    202 
    203     CALL_SUBTEST(res = bessel_k0e(x);
    204                  verify_component_wise(res, expected););
    205   }
    206 
    207   // Test Bessel function k0. Reference results obtained with SciPy.
    208   {
    209     ArrayType x(42);
    210     ArrayType expected(42);
    211     ArrayType res(42);
    212 
    213     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    214        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    215        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    216        39., 40.;
    217 
    218     expected << 1.54150675, 0.92441907, 4.21024438e-01, 1.13893873e-01,
    219              3.47395044e-02, 1.11596761e-02, 3.69109833e-03, 1.24399433e-03,
    220              4.24795742e-04, 1.46470705e-04, 5.08813130e-05, 1.77800623e-05,
    221              6.24302055e-06, 2.20082540e-06, 7.78454386e-07, 2.76137082e-07,
    222              9.81953648e-08, 3.49941166e-08, 1.24946640e-08, 4.46875334e-09,
    223              1.60067129e-09, 5.74123782e-10, 2.06176797e-10, 7.41235161e-11,
    224              2.66754511e-11, 9.60881878e-12, 3.46416156e-12, 1.24987740e-12,
    225              4.51286453e-13, 1.63053459e-13, 5.89495073e-14, 2.13247750e-14,
    226              7.71838266e-15, 2.79505752e-15, 1.01266123e-15, 3.67057597e-16,
    227              1.33103515e-16, 4.82858338e-17, 1.75232770e-17, 6.36161716e-18,
    228              2.31029936e-18, 8.39286110e-19;
    229 
    230     CALL_SUBTEST(res = bessel_k0(x);
    231                  verify_component_wise(res, expected););
    232   }
    233 
    234   // Test Bessel function k0e. Reference results obtained with SciPy.
    235   {
    236     ArrayType x(42);
    237     ArrayType expected(42);
    238     ArrayType res(42);
    239 
    240     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    241        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    242        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    243        39., 40.;
    244 
    245     expected << 1.97933385, 1.52410939, 1.14446308, 0.84156822,
    246              0.6977616 , 0.60929767, 0.54780756, 0.50186313,
    247              0.4658451 , 0.43662302, 0.41229555, 0.39163193,
    248              0.3737955 , 0.35819488, 0.34439865, 0.33208364,
    249              0.32100235, 0.31096159, 0.30180802, 0.29341821,
    250              0.28569149, 0.27854488, 0.2719092 , 0.26572635,
    251              0.25994703, 0.25452917, 0.2494366 , 0.24463801,
    252              0.24010616, 0.23581722, 0.23175022, 0.22788667,
    253              0.22421014, 0.22070602, 0.21736123, 0.21416406,
    254              0.21110397, 0.20817141, 0.20535778, 0.20265524,
    255              0.20005668, 0.19755558;
    256 
    257     CALL_SUBTEST(res = bessel_k0e(x);
    258                  verify_component_wise(res, expected););
    259   }
    260 
    261   // Test Bessel function k1. Reference results obtained with SciPy.
    262   {
    263     ArrayType x(42);
    264     ArrayType expected(42);
    265     ArrayType res(42);
    266 
    267     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    268        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    269        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    270        39., 40.;
    271 
    272     expected << 3.74702597, 1.65644112, 6.01907230e-01, 1.39865882e-01,
    273              4.01564311e-02, 1.24834989e-02, 4.04461345e-03, 1.34391972e-03,
    274              4.54182487e-04, 1.55369212e-04, 5.36370164e-05, 1.86487735e-05,
    275              6.52086067e-06, 2.29075746e-06, 8.07858841e-07, 2.85834365e-07,
    276              1.01417294e-07, 3.60715712e-08, 1.28570417e-08, 4.59124963e-09,
    277              1.64226697e-09, 5.88305797e-10, 2.11029922e-10, 7.57898116e-11,
    278              2.72493059e-11, 9.80699893e-12, 3.53277807e-12, 1.27369078e-12,
    279              4.59568940e-13, 1.65940011e-13, 5.99574032e-14, 2.16773200e-14,
    280              7.84189960e-15, 2.83839927e-15, 1.02789171e-15, 3.72416929e-16,
    281              1.34991783e-16, 4.89519373e-17, 1.77585196e-17, 6.44478588e-18,
    282              2.33973340e-18, 8.49713195e-19;
    283 
    284     CALL_SUBTEST(res = bessel_k1(x);
    285                  verify_component_wise(res, expected););
    286   }
    287 
    288   // Test Bessel function k1e. Reference results obtained with SciPy.
    289   {
    290     ArrayType x(42);
    291     ArrayType expected(42);
    292     ArrayType res(42);
    293 
    294     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    295        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    296        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    297        39., 40.;
    298 
    299     expected << 4.81127659, 2.73100971, 1.63615349, 1.03347685,
    300              0.80656348, 0.68157595, 0.60027386, 0.54217591,
    301              0.49807158, 0.46314909, 0.43462525, 0.41076657,
    302              0.39043094, 0.37283175, 0.35740757, 0.34374563,
    303              0.33153489, 0.32053597, 0.31056123, 0.30146131,
    304              0.29311559, 0.2854255 , 0.27830958, 0.27169987,
    305              0.26553913, 0.25977879, 0.25437733, 0.249299  ,
    306              0.24451285, 0.23999191, 0.2357126 , 0.23165413,
    307              0.22779816, 0.22412841, 0.22063036, 0.21729103,
    308              0.21409878, 0.21104314, 0.20811462, 0.20530466,
    309              0.20260547, 0.20000997;
    310 
    311     CALL_SUBTEST(res = bessel_k1e(x);
    312                  verify_component_wise(res, expected););
    313   }
    314 
    315   // Test Bessel function y0. Reference results obtained with SciPy.
    316   {
    317     ArrayType x(42);
    318     ArrayType expected(42);
    319     ArrayType res(42);
    320 
    321     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    322        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    323        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    324        39., 40.;
    325 
    326     expected << -0.93157302, -0.44451873, 0.08825696,  0.51037567,  0.37685001,
    327              -0.01694074, -0.30851763, -0.28819468, -0.02594974,  0.22352149,
    328              0.2499367 ,  0.05567117, -0.16884732, -0.22523731, -0.07820786,
    329              0.12719257,  0.2054643 , 0.095811  , -0.0926372 , -0.18755216,
    330              -0.10951969,  0.0626406 , 0.17020176,  0.1198876 , -0.03598179,
    331              -0.15283403, -0.12724943, 0.01204463,  0.13521498,  0.13183647,
    332              0.00948116, -0.11729573, -0.13383266, -0.02874248,  0.09913483,
    333              0.13340405,  0.04579799, -0.08085609, -0.13071488, -0.06066076,
    334              0.06262353,  0.12593642;
    335 
    336     CALL_SUBTEST(res = bessel_y0(x);
    337                  verify_component_wise(res, expected););
    338   }
    339 
    340   // Test Bessel function y1. Reference results obtained with SciPy.
    341   {
    342     ArrayType x(42);
    343     ArrayType expected(42);
    344     ArrayType res(42);
    345 
    346     x << 0.25, 0.5,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
    347        13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,
    348        26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,
    349        39., 40.;
    350 
    351     expected << -2.70410523, -1.47147239, -0.78121282, -0.10703243,
    352              0.32467442,  0.39792571,  0.14786314, -0.17501034, -0.30266724,
    353              -0.15806046,  0.10431458,  0.24901542, 0.16370554, -0.05709922,
    354              -0.21008141, -0.16664484,  0.02107363, 0.17797517,  0.16720504,
    355              0.00815513, -0.14956011, -0.16551161, -0.03253926,  0.12340586,
    356              0.1616692 ,  0.05305978, -0.09882996, -0.15579655, -0.07025124,
    357              0.07552213,  0.14803412,  0.08442557, -0.05337283, -0.13854483,
    358              -0.09578012,  0.03238588,  0.12751273, 0.10445477, -0.01262946,
    359              -0.11514066, -0.11056411, -0.00579351;
    360 
    361     CALL_SUBTEST(res = bessel_y1(x);
    362                  verify_component_wise(res, expected););
    363   }
    364 }
    365 
    366 EIGEN_DECLARE_TEST(bessel_functions)
    367 {
    368   CALL_SUBTEST_1(array_bessel_functions<ArrayXf>());
    369   CALL_SUBTEST_2(array_bessel_functions<ArrayXd>());
    370 }