gsl_specfunc__bessel_olver.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. /* specfunc/bessel_olver.c
  2. *
  3. * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 3 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. */
  19. /* Author: G. Jungman */
  20. #include "gsl__config.h"
  21. #include "gsl_math.h"
  22. #include "gsl_errno.h"
  23. #include "gsl_sf_airy.h"
  24. #include "gsl_specfunc__error.h"
  25. #include "gsl_specfunc__bessel.h"
  26. #include "gsl_specfunc__bessel_olver.h"
  27. #include "gsl_specfunc__chebyshev.h"
  28. #include "gsl_specfunc__cheb_eval.c"
  29. /* fit for f(x) = zofmzeta((x+1)/2), 0 <= mzeta <= 1 */
  30. static double zofmzeta_a_data[20] = {
  31. 2.9332563730829348990,
  32. 0.4896518224847036624,
  33. 0.0228637617355380860,
  34. -0.0001715731377284693,
  35. -0.0000105927538148751,
  36. 1.0595602530419e-6,
  37. -4.68016051691e-8,
  38. 5.8310020e-12,
  39. 1.766537581e-10,
  40. -1.45034640e-11,
  41. 4.357772e-13,
  42. 4.60971e-14,
  43. -2.57571e-14,
  44. 2.26468e-14,
  45. -2.22053e-14,
  46. 2.08593e-14,
  47. -1.84454e-14,
  48. 1.50150e-14,
  49. -1.06506e-14,
  50. 5.5375e-15
  51. };
  52. static cheb_series zofmzeta_a_cs = {
  53. zofmzeta_a_data,
  54. 19,
  55. -1,1,
  56. 8
  57. };
  58. /* fit for f(x) = zofmzeta((9x+11)/2), 1 <= mzeta <= 10 */
  59. static double zofmzeta_b_data[30] = {
  60. 22.40725276466303489,
  61. 10.39808258825165581,
  62. 1.092050144486018425,
  63. -0.071111274777921604,
  64. 0.008990125336059704,
  65. -0.001201950338088875,
  66. 0.000106686807968315,
  67. 0.000017406491576830,
  68. -0.000014946669657805,
  69. 6.189984487752e-6,
  70. -2.049466715178e-6,
  71. 5.87189458020e-7,
  72. -1.46077514157e-7,
  73. 2.9803936132e-8,
  74. -3.817692108e-9,
  75. -4.66980416e-10,
  76. 5.83860334e-10,
  77. -2.78825299e-10,
  78. 1.01682688e-10,
  79. -3.1209928e-11,
  80. 8.111122e-12,
  81. -1.663986e-12,
  82. 1.81364e-13,
  83. 5.3414e-14,
  84. -4.7234e-14,
  85. 2.1689e-14,
  86. -7.815e-15,
  87. 2.371e-15,
  88. -6.04e-16,
  89. 1.20e-16
  90. };
  91. static cheb_series zofmzeta_b_cs = {
  92. zofmzeta_b_data,
  93. 29,
  94. -1,1,
  95. 15
  96. };
  97. /* fit for f(x) = zofmzeta(mz(x))/mz(x)^(3/2),
  98. * mz(x) = (2/(x+1))^(2/3) 10
  99. * 10 <= mzeta <= Inf
  100. */
  101. static double zofmzeta_c_data[11] = {
  102. 1.3824761227122911500,
  103. 0.0244856101686774245,
  104. -0.0000842866496282540,
  105. 1.4656076569771e-6,
  106. -3.14874099476e-8,
  107. 7.561134833e-10,
  108. -1.94531643e-11,
  109. 5.245878e-13,
  110. -1.46380e-14,
  111. 4.192e-16,
  112. -1.23e-17
  113. };
  114. static cheb_series zofmzeta_c_cs = {
  115. zofmzeta_c_data,
  116. 10,
  117. -1,1,
  118. 6
  119. };
  120. /* Invert [Abramowitz+Stegun, 9.3.39].
  121. * Assumes minus_zeta >= 0.
  122. */
  123. double
  124. gsl_sf_bessel_Olver_zofmzeta(double minus_zeta)
  125. {
  126. if(minus_zeta < 1.0) {
  127. const double x = 2.0*minus_zeta - 1.0;
  128. gsl_sf_result c;
  129. cheb_eval_e(&zofmzeta_a_cs, x, &c);
  130. return c.val;
  131. }
  132. else if(minus_zeta < 10.0) {
  133. const double x = (2.0*minus_zeta - 11.0)/9.0;
  134. gsl_sf_result c;
  135. cheb_eval_e(&zofmzeta_b_cs, x, &c);
  136. return c.val;
  137. }
  138. else {
  139. const double TEN_32 = 31.62277660168379332; /* 10^(3/2) */
  140. const double p = pow(minus_zeta, 3.0/2.0);
  141. const double x = 2.0*TEN_32/p - 1.0;
  142. gsl_sf_result c;
  143. cheb_eval_e(&zofmzeta_c_cs, x, &c);
  144. return c.val * p;
  145. }
  146. }
  147. /* Chebyshev fit for f(x) = z(x)^6 A_3(z(x)), z(x) = 22/(10(x+1)) */
  148. static double A3_gt1_data[31] = {
  149. -0.123783199829515294670493131190,
  150. 0.104636462534700704670877382304,
  151. -0.067500816575851826744877535903,
  152. 0.035563362418888483652711005520,
  153. -0.0160738524035979408472979609051,
  154. 0.0064497878252851092073278056238,
  155. -0.00235408261133449663958121821593,
  156. 0.00079545702851302155411892534965,
  157. -0.00025214920745855079895784825637,
  158. 0.00007574004596069392921153301833,
  159. -0.00002172917966339623434407978263,
  160. 5.9914810727868915476543145465e-06,
  161. -1.5958781571808992162953719817e-06,
  162. 4.1232986512903717525448312012e-07,
  163. -1.0369725993417659101913919101e-07,
  164. 2.5457982304266541145999235022e-08,
  165. -6.1161715053791743082427422443e-09,
  166. 1.4409346199138658887871461320e-09,
  167. -3.3350445956255561668232014995e-10,
  168. 7.5950686572918996453336138108e-11,
  169. -1.7042296334409430377389900278e-11,
  170. 3.7723525020626230919721640081e-12,
  171. -8.2460237635733980528416501227e-13,
  172. 1.7816961527997797696251868875e-13,
  173. -3.8084101506541792942694560802e-14,
  174. 8.0593669930916099079755351563e-15,
  175. -1.6896565961641739017452636964e-15,
  176. 3.5115651805888443184822853595e-16,
  177. -7.2384771938569255638904297651e-17,
  178. 1.4806598977677176106283840244e-17,
  179. -3.0069285750787303634897997963e-18
  180. };
  181. static cheb_series A3_gt1_cs = {
  182. A3_gt1_data,
  183. 30,
  184. -1,1,
  185. 17
  186. };
  187. /* chebyshev expansion for f(x) = z(x)^8 A_4(z(x)), z(x) = 12/(5(x+1)) */
  188. static double A4_gt1_data[30] = {
  189. 1.15309329391198493586724229008,
  190. -1.01812701728669338904729927846,
  191. 0.71964022270555684403652781941,
  192. -0.42359963977172689685150061355,
  193. 0.215024488759339557817435404261,
  194. -0.096751915348145944032096342479,
  195. 0.039413982058824310099856035361,
  196. -0.014775225692561697963781115014,
  197. 0.005162114514159370516947823271,
  198. -0.00169783446445524322560925166335,
  199. 0.00052995667873006847211519193478,
  200. -0.00015802027574996477115667974856,
  201. 0.000045254366680989687988902825193,
  202. -0.000012503722965474638015488600967,
  203. 3.3457656998119148699124716204e-06,
  204. -8.6981575241150758412492331833e-07,
  205. 2.2030895484325645640823940625e-07,
  206. -5.4493369492600677068285936533e-08,
  207. 1.3190457281724829107139385556e-08,
  208. -3.1301560183377379158951191769e-09,
  209. 7.2937802527123344842593076131e-10,
  210. -1.6712080137945140407348940109e-10,
  211. 3.7700053248213600430503521194e-11,
  212. -8.3824538848817227637828899571e-12,
  213. 1.8388741910049766865274037194e-12,
  214. -3.9835919980753778560117573063e-13,
  215. 8.5288827136546615604290389711e-14,
  216. -1.8060227869114416998653266836e-14,
  217. 3.7849342199690728470461022877e-15,
  218. -7.8552867468122209577151823365e-16
  219. };
  220. static cheb_series A4_gt1_cs = {
  221. A4_gt1_data,
  222. 17, /* 29, */
  223. -1, 1,
  224. 17
  225. };
  226. /* Chebyshev fit for f(x) = z(x)^3 B_2(z(x)), z(x) = 12/(5(x+1)) */
  227. static double B2_gt1_data[40] = {
  228. 0.00118587147272683864479328868589,
  229. 0.00034820459990648274622193981840,
  230. -0.00030411304425639768103075864567,
  231. 0.00002812066284012343531484682886,
  232. 0.00004493525295901613184489898748,
  233. -0.00003037629997093072196779489677,
  234. 0.00001125979647123875721949743970,
  235. -2.4832533969517775991951008218e-06,
  236. -9.9003813640537799587086928278e-08,
  237. 4.9259859656183110299492296029e-07,
  238. -3.7644120964426705960749504975e-07,
  239. 2.2887828521334625189639122509e-07,
  240. -1.3202687370822203731489855050e-07,
  241. 7.7019669092537400811434860763e-08,
  242. -4.6589706973010511603890144294e-08,
  243. 2.9396476233013923711978522963e-08,
  244. -1.9293230611988282919101954538e-08,
  245. 1.3099107013728717842406906896e-08,
  246. -9.1509111940885962831104149355e-09,
  247. 6.5483472971925614347299375295e-09,
  248. -4.7831253582139967461241674569e-09,
  249. 3.5562625457426178152760148639e-09,
  250. -2.6853389444008414186916562103e-09,
  251. 2.0554738667134200145781857289e-09,
  252. -1.5923172019517426277886522758e-09,
  253. 1.2465923213464381457319481498e-09,
  254. -9.8494846881180588507969988989e-10,
  255. 7.8438674499372126663957464312e-10,
  256. -6.2877567918342950225937136855e-10,
  257. 5.0662318868755257959686944117e-10,
  258. -4.0962270881243451160378710952e-10,
  259. 3.3168684677374908553161911299e-10,
  260. -2.6829406619847450633596163305e-10,
  261. 2.1603988122184568375561077873e-10,
  262. -1.7232373309560278402012124481e-10,
  263. 1.3512709089611470626617830434e-10,
  264. -1.0285354732538663013167579792e-10,
  265. 7.4211345443901713467637018423e-11,
  266. -4.8124980266864320351456993068e-11,
  267. 2.3666534694476306077416831958e-11
  268. };
  269. static cheb_series B2_gt1_cs = {
  270. B2_gt1_data,
  271. 39,
  272. -1, 1,
  273. 30
  274. };
  275. /* Chebyshev fit for f(x) = z(x)^6 B_3(z(x)), z(x) = 12/(5(x+1)) */
  276. static double B3_gt1_data[30] = {
  277. -0.0102445379362695740863663926486,
  278. 0.0036618484329295342954730801917,
  279. 0.0026154252498599303282569321117,
  280. -0.0036187389410353156728771706336,
  281. 0.0021878564157692275944613452462,
  282. -0.0008219952303590803584426516821,
  283. 0.0001281773889155631494321316520,
  284. 0.0001000944653368032985720548637,
  285. -0.0001288293344663774273453147788,
  286. 0.00010136264202696513867821487205,
  287. -0.00007000275849659556221916572733,
  288. 0.00004694886396757430431607955146,
  289. -0.00003190003869717837686356945696,
  290. 0.00002231453668447775219665947479,
  291. -0.00001611102197712439539300336438,
  292. 0.00001196634424990735214466633513,
  293. -9.0986920398931223804111374679e-06,
  294. 7.0492613694235423068926562567e-06,
  295. -5.5425216624642184684300615394e-06,
  296. 4.4071884714230296614449244106e-06,
  297. -3.5328595506791663127928952625e-06,
  298. 2.84594975572077091520522824686e-06,
  299. -2.29592697828824392391071619788e-06,
  300. 1.84714740375289956396370322228e-06,
  301. -1.47383331248116454652025598620e-06,
  302. 1.15687781098593231076084710267e-06,
  303. -8.8174688524627071175315084910e-07,
  304. 6.3705856964426840441434605593e-07,
  305. -4.1358791499961929237755474814e-07,
  306. 2.0354151158738819867477996807e-07
  307. };
  308. static cheb_series B3_gt1_cs = {
  309. B3_gt1_data,
  310. 29,
  311. -1, 1,
  312. 29
  313. };
  314. /* Chebyshev fit for f(x) = z(x) B_2(z(x)), z(x) = 2(x+1)/5 */
  315. static double B2_lt1_data[40] = {
  316. 0.00073681565841337130021924199490,
  317. 0.00033803599647571227535304316937,
  318. -0.00008251723219239754024210552679,
  319. -0.00003390879948656432545900779710,
  320. 0.00001961398056848881816694014889,
  321. -2.35593745904151401624656805567e-06,
  322. -1.79055017080406086541563835433e-06,
  323. 1.33129571185610681090725934031e-06,
  324. -5.38879444715436544130673956170e-07,
  325. 1.49603056041381416881299945557e-07,
  326. -1.83377228267274327911131293091e-08,
  327. -1.33191430762944336526965187651e-08,
  328. 1.60642096463700438411396889489e-08,
  329. -1.28932576330421806740136816643e-08,
  330. 9.6169275086179165484403221944e-09,
  331. -7.1818502280703532276832887290e-09,
  332. 5.4744009217215145730697754561e-09,
  333. -4.2680446690508456935030086136e-09,
  334. 3.3941665009266174865683284781e-09,
  335. -2.7440714072221673882163135170e-09,
  336. 2.2488361522108255229193038962e-09,
  337. -1.8638240716608748862087923337e-09,
  338. 1.5592350940805373500866440401e-09,
  339. -1.3145743937732330609242633070e-09,
  340. 1.1153716777215047842790244968e-09,
  341. -9.5117576805266622854647303110e-10,
  342. 8.1428799553234876296804561100e-10,
  343. -6.9893770813548773664326279169e-10,
  344. 6.0073113636087448745018831981e-10,
  345. -5.1627434258513453901420776514e-10,
  346. 4.4290993195074905891788459756e-10,
  347. -3.7852978599966867611179315200e-10,
  348. 3.2143959338863177145307610452e-10,
  349. -2.7025926680620777594992221143e-10,
  350. 2.2384857772457918539228234321e-10,
  351. -1.8125071664276678046551271701e-10,
  352. 1.4164870008713668767293008546e-10,
  353. -1.0433101857132782485813325981e-10,
  354. 6.8663910168392483929411418190e-11,
  355. -3.4068313177952244040559740439e-11
  356. };
  357. static cheb_series B2_lt1_cs = {
  358. B2_lt1_data,
  359. 39,
  360. -1, 1,
  361. 39
  362. };
  363. /* Chebyshev fit for f(x) = B_3(2(x+1)/5) */
  364. static double B3_lt1_data[40] = {
  365. -0.00137160820526992057354001614451,
  366. -0.00025474937951101049982680561302,
  367. 0.00024762975547895881652073467771,
  368. 0.00005229657281480196749313930265,
  369. -0.00007488354272621512385016593760,
  370. 0.00001416880012891046449980449746,
  371. 0.00001528986060172183690742576230,
  372. -0.00001668672297078590514293325326,
  373. 0.00001061765189536459018739585094,
  374. -5.8220577442406209989680801335e-06,
  375. 3.3322423743855900506302033234e-06,
  376. -2.23292405803003860894449897815e-06,
  377. 1.74816651036678291794777245325e-06,
  378. -1.49581306041395051804547535093e-06,
  379. 1.32759146107893129050610165582e-06,
  380. -1.19376077392564467408373553343e-06,
  381. 1.07878303863211630544654040875e-06,
  382. -9.7743335011819134006676476250e-07,
  383. 8.8729318903693324226127054792e-07,
  384. -8.0671146292125665050876015280e-07,
  385. 7.3432860378667354971042255937e-07,
  386. -6.6897926072697370325310483359e-07,
  387. 6.0966619703735610352576581485e-07,
  388. -5.5554095284507959561958605420e-07,
  389. 5.0588335673197236002812826526e-07,
  390. -4.6008146297767601862670079590e-07,
  391. 4.1761348515688145911438168306e-07,
  392. -3.7803230006989446874174476515e-07,
  393. 3.4095248501364300041684648230e-07,
  394. -3.0603959751354749520615015472e-07,
  395. 2.7300134179365690589640458993e-07,
  396. -2.4158028250762304756044254231e-07,
  397. 2.1154781038298751985689113868e-07,
  398. -1.8269911328756771201465223313e-07,
  399. 1.5484895085808513749026173074e-07,
  400. -1.2782806851555809369226440495e-07,
  401. 1.0148011725394892565174207341e-07,
  402. -7.5658969771439627809239950461e-08,
  403. 5.0226342286491286957075289622e-08,
  404. -2.5049645660259882970547555831e-08
  405. };
  406. static cheb_series B3_lt1_cs = {
  407. B3_lt1_data,
  408. 39,
  409. -1, 1,
  410. 39
  411. };
  412. /* Chebyshev fit for f(x) = A_3(9(x+1)/20) */
  413. static double A3_lt1_data[40] = {
  414. -0.00017982561472134418587634980117,
  415. -0.00036558603837525275836608884064,
  416. -0.00002819398055929628850294406363,
  417. 0.00016704539863875736769812786067,
  418. -0.00007098969970347674307623044850,
  419. -8.4470843942344237748899879940e-06,
  420. 0.0000273413090343147765148014327150,
  421. -0.0000199073838489821681991178018081,
  422. 0.0000100004176278235088881096950105,
  423. -3.9739852013143676487867902026e-06,
  424. 1.2265357766449574306882693267e-06,
  425. -1.88755584306424047416914864854e-07,
  426. -1.37482206060161206336523452036e-07,
  427. 2.10326379301853336795686477738e-07,
  428. -2.05583778245412633433934301948e-07,
  429. 1.82377384812654863038691147988e-07,
  430. -1.58130247846381041027699152436e-07,
  431. 1.36966982725588978654041029615e-07,
  432. -1.19250280944620257443805710485e-07,
  433. 1.04477169029350256435316644493e-07,
  434. -9.2064832489437534542041040184e-08,
  435. 8.1523798290458784610230199344e-08,
  436. -7.2471794980050867512294061891e-08,
  437. 6.4614432955971132569968860233e-08,
  438. -5.7724095125560946811081322985e-08,
  439. 5.1623107567436835158110947901e-08,
  440. -4.6171250746798606260216486042e-08,
  441. 4.1256621998650164023254101585e-08,
  442. -3.6788925543159819135102047082e-08,
  443. 3.2694499457951844422299750661e-08,
  444. -2.89125899697964696586521743928e-08,
  445. 2.53925288725374047626589488217e-08,
  446. -2.20915707933726481321465184207e-08,
  447. 1.89732166352720474944407102940e-08,
  448. -1.60058977893259856012119939554e-08,
  449. 1.31619294542205876946742394494e-08,
  450. -1.04166651771938038563454275883e-08,
  451. 7.7478015858156185064152078434e-09,
  452. -5.1347942579352613057675111787e-09,
  453. 2.5583541594586723967261504321e-09
  454. };
  455. static cheb_series A3_lt1_cs = {
  456. A3_lt1_data,
  457. 39,
  458. -1, 1,
  459. 39
  460. };
  461. /* chebyshev fit for f(x) = A_4(2(x+1)/5) */
  462. static double A4_lt1_data[30] = {
  463. 0.00009054703770051610946958226736,
  464. 0.00033066000498098017589672988293,
  465. 0.00019737453734363989127226073272,
  466. -0.00015490809725932037720034762889,
  467. -0.00004514948935538730085479280454,
  468. 0.00007976881782603940889444573924,
  469. -0.00003314566154544740986264993251,
  470. -1.88212148790135672249935711657e-06,
  471. 0.0000114788756505519986352882940648,
  472. -9.2263039911196207101468331210e-06,
  473. 5.1401128250377780476084336340e-06,
  474. -2.38418218951722002658891397905e-06,
  475. 1.00664292214481531598338960828e-06,
  476. -4.23224678096490060264249970540e-07,
  477. 2.00132031535793489976535190025e-07,
  478. -1.18689501178886741400633921047e-07,
  479. 8.7819524319114212999768013738e-08,
  480. -7.3964150324206644900787216386e-08,
  481. 6.5780431507637165113885884236e-08,
  482. -5.9651053193022652369837650411e-08,
  483. 5.4447762662767276209052293773e-08,
  484. -4.9802057381568863702541294988e-08,
  485. 4.5571368194694340198117635845e-08,
  486. -4.1682117173547642845382848197e-08,
  487. 3.8084701352766049815367147717e-08,
  488. -3.4740302885185237434662649907e-08,
  489. 3.1616557064701510611273692060e-08,
  490. -2.8685739487689556252374879267e-08,
  491. 2.5923752117132254429002796600e-08,
  492. -2.3309428552190587304662883477e-08
  493. };
  494. static cheb_series A4_lt1_cs = {
  495. A4_lt1_data,
  496. 29,
  497. -1, 1,
  498. 29
  499. };
  500. static double olver_B0(double z, double abs_zeta)
  501. {
  502. if(z < 0.98) {
  503. const double t = 1.0/sqrt(1.0-z*z);
  504. return -5.0/(48.0*abs_zeta*abs_zeta) + t*(-3.0 + 5.0*t*t)/(24.0*sqrt(abs_zeta));
  505. }
  506. else if(z < 1.02) {
  507. const double a = 1.0-z;
  508. const double c0 = 0.0179988721413553309252458658183;
  509. const double c1 = 0.0111992982212877614645974276203;
  510. const double c2 = 0.0059404069786014304317781160605;
  511. const double c3 = 0.0028676724516390040844556450173;
  512. const double c4 = 0.0012339189052567271708525111185;
  513. const double c5 = 0.0004169250674535178764734660248;
  514. const double c6 = 0.0000330173385085949806952777365;
  515. const double c7 = -0.0001318076238578203009990106425;
  516. const double c8 = -0.0001906870370050847239813945647;
  517. return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*(c7 + a*c8)))))));
  518. }
  519. else {
  520. const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
  521. return -5.0/(48.0*abs_zeta*abs_zeta) + t*(3.0 + 5.0*t*t)/(24.0*sqrt(abs_zeta));
  522. }
  523. }
  524. static double olver_B1(double z, double abs_zeta)
  525. {
  526. if(z < 0.88) {
  527. const double t = 1.0/sqrt(1.0-z*z);
  528. const double t2 = t*t;
  529. const double rz = sqrt(abs_zeta);
  530. const double z32 = rz*rz*rz;
  531. const double z92 = z32*z32*z32;
  532. const double term1 = t*t*t * (30375.0 - 369603.0*t2 + 765765.0*t2*t2 - 425425.0*t2*t2*t2)/414720.0;
  533. const double term2 = 85085.0/(663552.0*z92);
  534. const double term3 = 385.0/110592.*t*(3.0-5.0*t2)/(abs_zeta*abs_zeta*abs_zeta);
  535. const double term4 = 5.0/55296.0*t2*(81.0 - 462.0*t2 + 385.0*t2*t2)/z32;
  536. return -(term1 + term2 + term3 + term4)/rz;
  537. }
  538. else if(z < 1.12) {
  539. const double a = 1.0-z;
  540. const double c0 = -0.00149282953213429172050073403334;
  541. const double c1 = -0.00175640941909277865678308358128;
  542. const double c2 = -0.00113346148874174912576929663517;
  543. const double c3 = -0.00034691090981382974689396961817;
  544. const double c4 = 0.00022752516104839243675693256916;
  545. const double c5 = 0.00051764145724244846447294636552;
  546. const double c6 = 0.00058906174858194233998714243010;
  547. const double c7 = 0.00053485514521888073087240392846;
  548. const double c8 = 0.00042891792986220150647633418796;
  549. const double c9 = 0.00031639765900613633260381972850;
  550. const double c10 = 0.00021908147678699592975840749194;
  551. return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10)))))))));
  552. }
  553. else {
  554. const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
  555. const double t2 = t*t;
  556. const double rz = sqrt(abs_zeta);
  557. const double z32 = rz*rz*rz;
  558. const double z92 = z32*z32*z32;
  559. const double term1 = -t2*t * (30375.0 + 369603.0*t2 + 765765.0*t2*t2 + 425425.0*t2*t2*t2)/414720.0;
  560. const double term2 = 85085.0/(663552.0*z92);
  561. const double term3 = -385.0/110592.0*t*(3.0+5.0*t2)/(abs_zeta*abs_zeta*abs_zeta);
  562. const double term4 = 5.0/55296.0*t2*(81.0 + 462.0*t2 + 385.0*t2*t2)/z32;
  563. return (term1 + term2 + term3 + term4)/rz;
  564. }
  565. }
  566. static double olver_B2(double z, double abs_zeta)
  567. {
  568. if(z < 0.8) {
  569. const double x = 5.0*z/2.0 - 1.0;
  570. gsl_sf_result c;
  571. cheb_eval_e(&B2_lt1_cs, x, &c);
  572. return c.val / z;
  573. }
  574. else if(z <= 1.2) {
  575. const double a = 1.0-z;
  576. const double c0 = 0.00055221307672129279005986982501;
  577. const double c1 = 0.00089586516310476929281129228969;
  578. const double c2 = 0.00067015003441569770883539158863;
  579. const double c3 = 0.00010166263361949045682945811828;
  580. const double c4 = -0.00044086345133806887291336488582;
  581. const double c5 = -0.00073963081508788743392883072523;
  582. const double c6 = -0.00076745494377839561259903887331;
  583. const double c7 = -0.00060829038106040362291568012663;
  584. const double c8 = -0.00037128707528893496121336168683;
  585. const double c9 = -0.00014116325105702609866850307176;
  586. return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*c9))))))));
  587. }
  588. else {
  589. const double zi = 1.0/z;
  590. const double x = 12.0/5.0 * zi - 1.0;
  591. gsl_sf_result c;
  592. cheb_eval_e(&B2_gt1_cs, x, &c);
  593. return c.val * zi*zi*zi;
  594. }
  595. }
  596. static double olver_B3(double z, double abs_zeta)
  597. {
  598. if(z < 0.8) {
  599. const double x = 5.0*z/2.0 - 1.0;
  600. gsl_sf_result c;
  601. cheb_eval_e(&B3_lt1_cs, x, &c);
  602. return c.val;
  603. }
  604. else if(z < 1.2) {
  605. const double a = 1.0-z;
  606. const double c0 = -0.00047461779655995980754441833105;
  607. const double c1 = -0.00095572913429464297452176811898;
  608. const double c2 = -0.00080369634512082892655558133973;
  609. const double c3 = -0.00000727921669154784138080600339;
  610. const double c4 = 0.00093162500331581345235746518994;
  611. const double c5 = 0.00149848796913751497227188612403;
  612. const double c6 = 0.00148406039675949727870390426462;
  613. return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*c6)))));
  614. }
  615. else {
  616. const double x = 12.0/(5.0*z) - 1.0;
  617. const double zi2 = 1.0/(z*z);
  618. gsl_sf_result c;
  619. cheb_eval_e(&B3_gt1_cs, x, &c);
  620. return c.val * zi2*zi2*zi2;
  621. }
  622. }
  623. static double olver_A1(double z, double abs_zeta, double * err)
  624. {
  625. if(z < 0.98) {
  626. double t = 1.0/sqrt(1.0-z*z);
  627. double rz = sqrt(abs_zeta);
  628. double t2 = t*t;
  629. double term1 = t2*(81.0 - 462.0*t2 + 385.0*t2*t2)/1152.0;
  630. double term2 = -455.0/(4608.0*abs_zeta*abs_zeta*abs_zeta);
  631. double term3 = 7.0*t*(-3.0 + 5.0*t2)/(1152.0*rz*rz*rz);
  632. *err = 2.0 * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2) + fabs(term3));
  633. return term1 + term2 + term3;
  634. }
  635. else if(z < 1.02) {
  636. const double a = 1.0-z;
  637. const double c0 = -0.00444444444444444444444444444444;
  638. const double c1 = -0.00184415584415584415584415584416;
  639. const double c2 = 0.00056812076812076812076812076812;
  640. const double c3 = 0.00168137865661675185484709294233;
  641. const double c4 = 0.00186744042139000122193399504324;
  642. const double c5 = 0.00161330105833747826430066790326;
  643. const double c6 = 0.00123177312220625816558607537838;
  644. const double c7 = 0.00087334711007377573881689318421;
  645. const double c8 = 0.00059004942455353250141217015410;
  646. const double sum = c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*c8)))))));
  647. *err = 2.0 * GSL_DBL_EPSILON * fabs(sum);
  648. return sum;
  649. }
  650. else {
  651. const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
  652. const double rz = sqrt(abs_zeta);
  653. const double t2 = t*t;
  654. const double term1 = -t2*(81.0 + 462.0*t2 + 385.0*t2*t2)/1152.0;
  655. const double term2 = 455.0/(4608.0*abs_zeta*abs_zeta*abs_zeta);
  656. const double term3 = -7.0*t*(3.0 + 5.0*t2)/(1152.0*rz*rz*rz);
  657. *err = 2.0 * GSL_DBL_EPSILON * (fabs(term1) + fabs(term2) + fabs(term3));
  658. return term1 + term2 + term3;
  659. }
  660. }
  661. static double olver_A2(double z, double abs_zeta)
  662. {
  663. if(z < 0.88) {
  664. double t = 1.0/sqrt(1.0-z*z);
  665. double t2 = t*t;
  666. double t4 = t2*t2;
  667. double t6 = t4*t2;
  668. double t8 = t4*t4;
  669. double rz = sqrt(abs_zeta);
  670. double z3 = abs_zeta*abs_zeta*abs_zeta;
  671. double z32 = rz*rz*rz;
  672. double z92 = z3*z32;
  673. double term1 = t4*(4465125.0 - 94121676.0*t2 + 349922430.0*t4 - 446185740.0*t6 + 185910725.0*t8)/39813120.0;
  674. double term2 = -40415375.0/(127401984.0*z3*z3);
  675. double term3 = -95095.0/15925248.0*t*(3.0-5.0*t2)/z92;
  676. double term4 = -455.0/5308416.0 *t2*(81.0 - 462.0*t2 + 385.0*t4)/z3;
  677. double term5 = -7.0/19906560.0*t*t2*(30375.0 - 369603.0*t2 + 765765.0*t4 - 425425.0*t6)/z32;
  678. return term1 + term2 + term3 + term4 + term5;
  679. }
  680. else if(z < 1.12) {
  681. double a = 1.0-z;
  682. const double c0 = 0.000693735541354588973636592684210;
  683. const double c1 = 0.000464483490365843307019777608010;
  684. const double c2 = -0.000289036254605598132482570468291;
  685. const double c3 = -0.000874764943953712638574497548110;
  686. const double c4 = -0.001029716376139865629968584679350;
  687. const double c5 = -0.000836857329713810600584714031650;
  688. const double c6 = -0.000488910893527218954998270124540;
  689. const double c7 = -0.000144236747940817220502256810151;
  690. const double c8 = 0.000114363800986163478038576460325;
  691. const double c9 = 0.000266806881492777536223944807117;
  692. const double c10 = -0.011975517576151069627471048587000;
  693. return c0+a*(c1+a*(c2+a*(c3+a*(c4+a*(c5+a*(c6+a*(c7+a*(c8+a*(c9+a*c10)))))))));
  694. }
  695. else {
  696. const double t = 1.0/(z*sqrt(1.0 - 1.0/(z*z)));
  697. const double t2 = t*t;
  698. const double t4 = t2*t2;
  699. const double t6 = t4*t2;
  700. const double t8 = t4*t4;
  701. const double rz = sqrt(abs_zeta);
  702. const double z3 = abs_zeta*abs_zeta*abs_zeta;
  703. const double z32 = rz*rz*rz;
  704. const double z92 = z3*z32;
  705. const double term1 = t4*(4465125.0 + 94121676.0*t2 + 349922430.0*t4 + 446185740.0*t6 + 185910725.0*t8)/39813120.0;
  706. const double term2 = -40415375.0/(127401984.0*z3*z3);
  707. const double term3 = 95095.0/15925248.0*t*(3.0+5.0*t2)/z92;
  708. const double term4 = -455.0/5308416.0 *t2*(81.0 + 462.0*t2 + 385.0*t4)/z3;
  709. const double term5 = 7.0/19906560.0*t*t2*(30375.0 + 369603.0*t2 + 765765.0*t4 + 425425.0*t6)/z32;
  710. return term1 + term2 + term3 + term4 + term5;
  711. }
  712. }
  713. static double olver_A3(double z, double abs_zeta)
  714. {
  715. if(z < 0.9) {
  716. const double x = 20.0*z/9.0 - 1.0;
  717. gsl_sf_result c;
  718. cheb_eval_e(&A3_lt1_cs, x, &c);
  719. return c.val;
  720. }
  721. else if(z < 1.1) {
  722. double a = 1.0-z;
  723. const double c0 = -0.000354211971457743840771125759200;
  724. const double c1 = -0.000312322527890318832782774881353;
  725. const double c2 = 0.000277947465383133980329617631915;
  726. const double c3 = 0.000919803044747966977054155192400;
  727. const double c4 = 0.001147600388275977640983696906320;
  728. const double c5 = 0.000869239326123625742931772044544;
  729. const double c6 = 0.000287392257282507334785281718027;
  730. return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*c6)))));
  731. }
  732. else {
  733. const double x = 11.0/(5.0*z) - 1.0;
  734. const double zi2 = 1.0/(z*z);
  735. gsl_sf_result c;
  736. cheb_eval_e(&A3_gt1_cs, x, &c);
  737. return c.val * zi2*zi2*zi2;
  738. }
  739. }
  740. static double olver_A4(double z, double abs_zeta)
  741. {
  742. if(z < 0.8) {
  743. const double x = 5.0*z/2.0 - 1.0;
  744. gsl_sf_result c;
  745. cheb_eval_e(&A4_lt1_cs, x, &c);
  746. return c.val;
  747. }
  748. else if(z < 1.2) {
  749. double a = 1.0-z;
  750. const double c0 = 0.00037819419920177291402661228437;
  751. const double c1 = 0.00040494390552363233477213857527;
  752. const double c2 = -0.00045764735528936113047289344569;
  753. const double c3 = -0.00165361044229650225813161341879;
  754. const double c4 = -0.00217527517983360049717137015539;
  755. const double c5 = -0.00152003287866490735107772795537;
  756. return c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*c5))));
  757. }
  758. else {
  759. const double x = 12.0/(5.0*z) - 1.0;
  760. const double zi2 = 1.0/(z*z);
  761. gsl_sf_result c;
  762. cheb_eval_e(&A4_gt1_cs, x, &c);
  763. return c.val * zi2*zi2*zi2*zi2;
  764. }
  765. }
  766. inline
  767. static double olver_Asum(double nu, double z, double abs_zeta, double * err)
  768. {
  769. double nu2 = nu*nu;
  770. double A1_err;
  771. double A1 = olver_A1(z, abs_zeta, &A1_err);
  772. double A2 = olver_A2(z, abs_zeta);
  773. double A3 = olver_A3(z, abs_zeta);
  774. double A4 = olver_A4(z, abs_zeta);
  775. *err = A1_err/nu2 + GSL_DBL_EPSILON;
  776. return 1.0 + A1/nu2 + A2/(nu2*nu2) + A3/(nu2*nu2*nu2) + A4/(nu2*nu2*nu2*nu2);
  777. }
  778. inline
  779. static double olver_Bsum(double nu, double z, double abs_zeta)
  780. {
  781. double nu2 = nu*nu;
  782. double B0 = olver_B0(z, abs_zeta);
  783. double B1 = olver_B1(z, abs_zeta);
  784. double B2 = olver_B2(z, abs_zeta);
  785. double B3 = olver_B3(z, abs_zeta);
  786. return B0 + B1/nu2 + B2/(nu2*nu2) + B3/(nu2*nu2*nu2*nu2);
  787. }
  788. /* uniform asymptotic, nu -> Inf, [Abramowitz+Stegun, 9.3.35]
  789. *
  790. * error:
  791. * nu = 2: uniformly good to > 6D
  792. * nu = 5: uniformly good to > 8D
  793. * nu = 10: uniformly good to > 10D
  794. * nu = 20: uniformly good to > 13D
  795. *
  796. */
  797. int gsl_sf_bessel_Jnu_asymp_Olver_e(double nu, double x, gsl_sf_result * result)
  798. {
  799. /* CHECK_POINTER(result) */
  800. if(x <= 0.0 || nu <= 0.0) {
  801. DOMAIN_ERROR(result);
  802. }
  803. else {
  804. double zeta, abs_zeta;
  805. double arg;
  806. double pre;
  807. double asum, bsum, asum_err;
  808. gsl_sf_result ai;
  809. gsl_sf_result aip;
  810. double z = x/nu;
  811. double crnu = pow(nu, 1.0/3.0);
  812. double nu3 = nu*nu*nu;
  813. double nu11 = nu3*nu3*nu3*nu*nu;
  814. int stat_a, stat_ap;
  815. if(fabs(1.0-z) < 0.02) {
  816. const double a = 1.0-z;
  817. const double c0 = 1.25992104989487316476721060728;
  818. const double c1 = 0.37797631496846194943016318218;
  819. const double c2 = 0.230385563409348235843147082474;
  820. const double c3 = 0.165909603649648694839821892031;
  821. const double c4 = 0.12931387086451008907;
  822. const double c5 = 0.10568046188858133991;
  823. const double c6 = 0.08916997952268186978;
  824. const double c7 = 0.07700014900618802456;
  825. pre = c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*c7))))));
  826. zeta = a * pre;
  827. pre = sqrt(2.0*sqrt(pre/(1.0+z)));
  828. abs_zeta = fabs(zeta);
  829. }
  830. else if(z < 1.0) {
  831. double rt = sqrt(1.0 - z*z);
  832. abs_zeta = pow(1.5*(log((1.0+rt)/z) - rt), 2.0/3.0);
  833. zeta = abs_zeta;
  834. pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
  835. }
  836. else {
  837. /* z > 1 */
  838. double rt = z * sqrt(1.0 - 1.0/(z*z));
  839. abs_zeta = pow(1.5*(rt - acos(1.0/z)), 2.0/3.0);
  840. zeta = -abs_zeta;
  841. pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
  842. }
  843. asum = olver_Asum(nu, z, abs_zeta, &asum_err);
  844. bsum = olver_Bsum(nu, z, abs_zeta);
  845. arg = crnu*crnu * zeta;
  846. stat_a = gsl_sf_airy_Ai_e(arg, GSL_MODE_DEFAULT, &ai);
  847. stat_ap = gsl_sf_airy_Ai_deriv_e(arg, GSL_MODE_DEFAULT, &aip);
  848. result->val = pre * (ai.val*asum/crnu + aip.val*bsum/(nu*crnu*crnu));
  849. result->err = pre * (ai.err * fabs(asum/crnu));
  850. result->err += pre * fabs(ai.val) * asum_err / crnu;
  851. result->err += pre * fabs(ai.val * asum) / (crnu*nu11);
  852. result->err += 8.0 * GSL_DBL_EPSILON * fabs(result->val);
  853. return GSL_ERROR_SELECT_2(stat_a, stat_ap);
  854. }
  855. }
  856. /* uniform asymptotic, nu -> Inf, [Abramowitz+Stegun, 9.3.36]
  857. *
  858. * error:
  859. * nu = 2: uniformly good to > 6D
  860. * nu = 5: uniformly good to > 8D
  861. * nu = 10: uniformly good to > 10D
  862. * nu = 20: uniformly good to > 13D
  863. */
  864. int gsl_sf_bessel_Ynu_asymp_Olver_e(double nu, double x, gsl_sf_result * result)
  865. {
  866. /* CHECK_POINTER(result) */
  867. if(x <= 0.0 || nu <= 0.0) {
  868. DOMAIN_ERROR(result);
  869. }
  870. else {
  871. double zeta, abs_zeta;
  872. double arg;
  873. double pre;
  874. double asum, bsum, asum_err;
  875. gsl_sf_result bi;
  876. gsl_sf_result bip;
  877. double z = x/nu;
  878. double crnu = pow(nu, 1.0/3.0);
  879. double nu3 = nu*nu*nu;
  880. double nu11 = nu3*nu3*nu3*nu*nu;
  881. int stat_b, stat_d;
  882. if(fabs(1.0-z) < 0.02) {
  883. const double a = 1.0-z;
  884. const double c0 = 1.25992104989487316476721060728;
  885. const double c1 = 0.37797631496846194943016318218;
  886. const double c2 = 0.230385563409348235843147082474;
  887. const double c3 = 0.165909603649648694839821892031;
  888. const double c4 = 0.12931387086451008907;
  889. const double c5 = 0.10568046188858133991;
  890. const double c6 = 0.08916997952268186978;
  891. const double c7 = 0.07700014900618802456;
  892. pre = c0 + a*(c1 + a*(c2 + a*(c3 + a*(c4 + a*(c5 + a*(c6 + a*c7))))));
  893. zeta = a * pre;
  894. pre = sqrt(2.0*sqrt(pre/(1.0+z)));
  895. abs_zeta = fabs(zeta);
  896. }
  897. else if(z < 1.0) {
  898. double rt = sqrt(1.0 - z*z);
  899. abs_zeta = pow(1.5*(log((1.0+rt)/z) - rt), 2.0/3.0);
  900. zeta = abs_zeta;
  901. pre = sqrt(2.0*sqrt(abs_zeta/(rt*rt)));
  902. }
  903. else {
  904. /* z > 1 */
  905. double rt = z * sqrt(1.0 - 1.0/(z*z));
  906. double ac = acos(1.0/z);
  907. abs_zeta = pow(1.5*(rt - ac), 2.0/3.0);
  908. zeta = -abs_zeta;
  909. pre = sqrt(2.0*sqrt(abs_zeta)/rt);
  910. }
  911. asum = olver_Asum(nu, z, abs_zeta, &asum_err);
  912. bsum = olver_Bsum(nu, z, abs_zeta);
  913. arg = crnu*crnu * zeta;
  914. stat_b = gsl_sf_airy_Bi_e(arg, GSL_MODE_DEFAULT, &bi);
  915. stat_d = gsl_sf_airy_Bi_deriv_e(arg, GSL_MODE_DEFAULT, &bip);
  916. result->val = -pre * (bi.val*asum/crnu + bip.val*bsum/(nu*crnu*crnu));
  917. result->err = pre * (bi.err * fabs(asum/crnu));
  918. result->err += pre * fabs(bi.val) * asum_err / crnu;
  919. result->err += pre * fabs(bi.val*asum) / (crnu*nu11);
  920. result->err += 8.0 * GSL_DBL_EPSILON * fabs(result->val);
  921. return GSL_ERROR_SELECT_2(stat_b, stat_d);
  922. }
  923. }