00001 #include "Math/SpecFunc.h"
00002 #include <iostream>
00003 #include <cmath>
00004
00005 using std::cout;
00006 using std::endl;
00007
00008
00009
00010 double civalues[200][2]=
00011 {{-10.,-0.045456433004455373},
00012 {-9.9,-0.036763956296836376},
00013 {-9.8,-0.027519181109809388},
00014 {-9.7,-0.017804097705837473},
00015 {-9.6,-0.007707036058533522},
00016 {-9.5,0.002678058835650657},
00017 {-9.4,0.013252418669884902},
00018 {-9.3,0.02391330446927572},
00019 {-9.2,0.03455491341975988},
00020 {-9.1,0.045069332542612144},
00021 {-9.,0.055347531333133607},
00022 {-8.9,0.06528038500431541},
00023 {-8.8,0.074759719566173204},
00024 {-8.7,0.083679369633444155},
00025 {-8.6,0.091936239592257399},
00026 {-8.5,0.099431358573421916},
00027 {-8.4,0.106070919578643913},
00028 {-8.3,0.11176729308811125},
00029 {-8.2,0.116440005544566539},
00030 {-8.1,0.120016673260596569},
00031 {-8.,0.122433882532009557},
00032 {-7.9,0.123638007059717843},
00033 {-7.8,0.123585954183608557},
00034 {-7.7,0.122245831911846316},
00035 {-7.6,0.119597529284565836},
00036 {-7.5,0.11563320323793427},
00037 {-7.4,0.110357665828378243},
00038 {-7.3,0.103788666432027628},
00039 {-7.2,0.095957064345180793},
00040 {-7.1,0.08690688807134784},
00041 {-7.,0.076695278482184518},
00042 {-6.9,0.065392313975951504},
00043 {-6.8,0.053080716720199198},
00044 {-6.7,0.039855440047043456},
00045 {-6.6,0.025823138061263264},
00046 {-6.5,0.011101519514930109},
00047 {-6.4,-0.004181411011335063},
00048 {-6.3,-0.019888220609842217},
00049 {-6.2,-0.035873019273454991},
00050 {-6.1,-0.051982528980021969},
00051 {-6.,-0.068057243893247126},
00052 {-5.9,-0.083932674118556494},
00053 {-5.8,-0.099440664689378585},
00054 {-5.7,-0.114410780761679062},
00055 {-5.6,-0.128671749369807815},
00056 {-5.5,-0.142052947551519255},
00057 {-5.4,-0.154385926190724433},
00058 {-5.3,-0.165505958558927253},
00059 {-5.2,-0.175253602265659485},
00060 {-5.1,-0.183476263159298894},
00061 {-5.,-0.190029749656643879},
00062 {-4.9,-0.194779806026237225},
00063 {-4.8,-0.197603613309935236},
00064 {-4.7,-0.198391246842472852},
00065 {-4.6,-0.197047079722356195},
00066 {-4.5,-0.193491122101738757},
00067 {-4.4,-0.187660286800440685},
00068 {-4.3,-0.179509572512633253},
00069 {-4.2,-0.169013156767156739},
00070 {-4.1,-0.15616539182812111},
00071 {-4.,-0.140981697886930412},
00072 {-3.9,-0.123499349207815143},
00073 {-3.8,-0.103778150356897706},
00074 {-3.7,-0.08190100128429845},
00075 {-3.6,-0.057974351859800879},
00076 {-3.5,-0.032128548512481116},
00077 {-3.4,-0.004518077930741954},
00078 {-3.3,0.024678284607958114},
00079 {-3.2,0.055257411719942492},
00080 {-3.1,0.086991831195536989},
00081 {-3.,0.119629786008000328},
00082 {-2.9,0.152895324159588311},
00083 {-2.8,0.186488389643175768},
00084 {-2.7,0.220084878632961618},
00085 {-2.6,0.253336616062584192},
00086 {-2.5,0.285871196365383495},
00087 {-2.4,0.317291617436697984},
00088 {-2.3,0.347175617540316224},
00089 {-2.2,0.375074599049832154},
00090 {-2.1,0.40051198784439639},
00091 {-2.,0.422980828774864996},
00092 {-1.9,0.441940349681598846},
00093 {-1.8,0.456811129418336893},
00094 {-1.7,0.46696836417695463},
00095 {-1.6,0.471732516931877803},
00096 {-1.5,0.470356317195399887},
00097 {-1.4,0.462006585094677276},
00098 {-1.3,0.445738567528534523},
00099 {-1.2,0.420459182894240503},
00100 {-1.1,0.384873377424650815},
00101 {-1.,0.337403922900968135},
00102 {-0.9,0.27606783046777286},
00103 {-0.8,0.198278615952467177},
00104 {-0.7,0.100514707008897833},
00105 {-0.6,-0.022270706959279763},
00106 {-0.5,-0.177784078806612901},
00107 {-0.4,-0.378809346425244332},
00108 {-0.3,-0.649172932971161745},
00109 {-0.2,-1.042205595672781975},
00110 {-0.1,-1.727868386657296639},
00111 {0.1,-1.727868386657296639},
00112 {0.2,-1.042205595672781975},
00113 {0.3,-0.649172932971161745},
00114 {0.4,-0.3788093464252443321},
00115 {0.5,-0.1777840788066129013},
00116 {0.6,-0.02227070695927976253},
00117 {0.7,0.1005147070088978327},
00118 {0.8,0.198278615952467177},
00119 {0.9,0.2760678304677728602},
00120 {1.,0.3374039229009681347},
00121 {1.1,0.3848733774246508155},
00122 {1.2,0.4204591828942405027},
00123 {1.3,0.445738567528534523},
00124 {1.4,0.4620065850946772763},
00125 {1.5,0.4703563171953998867},
00126 {1.6,0.4717325169318778034},
00127 {1.7,0.4669683641769546303},
00128 {1.8,0.4568111294183368931},
00129 {1.9,0.4419403496815988459},
00130 {2.,0.4229808287748649957},
00131 {2.1,0.4005119878443963905},
00132 {2.2,0.375074599049832154},
00133 {2.3,0.3471756175403162244},
00134 {2.4,0.3172916174366979837},
00135 {2.5,0.2858711963653834954},
00136 {2.6,0.2533366160625841922},
00137 {2.7,0.2200848786329616183},
00138 {2.8,0.1864883896431757677},
00139 {2.9,0.1528953241595883109},
00140 {3.,0.1196297860080003276},
00141 {3.1,0.08699183119553698867},
00142 {3.2,0.05525741171994249172},
00143 {3.3,0.02467828460795811365},
00144 {3.4,-0.004518077930741953583},
00145 {3.5,-0.03212854851248111562},
00146 {3.6,-0.05797435185980087899},
00147 {3.7,-0.08190100128429845044},
00148 {3.8,-0.103778150356897706},
00149 {3.9,-0.1234993492078151427},
00150 {4.,-0.1409816978869304116},
00151 {4.1,-0.1561653918281211096},
00152 {4.2,-0.1690131567671567387},
00153 {4.3,-0.1795095725126332535},
00154 {4.4,-0.1876602868004406848},
00155 {4.5,-0.1934911221017387574},
00156 {4.6,-0.1970470797223561954},
00157 {4.7,-0.1983912468424728519},
00158 {4.8,-0.1976036133099352364},
00159 {4.9,-0.1947798060262372251},
00160 {5.,-0.1900297496566438786},
00161 {5.1,-0.1834762631592988937},
00162 {5.2,-0.1752536022656594845},
00163 {5.3,-0.1655059585589272527},
00164 {5.4,-0.1543859261907244327},
00165 {5.5,-0.1420529475515192553},
00166 {5.6,-0.1286717493698078152},
00167 {5.7,-0.1144107807616790621},
00168 {5.8,-0.09944066468937858453},
00169 {5.9,-0.08393267411855649376},
00170 {6.,-0.0680572438932471262},
00171 {6.1,-0.05198252898002196938},
00172 {6.2,-0.03587301927345499141},
00173 {6.3,-0.01988822060984221721},
00174 {6.4,-0.004181411011335062901},
00175 {6.5,0.01110151951493010868},
00176 {6.6,0.0258231380612632636},
00177 {6.7,0.03985544004704345647},
00178 {6.8,0.05308071672019919828},
00179 {6.9,0.06539231397595150445},
00180 {7.,0.07669527848218451838},
00181 {7.1,0.08690688807134783966},
00182 {7.2,0.09595706434518079339},
00183 {7.3,0.1037886664320276284},
00184 {7.4,0.1103576658283782431},
00185 {7.5,0.1156332032379342704},
00186 {7.6,0.1195975292845658358},
00187 {7.7,0.1222458319118463165},
00188 {7.8,0.1235859541836085566},
00189 {7.9,0.1236380070597178432},
00190 {8.,0.1224338825320095573},
00191 {8.1,0.1200166732605965689},
00192 {8.2,0.1164400055445665387},
00193 {8.3,0.1117672930881112503},
00194 {8.4,0.1060709195786439133},
00195 {8.5,0.09943135857342191604},
00196 {8.6,0.09193623959225739866},
00197 {8.7,0.08367936963344415541},
00198 {8.8,0.07475971956617320393},
00199 {8.9,0.06528038500431541014},
00200 {9.,0.05534753133313360709},
00201 {9.1,0.04506933254261214352},
00202 {9.2,0.03455491341975987981},
00203 {9.3,0.02391330446927571965},
00204 {9.4,0.01325241866988490234},
00205 {9.5,0.002678058835650657419},
00206 {9.6,-0.007707036058533521531},
00207 {9.7,-0.01780409770583747337},
00208 {9.8,-0.02751918110980938821},
00209 {9.9,-0.03676395629683637606},
00210 {10.,-0.04545643300445537263}};
00211
00212
00213 double sivalues[201][2]=
00214 {{-10.,-1.658347594218874049},
00215 {-9.9,-1.663384056595864698},
00216 {-9.8,-1.667569616851386723},
00217 {-9.7,-1.67084456972736341},
00218 {-9.6,-1.673156980105444773},
00219 {-9.5,-1.674463342281433091},
00220 {-9.4,-1.674729172532594998},
00221 {-9.3,-1.673929528316134798},
00222 {-9.2,-1.672049447994015827},
00223 {-9.1,-1.669084305598515127},
00224 {-9.,-1.665040075829602495},
00225 {-8.9,-1.659933505204107197},
00226 {-8.8,-1.653792186051813822},
00227 {-8.7,-1.646654530868780776},
00228 {-8.6,-1.638569645386548639},
00229 {-8.5,-1.629597099590385592},
00230 {-8.4,-1.619806596812884436},
00231 {-8.3,-1.609277541933421013},
00232 {-8.2,-1.59809851062137326},
00233 {-8.1,-1.586366622463643107},
00234 {-8.,-1.574186821706942052},
00235 {-7.9,-1.561671070214550172},
00236 {-7.8,-1.548937458077995749},
00237 {-7.7,-1.53610923812865961},
00238 {-7.6,-1.523313791355258246},
00239 {-7.5,-1.510681530943385878},
00240 {-7.4,-1.498344753306055538},
00241 {-7.3,-1.486436445063168036},
00242 {-7.2,-1.475089055447246115},
00243 {-7.1,-1.46443324405734104},
00244 {-7.,-1.454596614248093591},
00245 {-6.9,-1.445702442722501157},
00246 {-6.8,-1.437868416091684784},
00247 {-6.7,-1.43120538527026366},
00248 {-6.6,-1.425816148589978626},
00249 {-6.5,-1.421794274435881687},
00250 {-6.4,-1.419222974038433272},
00251 {-6.3,-1.418174034791727003},
00252 {-6.2,-1.418706824114094167},
00253 {-6.1,-1.420867373424620212},
00254 {-6.,-1.424687551280506536},
00255 {-5.9,-1.430184334109366196},
00256 {-5.8,-1.437359182281820432},
00257 {-5.7,-1.446197528508234603},
00258 {-5.6,-1.456668384714831391},
00259 {-5.5,-1.468724072665098669},
00260 {-5.4,-1.482300082649290016},
00261 {-5.3,-1.497315063575331138},
00262 {-5.2,-1.513670946766480634},
00263 {-5.1,-1.531253204712921712},
00264 {-5.,-1.549931244944674137},
00265 {-4.9,-1.569558938100652056},
00266 {-4.8,-1.589975278172365569},
00267 {-4.7,-1.611005171809781381},
00268 {-4.6,-1.63246035250034989},
00269 {-4.5,-1.654140414379243984},
00270 {-4.4,-1.675833959408374161},
00271 {-4.3,-1.697319850682468461},
00272 {-4.2,-1.718368563690868599},
00273 {-4.1,-1.738743626491768926},
00274 {-4.,-1.758203138949053058},
00275 {-3.9,-1.776501360447805439},
00276 {-3.8,-1.793390354849570171},
00277 {-3.7,-1.80862168087845377},
00278 {-3.6,-1.821948115649503541},
00279 {-3.5,-1.833125398665997048},
00280 {-3.4,-1.841913983326143036},
00281 {-3.3,-1.848080782795211419},
00282 {-3.2,-1.851400897018440279},
00283 {-3.1,-1.851659307674519836},
00284 {-3.,-1.848652527999468256},
00285 {-2.9,-1.842190194645858628},
00286 {-2.8,-1.832096589081322327},
00287 {-2.7,-1.818212076470866054},
00288 {-2.6,-1.80039445052677016},
00289 {-2.5,-1.778520173443826642},
00290 {-2.4,-1.752485500761767386},
00291 {-2.3,-1.722207481805503392},
00292 {-2.2,-1.68762482724109852},
00293 {-2.1,-1.64869863624441878},
00294 {-2.,-1.605412976802694849},
00295 {-1.9,-1.55777531374881852},
00296 {-1.8,-1.505816780255578572},
00297 {-1.7,-1.449592289683321133},
00298 {-1.6,-1.389180485870438428},
00299 {-1.5,-1.32468353117211968},
00300 {-1.4,-1.256226732779217943},
00301 {-1.3,-1.183958009076062919},
00302 {-1.2,-1.10804719901371859},
00303 {-1.1,-1.028685218673733522},
00304 {-1.,-0.9460830703671830149},
00305 {-0.9,-0.8604707107452929328},
00306 {-0.8,-0.7720957854819965603},
00307 {-0.7,-0.6812222391166113109},
00308 {-0.6,-0.5881288096080800669},
00309 {-0.5,-0.4931074180430666892},
00310 {-0.4,-0.396461464751372883},
00311 {-0.3,-0.2985040438070431614},
00312 {-0.2,-0.1995560885262338214},
00313 {-0.1,-0.09994446110827695016},
00314 {0,0},
00315 {0.1,0.09994446110827695016},
00316 {0.2,0.1995560885262338214},
00317 {0.3,0.2985040438070431614},
00318 {0.4,0.396461464751372883},
00319 {0.5,0.4931074180430666892},
00320 {0.6,0.5881288096080800669},
00321 {0.7,0.6812222391166113109},
00322 {0.8,0.7720957854819965603},
00323 {0.9,0.8604707107452929328},
00324 {1.,0.9460830703671830149},
00325 {1.1,1.028685218673733522},
00326 {1.2,1.10804719901371859},
00327 {1.3,1.183958009076062919},
00328 {1.4,1.256226732779217943},
00329 {1.5,1.32468353117211968},
00330 {1.6,1.389180485870438428},
00331 {1.7,1.449592289683321133},
00332 {1.8,1.505816780255578572},
00333 {1.9,1.55777531374881852},
00334 {2.,1.605412976802694849},
00335 {2.1,1.64869863624441878},
00336 {2.2,1.68762482724109852},
00337 {2.3,1.722207481805503392},
00338 {2.4,1.752485500761767386},
00339 {2.5,1.778520173443826642},
00340 {2.6,1.80039445052677016},
00341 {2.7,1.818212076470866054},
00342 {2.8,1.832096589081322327},
00343 {2.9,1.842190194645858628},
00344 {3.,1.848652527999468256},
00345 {3.1,1.851659307674519836},
00346 {3.2,1.851400897018440279},
00347 {3.3,1.848080782795211419},
00348 {3.4,1.841913983326143036},
00349 {3.5,1.833125398665997048},
00350 {3.6,1.821948115649503541},
00351 {3.7,1.80862168087845377},
00352 {3.8,1.793390354849570171},
00353 {3.9,1.776501360447805439},
00354 {4.,1.758203138949053058},
00355 {4.1,1.738743626491768926},
00356 {4.2,1.718368563690868599},
00357 {4.3,1.697319850682468461},
00358 {4.4,1.675833959408374161},
00359 {4.5,1.654140414379243984},
00360 {4.6,1.63246035250034989},
00361 {4.7,1.611005171809781381},
00362 {4.8,1.589975278172365569},
00363 {4.9,1.569558938100652056},
00364 {5.,1.549931244944674137},
00365 {5.1,1.531253204712921712},
00366 {5.2,1.513670946766480634},
00367 {5.3,1.497315063575331138},
00368 {5.4,1.482300082649290016},
00369 {5.5,1.468724072665098669},
00370 {5.6,1.456668384714831391},
00371 {5.7,1.446197528508234603},
00372 {5.8,1.437359182281820432},
00373 {5.9,1.430184334109366196},
00374 {6.,1.424687551280506536},
00375 {6.1,1.420867373424620212},
00376 {6.2,1.418706824114094167},
00377 {6.3,1.418174034791727003},
00378 {6.4,1.419222974038433272},
00379 {6.5,1.421794274435881687},
00380 {6.6,1.425816148589978626},
00381 {6.7,1.43120538527026366},
00382 {6.8,1.437868416091684784},
00383 {6.9,1.445702442722501157},
00384 {7.,1.454596614248093591},
00385 {7.1,1.46443324405734104},
00386 {7.2,1.475089055447246115},
00387 {7.3,1.486436445063168036},
00388 {7.4,1.498344753306055538},
00389 {7.5,1.510681530943385878},
00390 {7.6,1.523313791355258246},
00391 {7.7,1.53610923812865961},
00392 {7.8,1.548937458077995749},
00393 {7.9,1.561671070214550172},
00394 {8.,1.574186821706942052},
00395 {8.1,1.586366622463643107},
00396 {8.2,1.59809851062137326},
00397 {8.3,1.609277541933421013},
00398 {8.4,1.619806596812884436},
00399 {8.5,1.629597099590385592},
00400 {8.6,1.638569645386548639},
00401 {8.7,1.646654530868780776},
00402 {8.8,1.653792186051813822},
00403 {8.9,1.659933505204107197},
00404 {9.,1.665040075829602495},
00405 {9.1,1.669084305598515127},
00406 {9.2,1.672049447994015827},
00407 {9.3,1.673929528316134798},
00408 {9.4,1.674729172532594998},
00409 {9.5,1.674463342281433091},
00410 {9.6,1.673156980105444773},
00411 {9.7,1.67084456972736341},
00412 {9.8,1.667569616851386723},
00413 {9.9,1.663384056595864698},
00414 {10.,1.658347594218874049}};
00415
00416 int testSiCi() {
00417 int fail = 0;
00418 double xmaxrel = -1, maxrel = 0, xmaxabs=-1, maxabs=0;
00419 for (int i = 0; i < 201; ++i) {
00420 double x = sivalues[i][0];
00421 double SiMathematica = sivalues[i][1];
00422 double SiRoot = ROOT::Math::sinint(x);
00423 if (std::abs(SiRoot-SiMathematica) > maxabs) {
00424 maxabs = std::fabs(SiRoot-SiMathematica);
00425 xmaxabs = x;
00426 }
00427 if (std::abs(SiRoot/SiMathematica-1) > maxrel) {
00428 maxrel = std::abs(SiRoot/SiMathematica-1);
00429 xmaxrel = x;
00430 }
00431
00432
00433
00434
00435
00436 }
00437 cout << "Si: Maximum relative deviation: " << maxrel
00438 << " for x=" << xmaxrel
00439 << (maxrel > 1E-15 ? " -> FAIL" : " -> pass") << endl;
00440 cout << "Si: Maximum absolute deviation: " << maxabs
00441 << " for x=" << xmaxabs
00442 << (maxabs > 1E-15 ? " -> FAIL" : " -> pass") << endl;
00443 if (maxrel > 1E-15) fail += 1;
00444 if (maxabs > 1E-15) fail += 2;
00445
00446 xmaxrel = -1; maxrel = 0; xmaxabs=-1; maxabs=0;
00447 for (int i = 0; i < 200; ++i) {
00448 double x = civalues[i][0];
00449 double CiMathematica = civalues[i][1];
00450 double CiRoot = ROOT::Math::cosint(x);
00451 if (std::fabs(CiRoot-CiMathematica) > maxabs) {
00452 maxabs = std::fabs(CiRoot-CiMathematica);
00453 xmaxabs = x;
00454 }
00455 if (std::fabs(CiRoot/CiMathematica-1) > maxrel) {
00456 maxrel = std::fabs(CiRoot/CiMathematica-1);
00457 xmaxrel = x;
00458 }
00459
00460
00461
00462
00463 }
00464 cout << "Ci: Maximum relative deviation: " << maxrel
00465 << " for x=" << xmaxrel
00466 << (maxrel > 1E-13 ? " -> FAIL" : " -> pass") <<endl;
00467 cout << "Ci: Maximum absolute deviation: " << maxabs
00468 << " for x=" << xmaxabs
00469 << (maxabs > 1E-15 ? " -> FAIL" : " -> pass")<< endl;
00470
00471 if (maxrel > 1E-13) fail += 4;
00472 if (maxabs > 1E-15) fail += 8;
00473 return fail;
00474 }
00475
00476 int testSpecFuncSiCi() {
00477 int status = testSiCi();
00478 std::cerr << "Test Special Function Sin integral and Cos integral :\t";
00479 if (status) std::cout << "FAILED !!!" << std::endl;
00480 else
00481 std::cerr << "OK " << std::endl;
00482 return status;
00483 }
00484
00485 int main() {
00486 return testSpecFuncSiCi();
00487 }