[230f479] | 1 | /* k1.c |
---|
| 2 | * |
---|
| 3 | * Modified Bessel function, third kind, order one |
---|
| 4 | * |
---|
| 5 | * |
---|
| 6 | * |
---|
| 7 | * SYNOPSIS: |
---|
| 8 | * |
---|
| 9 | * double x, y, k1(); |
---|
| 10 | * |
---|
| 11 | * y = k1( x ); |
---|
| 12 | * |
---|
| 13 | * |
---|
| 14 | * |
---|
| 15 | * DESCRIPTION: |
---|
| 16 | * |
---|
| 17 | * Computes the modified Bessel function of the third kind |
---|
| 18 | * of order one of the argument. |
---|
| 19 | * |
---|
| 20 | * The range is partitioned into the two intervals [0,2] and |
---|
| 21 | * (2, infinity). Chebyshev polynomial expansions are employed |
---|
| 22 | * in each interval. |
---|
| 23 | * |
---|
| 24 | * |
---|
| 25 | * |
---|
| 26 | * ACCURACY: |
---|
| 27 | * |
---|
| 28 | * Relative error: |
---|
| 29 | * arithmetic domain # trials peak rms |
---|
| 30 | * DEC 0, 30 3300 8.9e-17 2.2e-17 |
---|
| 31 | * IEEE 0, 30 30000 1.2e-15 1.6e-16 |
---|
| 32 | * |
---|
| 33 | * ERROR MESSAGES: |
---|
| 34 | * |
---|
| 35 | * message condition value returned |
---|
| 36 | * k1 domain x <= 0 MAXNUM |
---|
| 37 | * |
---|
| 38 | */ |
---|
| 39 | /* k1e.c |
---|
| 40 | * |
---|
| 41 | * Modified Bessel function, third kind, order one, |
---|
| 42 | * exponentially scaled |
---|
| 43 | * |
---|
| 44 | * |
---|
| 45 | * |
---|
| 46 | * SYNOPSIS: |
---|
| 47 | * |
---|
| 48 | * double x, y, k1e(); |
---|
| 49 | * |
---|
| 50 | * y = k1e( x ); |
---|
| 51 | * |
---|
| 52 | * |
---|
| 53 | * |
---|
| 54 | * DESCRIPTION: |
---|
| 55 | * |
---|
| 56 | * Returns exponentially scaled modified Bessel function |
---|
| 57 | * of the third kind of order one of the argument: |
---|
| 58 | * |
---|
| 59 | * k1e(x) = exp(x) * k1(x). |
---|
| 60 | * |
---|
| 61 | * |
---|
| 62 | * |
---|
| 63 | * ACCURACY: |
---|
| 64 | * |
---|
| 65 | * Relative error: |
---|
| 66 | * arithmetic domain # trials peak rms |
---|
| 67 | * IEEE 0, 30 30000 7.8e-16 1.2e-16 |
---|
| 68 | * See k1(). |
---|
| 69 | * |
---|
| 70 | */ |
---|
| 71 | |
---|
| 72 | /* |
---|
| 73 | Cephes Math Library Release 2.8: June, 2000 |
---|
| 74 | Copyright 1984, 1987, 2000 by Stephen L. Moshier |
---|
| 75 | */ |
---|
| 76 | |
---|
| 77 | #include "mconf.h" |
---|
| 78 | |
---|
| 79 | /* Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) |
---|
| 80 | * in the interval [0,2]. |
---|
| 81 | * |
---|
| 82 | * lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. |
---|
| 83 | */ |
---|
| 84 | |
---|
| 85 | #ifdef UNK |
---|
| 86 | static double A[] = |
---|
| 87 | { |
---|
| 88 | -7.02386347938628759343E-18, |
---|
| 89 | -2.42744985051936593393E-15, |
---|
| 90 | -6.66690169419932900609E-13, |
---|
| 91 | -1.41148839263352776110E-10, |
---|
| 92 | -2.21338763073472585583E-8, |
---|
| 93 | -2.43340614156596823496E-6, |
---|
| 94 | -1.73028895751305206302E-4, |
---|
| 95 | -6.97572385963986435018E-3, |
---|
| 96 | -1.22611180822657148235E-1, |
---|
| 97 | -3.53155960776544875667E-1, |
---|
| 98 | 1.52530022733894777053E0 |
---|
| 99 | }; |
---|
| 100 | #endif |
---|
| 101 | |
---|
| 102 | #ifdef DEC |
---|
| 103 | static unsigned short A[] = { |
---|
| 104 | 0122001,0110501,0164746,0151255, |
---|
| 105 | 0124056,0165213,0150034,0147377, |
---|
| 106 | 0126073,0124026,0167207,0001044, |
---|
| 107 | 0130033,0030735,0141061,0033116, |
---|
| 108 | 0131676,0020350,0121341,0107175, |
---|
| 109 | 0133443,0046631,0062031,0070716, |
---|
| 110 | 0135065,0067427,0026435,0164022, |
---|
| 111 | 0136344,0112234,0165752,0006222, |
---|
| 112 | 0137373,0015622,0017016,0155636, |
---|
| 113 | 0137664,0150333,0125730,0067240, |
---|
| 114 | 0040303,0036411,0130200,0043120 |
---|
| 115 | }; |
---|
| 116 | #endif |
---|
| 117 | |
---|
| 118 | #ifdef IBMPC |
---|
| 119 | static unsigned short A[] = { |
---|
| 120 | 0xda56,0x3d3c,0x3228,0xbc60, |
---|
| 121 | 0x99e0,0x7a03,0xdd51,0xbce5, |
---|
| 122 | 0xe045,0xddd0,0x7502,0xbd67, |
---|
| 123 | 0x26ca,0xb846,0x663b,0xbde3, |
---|
| 124 | 0x31d0,0x145c,0xc41d,0xbe57, |
---|
| 125 | 0x2e3a,0x2c83,0x69b3,0xbec4, |
---|
| 126 | 0xbd02,0xe5a3,0xade2,0xbf26, |
---|
| 127 | 0x4192,0x9d7d,0x9293,0xbf7c, |
---|
| 128 | 0xdb74,0x43c1,0x6372,0xbfbf, |
---|
| 129 | 0x0dd4,0x757b,0x9a1b,0xbfd6, |
---|
| 130 | 0x08ca,0x3610,0x67a1,0x3ff8 |
---|
| 131 | }; |
---|
| 132 | #endif |
---|
| 133 | |
---|
| 134 | #ifdef MIEEE |
---|
| 135 | static unsigned short A[] = { |
---|
| 136 | 0xbc60,0x3228,0x3d3c,0xda56, |
---|
| 137 | 0xbce5,0xdd51,0x7a03,0x99e0, |
---|
| 138 | 0xbd67,0x7502,0xddd0,0xe045, |
---|
| 139 | 0xbde3,0x663b,0xb846,0x26ca, |
---|
| 140 | 0xbe57,0xc41d,0x145c,0x31d0, |
---|
| 141 | 0xbec4,0x69b3,0x2c83,0x2e3a, |
---|
| 142 | 0xbf26,0xade2,0xe5a3,0xbd02, |
---|
| 143 | 0xbf7c,0x9293,0x9d7d,0x4192, |
---|
| 144 | 0xbfbf,0x6372,0x43c1,0xdb74, |
---|
| 145 | 0xbfd6,0x9a1b,0x757b,0x0dd4, |
---|
| 146 | 0x3ff8,0x67a1,0x3610,0x08ca |
---|
| 147 | }; |
---|
| 148 | #endif |
---|
| 149 | |
---|
| 150 | |
---|
| 151 | |
---|
| 152 | /* Chebyshev coefficients for exp(x) sqrt(x) K1(x) |
---|
| 153 | * in the interval [2,infinity]. |
---|
| 154 | * |
---|
| 155 | * lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). |
---|
| 156 | */ |
---|
| 157 | |
---|
| 158 | #ifdef UNK |
---|
| 159 | static double B[] = |
---|
| 160 | { |
---|
| 161 | -5.75674448366501715755E-18, |
---|
| 162 | 1.79405087314755922667E-17, |
---|
| 163 | -5.68946255844285935196E-17, |
---|
| 164 | 1.83809354436663880070E-16, |
---|
| 165 | -6.05704724837331885336E-16, |
---|
| 166 | 2.03870316562433424052E-15, |
---|
| 167 | -7.01983709041831346144E-15, |
---|
| 168 | 2.47715442448130437068E-14, |
---|
| 169 | -8.97670518232499435011E-14, |
---|
| 170 | 3.34841966607842919884E-13, |
---|
| 171 | -1.28917396095102890680E-12, |
---|
| 172 | 5.13963967348173025100E-12, |
---|
| 173 | -2.12996783842756842877E-11, |
---|
| 174 | 9.21831518760500529508E-11, |
---|
| 175 | -4.19035475934189648750E-10, |
---|
| 176 | 2.01504975519703286596E-9, |
---|
| 177 | -1.03457624656780970260E-8, |
---|
| 178 | 5.74108412545004946722E-8, |
---|
| 179 | -3.50196060308781257119E-7, |
---|
| 180 | 2.40648494783721712015E-6, |
---|
| 181 | -1.93619797416608296024E-5, |
---|
| 182 | 1.95215518471351631108E-4, |
---|
| 183 | -2.85781685962277938680E-3, |
---|
| 184 | 1.03923736576817238437E-1, |
---|
| 185 | 2.72062619048444266945E0 |
---|
| 186 | }; |
---|
| 187 | #endif |
---|
| 188 | |
---|
| 189 | #ifdef DEC |
---|
| 190 | static unsigned short B[] = { |
---|
| 191 | 0121724,0061352,0013041,0150076, |
---|
| 192 | 0022245,0074324,0016172,0173232, |
---|
| 193 | 0122603,0030250,0135670,0165221, |
---|
| 194 | 0023123,0165362,0023561,0060124, |
---|
| 195 | 0123456,0112436,0141654,0073623, |
---|
| 196 | 0024022,0163557,0077564,0006753, |
---|
| 197 | 0124374,0165221,0131014,0026524, |
---|
| 198 | 0024737,0017512,0144250,0175451, |
---|
| 199 | 0125312,0021456,0123136,0076633, |
---|
| 200 | 0025674,0077720,0020125,0102607, |
---|
| 201 | 0126265,0067543,0007744,0043701, |
---|
| 202 | 0026664,0152702,0033002,0074202, |
---|
| 203 | 0127273,0055234,0120016,0071733, |
---|
| 204 | 0027712,0133200,0042441,0075515, |
---|
| 205 | 0130346,0057000,0015456,0074470, |
---|
| 206 | 0031012,0074441,0051636,0111155, |
---|
| 207 | 0131461,0136444,0177417,0002101, |
---|
| 208 | 0032166,0111743,0032176,0021410, |
---|
| 209 | 0132674,0001224,0076555,0027060, |
---|
| 210 | 0033441,0077430,0135226,0106663, |
---|
| 211 | 0134242,0065610,0167155,0113447, |
---|
| 212 | 0035114,0131304,0043664,0102163, |
---|
| 213 | 0136073,0045065,0171465,0122123, |
---|
| 214 | 0037324,0152767,0147401,0017732, |
---|
| 215 | 0040456,0017275,0050061,0062120, |
---|
| 216 | }; |
---|
| 217 | #endif |
---|
| 218 | |
---|
| 219 | #ifdef IBMPC |
---|
| 220 | static unsigned short B[] = { |
---|
| 221 | 0x3a08,0x42c4,0x8c5d,0xbc5a, |
---|
| 222 | 0x5ed3,0x838f,0xaf1a,0x3c74, |
---|
| 223 | 0x1d52,0x1777,0x6615,0xbc90, |
---|
| 224 | 0x2c0b,0x44ee,0x7d5e,0x3caa, |
---|
| 225 | 0x8ef2,0xd875,0xd2a3,0xbcc5, |
---|
| 226 | 0x81bd,0xefee,0x5ced,0x3ce2, |
---|
| 227 | 0x85ab,0x3641,0x9d52,0xbcff, |
---|
| 228 | 0x1f65,0x5915,0xe3e9,0x3d1b, |
---|
| 229 | 0xcfb3,0xd4cb,0x4465,0xbd39, |
---|
| 230 | 0xb0b1,0x040a,0x8ffa,0x3d57, |
---|
| 231 | 0x88f8,0x61fc,0xadec,0xbd76, |
---|
| 232 | 0x4f10,0x46c0,0x9ab8,0x3d96, |
---|
| 233 | 0xce7b,0x9401,0x6b53,0xbdb7, |
---|
| 234 | 0x2f6a,0x08a4,0x56d0,0x3dd9, |
---|
| 235 | 0xcf27,0x0365,0xcbc0,0xbdfc, |
---|
| 236 | 0xd24e,0x2a73,0x4f24,0x3e21, |
---|
| 237 | 0xe088,0x9fe1,0x37a4,0xbe46, |
---|
| 238 | 0xc461,0x668f,0xd27c,0x3e6e, |
---|
| 239 | 0xa5c6,0x8fad,0x8052,0xbe97, |
---|
| 240 | 0xd1b6,0x1752,0x2fe3,0x3ec4, |
---|
| 241 | 0xb2e5,0x1dcd,0x4d71,0xbef4, |
---|
| 242 | 0x908e,0x88f6,0x9658,0x3f29, |
---|
| 243 | 0xb48a,0xbe66,0x6946,0xbf67, |
---|
| 244 | 0x23fb,0xf9e0,0x9abe,0x3fba, |
---|
| 245 | 0x2c8a,0xaa06,0xc3d7,0x4005 |
---|
| 246 | }; |
---|
| 247 | #endif |
---|
| 248 | |
---|
| 249 | #ifdef MIEEE |
---|
| 250 | static unsigned short B[] = { |
---|
| 251 | 0xbc5a,0x8c5d,0x42c4,0x3a08, |
---|
| 252 | 0x3c74,0xaf1a,0x838f,0x5ed3, |
---|
| 253 | 0xbc90,0x6615,0x1777,0x1d52, |
---|
| 254 | 0x3caa,0x7d5e,0x44ee,0x2c0b, |
---|
| 255 | 0xbcc5,0xd2a3,0xd875,0x8ef2, |
---|
| 256 | 0x3ce2,0x5ced,0xefee,0x81bd, |
---|
| 257 | 0xbcff,0x9d52,0x3641,0x85ab, |
---|
| 258 | 0x3d1b,0xe3e9,0x5915,0x1f65, |
---|
| 259 | 0xbd39,0x4465,0xd4cb,0xcfb3, |
---|
| 260 | 0x3d57,0x8ffa,0x040a,0xb0b1, |
---|
| 261 | 0xbd76,0xadec,0x61fc,0x88f8, |
---|
| 262 | 0x3d96,0x9ab8,0x46c0,0x4f10, |
---|
| 263 | 0xbdb7,0x6b53,0x9401,0xce7b, |
---|
| 264 | 0x3dd9,0x56d0,0x08a4,0x2f6a, |
---|
| 265 | 0xbdfc,0xcbc0,0x0365,0xcf27, |
---|
| 266 | 0x3e21,0x4f24,0x2a73,0xd24e, |
---|
| 267 | 0xbe46,0x37a4,0x9fe1,0xe088, |
---|
| 268 | 0x3e6e,0xd27c,0x668f,0xc461, |
---|
| 269 | 0xbe97,0x8052,0x8fad,0xa5c6, |
---|
| 270 | 0x3ec4,0x2fe3,0x1752,0xd1b6, |
---|
| 271 | 0xbef4,0x4d71,0x1dcd,0xb2e5, |
---|
| 272 | 0x3f29,0x9658,0x88f6,0x908e, |
---|
| 273 | 0xbf67,0x6946,0xbe66,0xb48a, |
---|
| 274 | 0x3fba,0x9abe,0xf9e0,0x23fb, |
---|
| 275 | 0x4005,0xc3d7,0xaa06,0x2c8a |
---|
| 276 | }; |
---|
| 277 | #endif |
---|
| 278 | |
---|
| 279 | #ifdef ANSIPROT |
---|
| 280 | extern double chbevl ( double, void *, int ); |
---|
| 281 | extern double exp ( double ); |
---|
| 282 | extern double i1 ( double ); |
---|
| 283 | extern double log ( double ); |
---|
| 284 | extern double sqrt ( double ); |
---|
| 285 | #else |
---|
| 286 | double chbevl(), exp(), i1(), log(), sqrt(); |
---|
| 287 | #endif |
---|
| 288 | extern double PI; |
---|
| 289 | extern double MINLOG, MAXNUM; |
---|
| 290 | |
---|
| 291 | double k1(x) |
---|
| 292 | double x; |
---|
| 293 | { |
---|
| 294 | double y, z; |
---|
| 295 | |
---|
| 296 | z = 0.5 * x; |
---|
| 297 | if( z <= 0.0 ) |
---|
| 298 | { |
---|
| 299 | mtherr( "k1", DOMAIN ); |
---|
| 300 | return( MAXNUM ); |
---|
| 301 | } |
---|
| 302 | |
---|
| 303 | if( x <= 2.0 ) |
---|
| 304 | { |
---|
| 305 | y = x * x - 2.0; |
---|
| 306 | y = log(z) * i1(x) + chbevl( y, A, 11 ) / x; |
---|
| 307 | return( y ); |
---|
| 308 | } |
---|
| 309 | |
---|
| 310 | return( exp(-x) * chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) ); |
---|
| 311 | } |
---|
| 312 | |
---|
| 313 | |
---|
| 314 | |
---|
| 315 | |
---|
| 316 | double k1e( x ) |
---|
| 317 | double x; |
---|
| 318 | { |
---|
| 319 | double y; |
---|
| 320 | |
---|
| 321 | if( x <= 0.0 ) |
---|
| 322 | { |
---|
| 323 | mtherr( "k1e", DOMAIN ); |
---|
| 324 | return( MAXNUM ); |
---|
| 325 | } |
---|
| 326 | |
---|
| 327 | if( x <= 2.0 ) |
---|
| 328 | { |
---|
| 329 | y = x * x - 2.0; |
---|
| 330 | y = log( 0.5 * x ) * i1(x) + chbevl( y, A, 11 ) / x; |
---|
| 331 | return( y * exp(x) ); |
---|
| 332 | } |
---|
| 333 | |
---|
| 334 | return( chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) ); |
---|
| 335 | } |
---|