[3839] | 1 | /*************************************************************************
|
---|
| 2 | Cephes Math Library Release 2.8: June, 2000
|
---|
| 3 | Copyright by Stephen L. Moshier
|
---|
| 4 |
|
---|
| 5 | Contributors:
|
---|
| 6 | * Sergey Bochkanov (ALGLIB project). Translation from C to
|
---|
| 7 | pseudocode.
|
---|
| 8 |
|
---|
| 9 | See subroutines comments for additional copyrights.
|
---|
| 10 |
|
---|
| 11 | >>> SOURCE LICENSE >>>
|
---|
| 12 | This program is free software; you can redistribute it and/or modify
|
---|
| 13 | it under the terms of the GNU General Public License as published by
|
---|
| 14 | the Free Software Foundation (www.fsf.org); either version 2 of the
|
---|
| 15 | License, or (at your option) any later version.
|
---|
| 16 |
|
---|
| 17 | This program is distributed in the hope that it will be useful,
|
---|
| 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 20 | GNU General Public License for more details.
|
---|
| 21 |
|
---|
| 22 | A copy of the GNU General Public License is available at
|
---|
| 23 | http://www.fsf.org/licensing/licenses
|
---|
| 24 |
|
---|
| 25 | >>> END OF LICENSE >>>
|
---|
| 26 | *************************************************************************/
|
---|
| 27 |
|
---|
| 28 | using System;
|
---|
| 29 |
|
---|
| 30 | namespace alglib
|
---|
| 31 | {
|
---|
| 32 | public class dawson
|
---|
| 33 | {
|
---|
| 34 | /*************************************************************************
|
---|
| 35 | Dawson's Integral
|
---|
| 36 |
|
---|
| 37 | Approximates the integral
|
---|
| 38 |
|
---|
| 39 | x
|
---|
| 40 | -
|
---|
| 41 | 2 | | 2
|
---|
| 42 | dawsn(x) = exp( -x ) | exp( t ) dt
|
---|
| 43 | | |
|
---|
| 44 | -
|
---|
| 45 | 0
|
---|
| 46 |
|
---|
| 47 | Three different rational approximations are employed, for
|
---|
| 48 | the intervals 0 to 3.25; 3.25 to 6.25; and 6.25 up.
|
---|
| 49 |
|
---|
| 50 | ACCURACY:
|
---|
| 51 |
|
---|
| 52 | Relative error:
|
---|
| 53 | arithmetic domain # trials peak rms
|
---|
| 54 | IEEE 0,10 10000 6.9e-16 1.0e-16
|
---|
| 55 |
|
---|
| 56 | Cephes Math Library Release 2.8: June, 2000
|
---|
| 57 | Copyright 1984, 1987, 1989, 2000 by Stephen L. Moshier
|
---|
| 58 | *************************************************************************/
|
---|
| 59 | public static double dawsonintegral(double x)
|
---|
| 60 | {
|
---|
| 61 | double result = 0;
|
---|
| 62 | double x2 = 0;
|
---|
| 63 | double y = 0;
|
---|
| 64 | int sg = 0;
|
---|
| 65 | double an = 0;
|
---|
| 66 | double ad = 0;
|
---|
| 67 | double bn = 0;
|
---|
| 68 | double bd = 0;
|
---|
| 69 | double cn = 0;
|
---|
| 70 | double cd = 0;
|
---|
| 71 |
|
---|
| 72 | sg = 1;
|
---|
| 73 | if( (double)(x)<(double)(0) )
|
---|
| 74 | {
|
---|
| 75 | sg = -1;
|
---|
| 76 | x = -x;
|
---|
| 77 | }
|
---|
| 78 | if( (double)(x)<(double)(3.25) )
|
---|
| 79 | {
|
---|
| 80 | x2 = x*x;
|
---|
| 81 | an = 1.13681498971755972054E-11;
|
---|
| 82 | an = an*x2+8.49262267667473811108E-10;
|
---|
| 83 | an = an*x2+1.94434204175553054283E-8;
|
---|
| 84 | an = an*x2+9.53151741254484363489E-7;
|
---|
| 85 | an = an*x2+3.07828309874913200438E-6;
|
---|
| 86 | an = an*x2+3.52513368520288738649E-4;
|
---|
| 87 | an = an*x2+-8.50149846724410912031E-4;
|
---|
| 88 | an = an*x2+4.22618223005546594270E-2;
|
---|
| 89 | an = an*x2+-9.17480371773452345351E-2;
|
---|
| 90 | an = an*x2+9.99999999999999994612E-1;
|
---|
| 91 | ad = 2.40372073066762605484E-11;
|
---|
| 92 | ad = ad*x2+1.48864681368493396752E-9;
|
---|
| 93 | ad = ad*x2+5.21265281010541664570E-8;
|
---|
| 94 | ad = ad*x2+1.27258478273186970203E-6;
|
---|
| 95 | ad = ad*x2+2.32490249820789513991E-5;
|
---|
| 96 | ad = ad*x2+3.25524741826057911661E-4;
|
---|
| 97 | ad = ad*x2+3.48805814657162590916E-3;
|
---|
| 98 | ad = ad*x2+2.79448531198828973716E-2;
|
---|
| 99 | ad = ad*x2+1.58874241960120565368E-1;
|
---|
| 100 | ad = ad*x2+5.74918629489320327824E-1;
|
---|
| 101 | ad = ad*x2+1.00000000000000000539E0;
|
---|
| 102 | y = x*an/ad;
|
---|
| 103 | result = sg*y;
|
---|
| 104 | return result;
|
---|
| 105 | }
|
---|
| 106 | x2 = 1.0/(x*x);
|
---|
| 107 | if( (double)(x)<(double)(6.25) )
|
---|
| 108 | {
|
---|
| 109 | bn = 5.08955156417900903354E-1;
|
---|
| 110 | bn = bn*x2-2.44754418142697847934E-1;
|
---|
| 111 | bn = bn*x2+9.41512335303534411857E-2;
|
---|
| 112 | bn = bn*x2-2.18711255142039025206E-2;
|
---|
| 113 | bn = bn*x2+3.66207612329569181322E-3;
|
---|
| 114 | bn = bn*x2-4.23209114460388756528E-4;
|
---|
| 115 | bn = bn*x2+3.59641304793896631888E-5;
|
---|
| 116 | bn = bn*x2-2.14640351719968974225E-6;
|
---|
| 117 | bn = bn*x2+9.10010780076391431042E-8;
|
---|
| 118 | bn = bn*x2-2.40274520828250956942E-9;
|
---|
| 119 | bn = bn*x2+3.59233385440928410398E-11;
|
---|
| 120 | bd = 1.00000000000000000000E0;
|
---|
| 121 | bd = bd*x2-6.31839869873368190192E-1;
|
---|
| 122 | bd = bd*x2+2.36706788228248691528E-1;
|
---|
| 123 | bd = bd*x2-5.31806367003223277662E-2;
|
---|
| 124 | bd = bd*x2+8.48041718586295374409E-3;
|
---|
| 125 | bd = bd*x2-9.47996768486665330168E-4;
|
---|
| 126 | bd = bd*x2+7.81025592944552338085E-5;
|
---|
| 127 | bd = bd*x2-4.55875153252442634831E-6;
|
---|
| 128 | bd = bd*x2+1.89100358111421846170E-7;
|
---|
| 129 | bd = bd*x2-4.91324691331920606875E-9;
|
---|
| 130 | bd = bd*x2+7.18466403235734541950E-11;
|
---|
| 131 | y = 1.0/x+x2*bn/(bd*x);
|
---|
| 132 | result = sg*0.5*y;
|
---|
| 133 | return result;
|
---|
| 134 | }
|
---|
| 135 | if( (double)(x)>(double)(1.0E9) )
|
---|
| 136 | {
|
---|
| 137 | result = sg*0.5/x;
|
---|
| 138 | return result;
|
---|
| 139 | }
|
---|
| 140 | cn = -5.90592860534773254987E-1;
|
---|
| 141 | cn = cn*x2+6.29235242724368800674E-1;
|
---|
| 142 | cn = cn*x2-1.72858975380388136411E-1;
|
---|
| 143 | cn = cn*x2+1.64837047825189632310E-2;
|
---|
| 144 | cn = cn*x2-4.86827613020462700845E-4;
|
---|
| 145 | cd = 1.00000000000000000000E0;
|
---|
| 146 | cd = cd*x2-2.69820057197544900361E0;
|
---|
| 147 | cd = cd*x2+1.73270799045947845857E0;
|
---|
| 148 | cd = cd*x2-3.93708582281939493482E-1;
|
---|
| 149 | cd = cd*x2+3.44278924041233391079E-2;
|
---|
| 150 | cd = cd*x2-9.73655226040941223894E-4;
|
---|
| 151 | y = 1.0/x+x2*cn/(cd*x);
|
---|
| 152 | result = sg*0.5*y;
|
---|
| 153 | return result;
|
---|
| 154 | }
|
---|
| 155 | }
|
---|
| 156 | }
|
---|