1
- """
2
- besseli0(x::T) where T <: Union{Float32, Float64}
3
-
4
- Modified Bessel function of the first kind of order zero, ``I_0(x)``.
5
- """
6
- function besseli0 (z:: Complex{T} ) where T <: Union{Float64}
1
+ function besseli0 (z:: ComplexF64 )
7
2
check = false
8
3
if real (z) < 0.0
9
4
z = - z
@@ -13,115 +8,71 @@ function besseli0(z::Complex{T}) where T <: Union{Float64}
13
8
check = true
14
9
end
15
10
16
- if abs (z) > 20.0
11
+ if abs (z) > 17.5
17
12
zinv = 1 / z
18
13
e = exp (z)
19
14
s = sqrt (2 * z * π)
20
- p = evalpoly (zinv* zinv, (1.0 , 0.0703125 , 0.112152099609375 , 0.5725014209747314 , 6.074042001273483 , 110.01714026924674 , 3038.090510922384 , 118838.42625678325 , 6.252951493434797e6 , 4.259392165047669e8 , 3.646840080706556e10 , 3.8335346613939443e12 ))
21
- p2 = zinv* evalpoly (zinv* zinv, (0.125 , 0.0732421875 , 0.22710800170898438 , 1.7277275025844574 , 24.380529699556064 , 551.3358961220206 , 18257.755474293175 , 832859.3040162893 , 5.0069589531988926e7 , 3.8362551802304335e9 , 3.6490108188498334e11 ))
15
+ p = evalpoly (zinv* zinv, (1.0 , 0.0703125 , 0.112152099609375 , 0.5725014209747314 , 6.074042001273483 , 110.01714026924674 , 3038.090510922384 , 118838.42625678325 , 6.252951493434797e6 , 4.259392165047669e8 , 3.646840080706556e10 , 3.8335346613939443e12 , 4.8540146868529006e14 , 7.286857349377656e16 ))
16
+ p2 = zinv* evalpoly (zinv* zinv, (0.125 , 0.0732421875 , 0.22710800170898438 , 1.7277275025844574 , 24.380529699556064 , 551.3358961220206 , 18257.755474293175 , 832859.3040162893 , 5.0069589531988926e7 , 3.8362551802304335e9 , 3.6490108188498334e11 , 4.218971570284097e13 , 5.827244631566907e15 , 9.47628809926011e17 ))
22
17
r = e / s * (p + p2) + im * (p - p2) / (e * s)
23
- elseif abs (z) < 5.0
18
+ elseif abs (z) < 5.2
24
19
r = evalpoly (z* z, (1.0 , 0.25 , 0.015625 , 0.00043402777777777775 , 6.781684027777777e-6 , 6.781684027777778e-8 , 4.709502797067901e-10 , 2.4028075495244395e-12 , 9.385966990329842e-15 , 2.896903392077112e-17 , 7.242258480192779e-20 , 1.4963343967340453e-22 , 2.5978027721077174e-25 , 3.842903509035085e-28 , 4.9016626390753635e-31 , 5.4462918211948485e-34 , 5.318644356635594e-37 ))
25
20
else
26
- if angle (z) <= pi / 5
27
- # r = besseli_power_series(0.0, z)
28
- r = evalpoly (z* z, (1.0 , 0.25 , 0.015625 , 0.00043402777777777775 , 6.781684027777777e-6 , 6.781684027777778e-8 , 4.709502797067901e-10 , 2.4028075495244395e-12 , 9.385966990329842e-15 , 2.896903392077112e-17 , 7.242258480192779e-20 , 1.4963343967340453e-22 , 2.5978027721077174e-25 , 3.842903509035085e-28 , 4.9016626390753635e-31 , 5.4462918211948485e-34 , 5.318644356635594e-37 , 4.60090342269515e-40 , 3.5500798014623073e-43 , 2.458504017633177e-46 , 1.5365650110207356e-49 , 8.71068600351891e-53 , 4.499321282809354e-56 , 2.1263333094562166e-59 , 9.228877211181495e-63 , 3.691550884472598e-66 , 1.3652185223641266e-69 , 4.681819349671216e-73 , 1.4929270885431173e-76 , 4.4379521062518346e-80 , 1.232764473958843e-83 , 3.206983543077115e-87 , 7.829549665715613e-91 , 1.7974172786307652e-94 , 3.887148093924665e-98 , 7.932955293723807e-102 ))
21
+ if angle (z) <= π / 4.4
22
+ zz = z* z
23
+ zz2 = zz* zz
24
+ r = evalpoly (zz2, (1.0 , 0.015625 , 6.781684027777777e-6 , 4.709502797067901e-10 , 9.385966990329842e-15 , 7.242258480192779e-20 , 2.5978027721077174e-25 , 4.9016626390753635e-31 , 5.318644356635594e-37 , 3.5500798014623073e-43 , 1.5365650110207356e-49 , 4.499321282809354e-56 , 9.228877211181495e-63 , 1.3652185223641266e-69 , 1.4929270885431173e-76 , 1.232764473958843e-83 , 7.829549665715613e-91 , 3.887148093924665e-98 ))
25
+ r += zz* evalpoly (zz2, (0.25 , 0.00043402777777777775 , 6.781684027777778e-8 , 2.4028075495244395e-12 , 2.896903392077112e-17 , 1.4963343967340453e-22 , 3.842903509035085e-28 , 5.4462918211948485e-34 , 4.60090342269515e-40 , 2.458504017633177e-46 , 8.71068600351891e-53 , 2.1263333094562166e-59 , 3.691550884472598e-66 , 4.681819349671216e-73 , 4.4379521062518346e-80 , 3.206983543077115e-87 , 1.7974172786307652e-94 , 7.932955293723807e-102 ))
29
26
else
30
- zz = (
31
- - 1.31445408166514621228770920424722135067 + 20.05469386581672353031535749323666095734im ,
32
- - 1.21527202201844963802557231247192248702 + 18.54146805523843966057029319927096366882im ,
33
- - 1.075858296896808452558502722240518778563 + 16.41442564500392009563256578985601663589im ,
34
- - 0.9186088936209556576883983325387816876173 + 14.01526337127532251258799078641459345818im ,
35
- - 0.7533475204960968785172781281289644539356 + 11.49386205943561911624328786274418234825im ,
36
- - 0.5838248556039682402030166485928930342197 + 8.907445998843897427832416724413633346558im ,
37
- - 0.4109216146573061445579355677182320505381 + 6.269452314652045998855101061053574085236im ,
38
- - 0.3205522729306593543441294968943111598492 + 4.890682596894066591630689799785614013672im ,
39
- 16.90671675080808711300051072612404823303 + 10.86528710778251571866803715238347649574im ,
40
- 0.2671537175414016584973353474197210744023 + 20.09822452086760335987491998821496963501im ,
41
- 4.121994532242283959533324377844110131264 + 2.649369939469517376551266352180391550064im ,
42
- 4.053028754723364990297795884544029831886 + 19.68712670537236064660646661650389432907im ,
43
- - 0.5018982035098999983091516696731559932232 + 7.657486833198152709201167454011738300323im ,
44
- 9.416081350634247115749531076289713382721 + 17.75802387649701330474272253923118114471im ,
45
- 1.967489559014300670725106101599521934986 + 4.487648029332259369539315230213105678558im ,
46
- - 1.275759132467892076334692319505847990513 + 19.46432302583940909812554309610277414322im ,
47
- 7.709313889965882182764289609622210264206 + 4.954475197822860721430515695828944444656im ,
48
- 13.72022229845232033085267175920307636261 + 14.68895844098729064342023775679990649223im ,
49
- - 0.3541218766747901147695642976032104343176 + 5.402855776372860852063695347169414162636im ,
50
- - 0.9973883749616251348513173979881685227156 + 15.21720599006466656533120840322226285934im ,
51
- 5.067285183070907805813476443290710449219 + 3.256546447342954841985829261830076575279im ,
52
- 2.130947270892558531585336822899989783764 + 19.98672218570808212234624079428613185883im ,
53
- - 0.8162780120038937162418819612565136081901 + 12.45399582113806502547959098592400550842im ,
54
- - 0.6642234573493526195164804448722861707211 + 10.13409162133750207601678994251415133476im
55
- )
56
-
57
-
58
- w = ( 0.02343591247913679245784557281240267911926 + 0.0im ,
59
- - 0.07518141047674767318831356988084735348821 + 0.04759481977311690037435454314618255011737im ,
60
- 0.02099862365431344121691203952195792226121 + 0.1022779931770602390717073149062343873084im ,
61
- - 0.04479060613413702457430431991269870195538 - 0.001990058142152528741775086018606089055538im ,
62
- 0.05092855107420864863021492396910616662353 - 0.03028402769108835476674634890059678582475im ,
63
- 0.1187682211635005813388232809302280656993 + 0.3545737241031228781373840774904238060117im ,
64
- - 0.2800428715703842108553089929046109318733 + 0.1385502878368521095797660791504313237965im ,
65
- 0.07056156978707124605154632490666699595749 - 0.01564004921737297687522882938537804875523im ,
66
- - 0.06946091028316167537148828614590456709266 + 0.01606645463234542339781008024601760553196im ,
67
- 0.08524646892263365582920187080162577331066 + 0.09536227567093939760933807292531128041446im ,
68
- - 0.02790219158045261979572693178397457813844 + 0.0706492680230463854229583375854417681694im ,
69
- 0.142231423342524893049798606625699903816 - 0.2536760604980480837689071904605953022838im ,
70
- - 0.2058636344291391306882132994360290467739 + 0.301438312655757711944204402243485674262im ,
71
- 0.2054714553805426502375297559410682879388 - 0.1738865814674955823093682738544885069132im ,
72
- - 0.1383969021060848236803764166324981488287 - 0.07997812132261208906136573659750865772367im ,
73
- - 0.005116954351018287300290054986362520139664 + 0.07859682420061694929636075812595663592219im ,
74
- 0.04094909855072709908840877801594615448266 - 0.264288102459465323867959796189097687602im ,
75
- - 0.04174610452138102778540940107632195577025 - 0.2381078364144596504203832409984897822142im ,
76
- - 0.1407821015956153554160579233212047256529 - 0.1764715349923221265893147347014746628702im ,
77
- - 0.07672294420555977878528608471242478117347 + 0.08789101702567167495594446791074005886912im ,
78
- - 0.1554449133166528329574873623641906306148 - 0.1787213424643953330051004968481720425189im ,
79
- 0.2746212867658748835175686053844401612878 + 0.06339130601389010577495497500422061420977im ,
80
- 0.003561860807958012152540927530708358972333 + 0.005781000943183686215098848748539239750244im ,
81
- 0.2246761482071190363374313392341719008982 + 0.05087374143304821544342431138829851988703im )
82
-
83
-
84
- f = ( 4.117575040058659929798068333184346556664 - 4.095512734321109071800037781940773129463im ,
85
- - 2.247112620034342089780921014607883989811 + 3.680759784557968927742876985576003789902im ,
86
- 3.78343182981733150427317013964056968689 + 0.5622435659838359578444055841828230768442im ,
87
- 1.02504489923751607172164312942186370492 - 2.429576351715230231320674647577106952667im ,
88
- - 1.102472896641811361817531178530771285295 - 0.9985456859791927985980919402209110558033im ,
89
- - 0.713405219160451298243685869238106533885 + 0.6341686986762049560439891138230450451374im ,
90
- 0.3548943281905181379443092737346887588501 + 0.8984965319188545906925469353154767304659im ,
91
- 0.1510514019542046337818419488030485808849 - 0.7254114647779558167073332697327714413404im ,
92
- 0.4010578521472479840426217378990259021521 - 0.00140846956682444488656580361407577584032im ,
93
- 0.540457156458840848323177397105609998107 - 0.1885021348797114026929477859084727242589im ,
94
- 0.4077709777425669868122781736019533127546 - 0.006802901797014750291670015514000624534674im ,
95
- 0.3994965367795383914817364257032750174403 - 0.002466114177937662587519751511422327894252im ,
96
- 0.8312271064319111113505300636461470276117 - 1.005050393663784458198051652288995683193im ,
97
- 0.400061910584651958533441984400269575417 - 0.002248719754950747901772745152015886560548im ,
98
- 0.4055260568863696124530804354435531422496 - 0.01689191195791546126758753132435231236741im ,
99
- 5.210832430161148387526282022008672356606 + 1.741327835783517130607833678368479013443im ,
100
- 0.4036474747676551677599832146370317786932 - 0.00328838026637900005672010550483719271142im ,
101
- 0.4006279890770570450975185394781874492764 - 0.001884565453597092116871936084976368874777im ,
102
- - 0.393832011865159148378268127999035641551 - 0.1798762838433343724808821662008995190263im ,
103
- - 2.053184226968296055559903834364376962185 + 1.606906650995165719564283790532499551773im ,
104
- 0.406174279778613755986782507534371688962 - 0.005320233415147143825330022792741146986373im ,
105
- 0.4034434765080088802768898403883213177323 - 0.006086635360116373315297888524355585104786im ,
106
- - 0.07645988937623526826570241610170342028141 + 1.981923553555364980738318081421311944723im ,
107
- 1.884413412262007314623701859090942889452 + 0.2417979244204202515788892924319952726364im
108
- )
109
- d = w.* f
110
-
111
- s1 = 0.0 + 0.0im
112
- s2 = 0.0 + 0.0im
113
-
114
- @fastmath for ind in eachindex (f)
115
- C = inv (z - zz[ind])
116
- s1 += C* d[ind]
117
- s2 += C* w[ind]
118
- end
119
-
120
-
121
- # C = 1 ./ (z .- transpose(zz))
122
- # r = (C*d) ./ (C*w)
123
-
124
- r = (s1/ s2) / (sqrt (z) * exp (- z))
27
+ zz = (- 1.3144540816651462 + 20.054693865816724im , - 1.2152720220184496 + 18.54146805523844im ,
28
+ - 1.0758582968968085 + 16.41442564500392im , - 0.9186088936209557 + 14.015263371275323im ,
29
+ - 0.7533475204960969 + 11.49386205943562im , - 0.5838248556039682 + 8.907445998843897im ,
30
+ - 0.41092161465730614 + 6.269452314652046im , - 0.32055227293065935 + 4.890682596894067im ,
31
+ 16.906716750808087 + 10.865287107782516im , 0.26715371754140166 + 20.098224520867603im ,
32
+ 4.121994532242284 + 2.6493699394695174im , 4.053028754723365 + 19.68712670537236im ,
33
+ - 0.5018982035099 + 7.657486833198153im , 9.416081350634247 + 17.758023876497013im ,
34
+ 1.9674895590143007 + 4.487648029332259im , - 1.275759132467892 + 19.46432302583941im ,
35
+ 7.709313889965882 + 4.954475197822861im , 13.72022229845232 + 14.68895844098729im ,
36
+ - 0.3541218766747901 + 5.402855776372861im , - 0.9973883749616251 + 15.217205990064667im ,
37
+ 5.067285183070908 + 3.256546447342955im , 2.1309472708925585 + 19.986722185708082im ,
38
+ - 0.8162780120038937 + 12.453995821138065im , - 0.6642234573493526 + 10.134091621337502im
39
+ )
40
+ w = (0.023435912479136792 + 0.0im , - 0.07518141047674767 + 0.0475948197731169im ,
41
+ 0.02099862365431344 + 0.10227799317706024im , - 0.044790606134137025 - 0.0019900581421525287im ,
42
+ 0.05092855107420865 - 0.030284027691088355im , 0.11876822116350058 + 0.3545737241031229im ,
43
+ - 0.2800428715703842 + 0.1385502878368521im , 0.07056156978707125 - 0.015640049217372977im ,
44
+ - 0.06946091028316168 + 0.016066454632345423im , 0.08524646892263366 + 0.0953622756709394im ,
45
+ - 0.02790219158045262 + 0.07064926802304639im , 0.1422314233425249 - 0.2536760604980481im ,
46
+ - 0.20586363442913913 + 0.3014383126557577im , 0.20547145538054265 - 0.17388658146749558im ,
47
+ - 0.13839690210608482 - 0.07997812132261209im , - 0.005116954351018287 + 0.07859682420061695im ,
48
+ 0.0409490985507271 - 0.2642881024594653im , - 0.04174610452138103 - 0.23810783641445965im ,
49
+ - 0.14078210159561536 - 0.17647153499232213im , - 0.07672294420555978 + 0.08789101702567167im ,
50
+ - 0.15544491331665283 - 0.17872134246439533im , 0.2746212867658749 + 0.0633913060138901im ,
51
+ 0.003561860807958012 + 0.005781000943183686im , 0.22467614820711904 + 0.050873741433048215im
52
+ )
53
+ f = (4.11757504005866 - 4.095512734321109im , - 2.247112620034342 + 3.680759784557969im ,
54
+ 3.7834318298173315 + 0.562243565983836im , 1.025044899237516 - 2.4295763517152302im ,
55
+ - 1.1024728966418114 - 0.9985456859791928im , - 0.7134052191604513 + 0.634168698676205im ,
56
+ 0.35489432819051814 + 0.8984965319188546im , 0.15105140195420463 - 0.7254114647779558im ,
57
+ 0.401057852147248 - 0.0014084695668244449im , 0.5404571564588408 - 0.1885021348797114im ,
58
+ 0.407770977742567 - 0.00680290179701475im , 0.3994965367795384 - 0.0024661141779376626im ,
59
+ 0.8312271064319111 - 1.0050503936637845im , 0.40006191058465196 - 0.002248719754950748im ,
60
+ 0.4055260568863696 - 0.01689191195791546im , 5.210832430161148 + 1.7413278357835171im ,
61
+ 0.40364747476765517 - 0.003288380266379im , 0.40062798907705705 - 0.0018845654535970921im ,
62
+ - 0.39383201186515915 - 0.17987628384333437im , - 2.053184226968296 + 1.6069066509951657im ,
63
+ 0.40617427977861376 - 0.005320233415147144im , 0.4034434765080089 - 0.006086635360116373im ,
64
+ - 0.07645988937623527 + 1.981923553555365im , 1.8844134122620073 + 0.24179792442042025im
65
+ ). * w
66
+
67
+ s1 = 0.0 + 0.0im
68
+ s2 = 0.0 + 0.0im
69
+ @fastmath for ind in eachindex (f)
70
+ C = inv (z - zz[ind])
71
+ s1 += C* f[ind]
72
+ s2 += C* w[ind]
73
+ end
74
+
75
+ r = s1 / (s2 * sqrt (z) * exp (- z))
125
76
end
126
77
end
127
78
check && (r = conj (r))
@@ -152,7 +103,4 @@ function k0_large_argument(z::T) where T
152
103
p = evalpoly(1/z, (1.0, -1/8, 9/128, -75/1024, 3675/32768, -59535/262144, 2401245/4194304, -57972915/33554432, 13043905875/2147483648, -418854310875/17179869184, 30241281245175/274877906944, -1212400457192925/2199023255552, 213786613951685775/70368744177664, -10278202593831046875/562949953421312, 1070401384414690453125/9007199254740992, -60013837619516978071875/72057594037927936, 57673297952355815927071875/9223372036854775808, -3694483615889146090857721875/73786976294838206464, 502860269940467106811189921875/1180591620717411303424, -36232405765710498380237842265625/9444732965739290427392, 11021897833929133607268351617203125/302231454903657293676544, -882276678992136837800861860405640625/2417851639229258349412352, T(148302689041496455735799416353639046875)/T(38685626227668133590597632)))
153
104
return c*p
154
105
end
155
- =#
156
-
157
-
158
- # # these are pretty good but still need some work
106
+ =#
0 commit comments