gsl_specfunc__airy_zero.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. /* specfunc/airy_zero.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. static const double zero_Ai[] = {
  26. 0,
  27. -2.338107410459767039,
  28. -4.087949444130970617,
  29. -5.520559828095551059,
  30. -6.786708090071758999,
  31. -7.944133587120853123,
  32. -9.022650853340980380,
  33. -10.04017434155808593,
  34. -11.00852430373326289,
  35. -11.93601556323626252,
  36. -12.82877675286575720,
  37. -13.69148903521071793,
  38. -14.52782995177533498,
  39. -15.34075513597799686,
  40. -16.13268515694577144,
  41. -16.90563399742994263,
  42. -17.661300105697057509,
  43. -18.401132599207115416,
  44. -19.126380474246952144,
  45. -19.838129891721499701,
  46. -20.537332907677566360,
  47. -21.224829943642096955,
  48. -21.901367595585130707,
  49. -22.567612917496502831,
  50. -23.224165001121681061,
  51. -23.871564455535918567,
  52. -24.510301236589677490,
  53. -25.140821166148963748,
  54. -25.763531400982756459,
  55. -26.378805052137232374,
  56. -26.986985111606367686,
  57. -27.588387809882444812,
  58. -28.183305502632644923,
  59. -28.772009165237435382,
  60. -29.354750558766287963,
  61. -29.931764119086555913,
  62. -30.503268611418505287,
  63. -31.069468585183755604,
  64. -31.63055565801265934,
  65. -32.18670965295205069,
  66. -32.73809960900026913,
  67. -33.28488468190140188,
  68. -33.82721494950865194,
  69. -34.36523213386365906,
  70. -34.89907025034531210,
  71. -35.42885619274788846,
  72. -35.95471026189862926,
  73. -36.47674664437480896,
  74. -36.99507384699450161,
  75. -37.50979509200501613,
  76. -38.02100867725525443,
  77. -38.52880830509424882,
  78. -39.03328338327251391,
  79. -39.53451930072301805,
  80. -40.03259768075417603,
  81. -40.52759661388971821,
  82. -41.01959087233248966,
  83. -41.50865210780525018,
  84. -41.99484903432643004,
  85. -42.47824759730839188,
  86. -42.95891113021656009,
  87. -43.43690049989685412,
  88. -43.91227424156370168,
  89. -44.38508868433939023,
  90. -44.85539806814583243,
  91. -45.32325465267043011,
  92. -45.78870881905730086,
  93. -46.25180916491254629,
  94. -46.71260259315651633,
  95. -47.17113439520631705,
  96. -47.62744832892739292,
  97. -48.08158669175325711,
  98. -48.53359038933679845,
  99. -48.98349900006458366,
  100. -49.43135083573678341,
  101. -49.87718299868941729,
  102. -50.32103143561221860,
  103. -50.76293098829428522,
  104. -51.20291544151056412,
  105. -51.64101756824489758,
  106. -52.07726917242964943,
  107. -52.51170112936766183,
  108. -52.94434342398931824,
  109. -53.37522518708567514,
  110. -53.80437472964785717,
  111. -54.23181957543308298,
  112. -54.65758649186871111,
  113. -55.08170151939748312,
  114. -55.50418999935962251,
  115. -55.92507660050055598,
  116. -56.34438534418670066,
  117. -56.76213962840595327,
  118. -57.17836225062417808,
  119. -57.59307542956407782,
  120. -58.00630082596830627,
  121. -58.41805956240450934,
  122. -58.82837224216613231,
  123. -59.23725896731927534,
  124. -59.64473935594259360,
  125. -60.05083255860419805,
  126. -60.45555727411669871
  127. };
  128. static const size_t size_zero_Ai = sizeof(zero_Ai)/sizeof(double);
  129. static const double zero_Bi[] = {
  130. 0,
  131. -1.173713222709127925,
  132. -3.271093302836352716,
  133. -4.830737841662015933,
  134. -6.169852128310251260,
  135. -7.376762079367763714,
  136. -8.491948846509388013,
  137. -9.538194379346238887,
  138. -10.52991350670535792,
  139. -11.47695355127877944,
  140. -12.38641713858273875,
  141. -13.26363952294180555,
  142. -14.11275680906865779,
  143. -14.93705741215416404,
  144. -15.739210351190482771,
  145. -16.521419550634379054,
  146. -17.285531624581242533,
  147. -18.033113287225001572,
  148. -18.765508284480081041,
  149. -19.483880132989234014,
  150. -20.189244785396202420,
  151. -20.882495994193175768,
  152. -21.564425284712977653,
  153. -22.235737881803385167,
  154. -22.897065554219793474,
  155. -23.548977079642448269,
  156. -24.191986850649000086,
  157. -24.826562012152892172,
  158. -25.453128427085131994,
  159. -26.072075698466804494,
  160. -26.683761425120990449,
  161. -27.288514830076298204,
  162. -27.886639871735962459,
  163. -28.478417925678661737,
  164. -29.064110107777650305,
  165. -29.643959295918396591,
  166. -30.218191897047274645,
  167. -30.787019397921766297,
  168. -31.350639731255585371,
  169. -31.90923848358456965,
  170. -32.46298996683685318,
  171. -33.01205817205683814,
  172. -33.55659762084006113,
  173. -34.09675412765602851,
  174. -34.63266548426775468,
  175. -35.16446207582101720,
  176. -35.69226743681080479,
  177. -36.21619875398748222,
  178. -36.73636732230120657,
  179. -37.25287895916828697,
  180. -37.76583438165180116,
  181. -38.27532955056003997,
  182. -38.78145598496327279,
  183. -39.28430105019802461,
  184. -39.78394822205711298,
  185. -40.28047732954369150,
  186. -40.77396477829068148,
  187. -41.26448375650675678,
  188. -41.75210442510106287,
  189. -42.23689409345656643,
  190. -42.71891738216253539,
  191. -43.19823637387693118,
  192. -43.67491075336673948,
  193. -44.14899793766617113,
  194. -44.62055319719727274,
  195. -45.08962976861312825,
  196. -45.55627896004907928,
  197. -46.02055024940102076,
  198. -46.48249137619078661,
  199. -46.94214842752602207,
  200. -47.39956591861496210,
  201. -47.85478686825452176,
  202. -48.30785286967246692,
  203. -48.75880415707066192,
  204. -49.20767966818603897,
  205. -49.65451710315861501,
  206. -50.09935297997125482,
  207. -50.54222268670364757,
  208. -50.98316053082286586,
  209. -51.42219978571468262,
  210. -51.85937273464332870,
  211. -52.29471071231240525,
  212. -52.72824414418606069,
  213. -53.16000258371716397,
  214. -53.59001474761792882,
  215. -54.01830854929815828,
  216. -54.44491113058688729,
  217. -54.86984889184461534,
  218. -55.29314752056546491,
  219. -55.71483201856140365,
  220. -56.13492672781406761,
  221. -56.55345535507366411,
  222. -56.97044099527886475,
  223. -57.38590615386647834,
  224. -57.79987276803497897,
  225. -58.21236222702161974,
  226. -58.62339539144885603,
  227. -59.03299261179210306,
  228. -59.44117374601743460,
  229. -59.84795817643466996,
  230. -60.25336482580837088
  231. };
  232. static const size_t size_zero_Bi = sizeof(zero_Bi)/sizeof(double);
  233. static const double zero_Aip[] = {
  234. 0,
  235. -1.018792971647471089,
  236. -3.248197582179836738,
  237. -4.820099211178735639,
  238. -6.163307355639486822,
  239. -7.372177255047770177,
  240. -8.488486734019722133,
  241. -9.535449052433547471,
  242. -10.52766039695740728,
  243. -11.47505663348024529,
  244. -12.384788371845747325,
  245. -13.262218961665210382,
  246. -14.111501970462995282,
  247. -14.935937196720517467,
  248. -15.738201373692538303,
  249. -16.520503825433793542,
  250. -17.284695050216437357,
  251. -18.032344622504393395,
  252. -18.764798437665954740,
  253. -19.483221656567231178,
  254. -20.188631509463373154,
  255. -20.881922755516737701,
  256. -21.563887723198974958,
  257. -22.235232285348913331,
  258. -22.896588738874619001,
  259. -23.548526295928801574,
  260. -24.191559709526353841,
  261. -24.826156425921155001,
  262. -25.452742561777649948,
  263. -26.071707935173912515,
  264. -26.683410328322449767,
  265. -27.288179121523985029,
  266. -27.886318408768461192,
  267. -28.478109683102278108,
  268. -29.063814162638199090,
  269. -29.643674814632015921,
  270. -30.217918124468574603,
  271. -30.786755648012502519,
  272. -31.350385379083034671,
  273. -31.90899295843046320,
  274. -32.46275274623847982,
  275. -33.01182877663428709,
  276. -33.55637560978942190,
  277. -34.09653909480913771,
  278. -34.63245705463586589,
  279. -35.16425990255340758,
  280. -35.69207119851046870,
  281. -36.21600815233519918,
  282. -36.73618207994680321,
  283. -37.25269881785414827,
  284. -37.76565910053887108,
  285. -38.27515890473087933,
  286. -38.78128976408036876,
  287. -39.28413905729859644,
  288. -39.78379027246823278,
  289. -40.28032324990371935,
  290. -40.77381440566486637,
  291. -41.26433693758643383,
  292. -41.75196101547722703,
  293. -42.23675395695976012,
  294. -42.71878039026198233,
  295. -43.19810240513270670,
  296. -43.67477969292950869,
  297. -44.14886967681966886,
  298. -44.62042763293925724,
  299. -45.08950680327102630,
  300. -45.55615850092696446,
  301. -46.02043220845493728,
  302. -46.48237566972975615,
  303. -46.94203497593635633,
  304. -47.39945464610575493,
  305. -47.85467770262241617,
  306. -48.30774574208398774,
  307. -48.75869900186057804,
  308. -49.20757642267037247,
  309. -49.65441570746105074,
  310. -50.09925337686182515,
  311. -50.54212482144867502,
  312. -50.98306435104524282,
  313. -51.42210524126365311,
  314. -51.85927977747301469,
  315. -52.29461929636838876,
  316. -52.72815422529939506,
  317. -53.15991411950524351,
  318. -53.58992769739169611,
  319. -54.01822287397517367,
  320. -54.44482679260982599,
  321. -54.86976585510479430,
  322. -55.29306575033103518,
  323. -55.71475148140987392,
  324. -56.13484739156885235,
  325. -56.55337718874437424,
  326. -56.97036396900508167,
  327. -57.38583023886477265,
  328. -57.79979793654895377,
  329. -58.21228845227477578,
  330. -58.62332264760009139,
  331. -59.03292087389367419,
  332. -59.44110298997521892,
  333. -59.84788837897058171,
  334. -60.25329596442479317
  335. };
  336. static const size_t size_zero_Aip = sizeof(zero_Aip)/sizeof(double);
  337. static const double zero_Bip[] = {
  338. 0,
  339. -2.294439682614123247,
  340. -4.073155089071828216,
  341. -5.512395729663599496,
  342. -6.781294445990305390,
  343. -7.940178689168578927,
  344. -9.019583358794239067,
  345. -10.037696334908545802,
  346. -11.006462667712289940,
  347. -11.934261645014844663,
  348. -12.827258309177217640,
  349. -13.690155826835049101,
  350. -14.526645763485711410,
  351. -15.339693082242404109,
  352. -16.131724782385900578,
  353. -16.904759411889649958,
  354. -17.660498743114976102,
  355. -18.400394367181703280,
  356. -19.125697156412638066,
  357. -19.837494718415910503,
  358. -20.536740241453273980,
  359. -21.224275044889266569,
  360. -21.900846445139208281,
  361. -22.567122080497200470,
  362. -23.223701521208962116,
  363. -23.871125771677973595,
  364. -24.509885117016242729,
  365. -25.140425655367878908,
  366. -25.763154776913454319,
  367. -26.378445791146615697,
  368. -26.986641859775034987,
  369. -27.588059359225600573,
  370. -28.182990771292975456,
  371. -28.771707180886056250,
  372. -29.354460444612957224,
  373. -29.931485082026055160,
  374. -30.502999931936645516,
  375. -31.069209608721234058,
  376. -31.63030578754333679,
  377. -32.18646834257807369,
  378. -32.73786635840274752,
  379. -33.28465903151424981,
  380. -33.82699647630635587,
  381. -34.36502044767239631,
  382. -34.89886499060196419,
  383. -35.42865702564380962,
  384. -35.95451687785511190,
  385. -36.47655875580547918,
  386. -36.99489118631672770,
  387. -37.50961740986809593,
  388. -38.02083574095788210
  389. };
  390. static const size_t size_zero_Bip = sizeof(zero_Bip)/sizeof(double);
  391. /* [Abramowitz+Stegun, 10.4.105] */
  392. static double
  393. zero_f(double z)
  394. {
  395. const double pre = pow(z, 2.0/3.0);
  396. const double zi2 = 1.0/(z*z);
  397. const double zi4 = zi2 * zi2;
  398. const double t1 = 5.0/48.0 * zi2;
  399. const double t2 = -5.0/36.0 * zi4;
  400. const double t3 = 77125.0/82944.0 * zi4 * zi2;
  401. const double t4 = -108056875.0/6967296.0 * zi4 * zi4;
  402. return pre * (1.0 + t1 + t2 + t3 + t4);
  403. }
  404. static double
  405. zero_g(double z)
  406. {
  407. const double pre = pow(z, 2.0/3.0);
  408. const double zi2 = 1.0/(z*z);
  409. const double zi4 = zi2 * zi2;
  410. const double t1 = -7.0/48.0 * zi2;
  411. const double t2 = 35.0/288.0 * zi4;
  412. const double t3 = -181223.0/207360.0 * zi4 * zi2;
  413. const double t4 = 18683371.0/1244160.0 * zi4 * zi4;
  414. return pre * (1.0 + t1 + t2 + t3 + t4);
  415. }
  416. int
  417. gsl_sf_airy_zero_Ai_e(unsigned int s, gsl_sf_result * result)
  418. {
  419. /* CHECK_POINTER(result) */
  420. if(s < 1) {
  421. DOMAIN_ERROR_MSG("s is less than 1", result);
  422. }
  423. else if(s < size_zero_Ai) {
  424. result->val = zero_Ai[s];
  425. result->err = GSL_DBL_EPSILON * fabs(result->val);
  426. return GSL_SUCCESS;
  427. }
  428. else {
  429. const double z = 3.0*M_PI/8.0 * (4.0*s - 1.0);
  430. const double f = zero_f(z);
  431. result->val = -f;
  432. result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  433. return GSL_SUCCESS;
  434. }
  435. }
  436. int
  437. gsl_sf_airy_zero_Bi_e(unsigned int s, gsl_sf_result * result)
  438. {
  439. /* CHECK_POINTER(result) */
  440. if(s < 1) {
  441. DOMAIN_ERROR_MSG("s is less than 1", result);
  442. }
  443. else if(s < size_zero_Bi) {
  444. result->val = zero_Bi[s];
  445. result->err = GSL_DBL_EPSILON * fabs(result->val);
  446. return GSL_SUCCESS;
  447. }
  448. else {
  449. const double z = 3.0*M_PI/8.0 * (4.0*s - 3.0);
  450. const double f = zero_f(z);
  451. result->val = -f;
  452. result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  453. return GSL_SUCCESS;
  454. }
  455. }
  456. int
  457. gsl_sf_airy_zero_Ai_deriv_e(unsigned int s, gsl_sf_result * result)
  458. {
  459. /* CHECK_POINTER(result) */
  460. if(s < 1) {
  461. DOMAIN_ERROR_MSG("s is less than 1", result);
  462. }
  463. else if(s < size_zero_Aip) {
  464. result->val = zero_Aip[s];
  465. result->err = GSL_DBL_EPSILON * fabs(result->val);
  466. return GSL_SUCCESS;
  467. }
  468. else {
  469. const double z = 3.0*M_PI/8.0 * (4.0*s - 3.0);
  470. const double g = zero_g(z);
  471. result->val = -g;
  472. result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  473. return GSL_SUCCESS;
  474. }
  475. }
  476. int
  477. gsl_sf_airy_zero_Bi_deriv_e(unsigned int s, gsl_sf_result * result)
  478. {
  479. /* CHECK_POINTER(result) */
  480. if(s < 1) {
  481. DOMAIN_ERROR_MSG("s is less than 1", result);
  482. }
  483. else if(s < size_zero_Bip) {
  484. result->val = zero_Bip[s];
  485. result->err = GSL_DBL_EPSILON * fabs(result->val);
  486. return GSL_SUCCESS;
  487. }
  488. else {
  489. const double z = 3.0*M_PI/8.0 * (4.0*s - 1.0);
  490. const double g = zero_g(z);
  491. result->val = -g;
  492. result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val);
  493. return GSL_SUCCESS;
  494. }
  495. }
  496. /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
  497. #include "gsl_specfunc__eval.h"
  498. double gsl_sf_airy_zero_Ai(unsigned int s)
  499. {
  500. EVAL_RESULT(gsl_sf_airy_zero_Ai_e(s, &result));
  501. }
  502. double gsl_sf_airy_zero_Bi(unsigned int s)
  503. {
  504. EVAL_RESULT(gsl_sf_airy_zero_Bi_e(s, &result));
  505. }
  506. double gsl_sf_airy_zero_Ai_deriv(unsigned int s)
  507. {
  508. EVAL_RESULT(gsl_sf_airy_zero_Ai_deriv_e(s, &result));
  509. }
  510. double gsl_sf_airy_zero_Bi_deriv(unsigned int s)
  511. {
  512. EVAL_RESULT(gsl_sf_airy_zero_Bi_deriv_e(s, &result));
  513. }