SpecialFunction.inl
上传用户:fxromeo
上传日期:2010-04-08
资源大小:89k
文件大小:18k
开发平台:

Visual C++

  1. //SpecialFunction.inl 特殊函数定义头文件
  2. // Ver 1.0.0.0
  3. // 版权所有(C) 何渝, 2002
  4. // 最后修改: 2002.5.31.
  5. #ifndef _SPECIALFUNCTION_INL //避免多次编译
  6. #define _SPECIALFUNCTION_INL
  7. //template <class _Ty = float>
  8. //伽马函数
  9. template <class _Ty>
  10. _Ty GammaFunction(_Ty x)
  11. {
  12.     _Ty t;
  13.     _Ty a[11] = 
  14. {
  15.  0.0000677106, -0.0003442342,  0.0015397681,
  16. -0.0024467480,  0.0109736958, -0.0002109075,
  17.  0.0742379071,  0.0815782188,  0.4118402518,
  18.  0.4227843370,  1.0
  19. };
  20.     if(x<0.0 || FloatEqual(x,0.0))
  21.     {
  22. cout << "Error **x<=0!" << endl; 
  23. return(-1.0);
  24. }
  25.     _Ty y = x;
  26.     if(y<1.0 || FloatEqual(y,1.0))
  27.     {
  28. t=1.0/(y*(y+1.0)); 
  29. y=y+2.0;
  30. }
  31.     else
  32. if(y<2.0 || FloatEqual(y,2.0))
  33. {
  34. t=1.0/y; 
  35. y=y+1.0;
  36. }
  37. else
  38. if(y<3.0 || FloatEqual(y,3.0)) t=1.0;
  39. else
  40. {
  41. t=1.0;
  42. while(y>3.0)
  43. {
  44. y=y-1.0;
  45. t=t*y;
  46. }
  47. }
  48.     _Ty s=a[0]; 
  49. _Ty u = y - 2.0;
  50.     for(int i=1; i<11; i++) s = s * u + a[i];
  51.     s = s * t;
  52.     return(s);
  53. }
  54. //不完全伽马函数
  55. template <class _Ty>
  56. _Ty IncompleteGammaFunction(_Ty a, _Ty x)
  57. {
  58. int n;
  59.     _Ty p,d,s,s1,p0,q0,p1,q1;
  60.     if((a<0.0 || FloatEqual(a,0.0)) || (x<0.0))
  61.     { 
  62. if(a<0.0 || FloatEqual(a,0.0)) cout <<"Error **a<=0!" <<endl;
  63.         if(x<0.0) cout << "Error **x<0!" << endl;
  64.         return(-1.0);
  65.     }
  66.     if(FloatEqual(x,0.0)) return(0.0);
  67.     if(x>1.0e+35) return(1.0);
  68.     _Ty q = log(x); 
  69. q = a * q; 
  70. _Ty qq = exp(q);
  71.     if(x<1.0+a)
  72.     {
  73. p=a; 
  74. d=1.0/a; 
  75. s=d;
  76.         for(n=1; n<101; n++)
  77.         {
  78. p=1.0+p;
  79. d=d*x/p;
  80. s=s+d;
  81. if(Abs(d)<Abs(s)*FLOATERROR)
  82.             {
  83. s=s*exp(-x)*qq/GammaFunction(a);
  84.                 return(s);
  85.             }
  86.         }
  87.     }
  88.     else
  89.     { 
  90. s=1.0/x; 
  91. p0=0.0; 
  92. p1=1.0;
  93. q0=1.0;
  94. q1=x;
  95.         for(n=1; n<101; n++)
  96.         { 
  97. p0=p1+(n-a)*p0;
  98. q0=q1+(n-a)*q0;
  99.             p=x*p0+n*p1;
  100. q=x*q0+n*q1;
  101.             if(FloatNotEqual(q,0.0))
  102.             {
  103. s1=p/q; 
  104. p1=p; 
  105. q1=q;
  106.                 if(Abs((s1-s)/s1)<FLOATERROR)
  107.                 { 
  108. s=s1*exp(-x)*qq/GammaFunction(a);
  109.                     return(1.0-s);
  110.                 }
  111.                 s=s1;
  112.             }
  113.             p1=p; 
  114. q1=q;
  115.         }
  116.     }
  117.     cout << "a too large !" << endl;
  118.     s=1.0-s*exp(-x)*qq/GammaFunction(a);
  119.     return(s);
  120. }
  121. //误差函数
  122. template <class _Ty>
  123. _Ty ErrorFunction(_Ty x)
  124. {
  125. _Ty y;
  126.     if(x>0.0 || FloatEqual(x,0.0))
  127.       y=IncompleteGammaFunction(0.5,x*x);
  128.     else
  129.       y=-IncompleteGammaFunction(0.5,x*x);
  130.     return(y);
  131. }
  132. //第一类整数阶贝塞尔函数
  133. template <class _Ty>
  134. _Ty IntegerBessel1stFunction(int n, _Ty x)
  135. {
  136. int i,m;
  137.     _Ty y,z,p,q,s,b0,b1;
  138.     _Ty a[6]={ 57568490574.0,-13362590354.0,
  139.              651619640.7,-11214424.18,77392.33017,-184.9052456};
  140.     _Ty b[6]={ 57568490411.0,1029532985.0,
  141.              9494680.718,59272.64853,267.8532712,1.0};
  142.     _Ty c[6]={ 72362614232.0,-7895059235.0,
  143.              242396853.1,-2972611.439,15704.4826,-30.16036606};
  144.     _Ty d[6]={ 144725228443.0,2300535178.0,
  145.              18583304.74,99447.43394,376.9991397,1.0};
  146.     _Ty e[5]={ 1.0,-0.1098628627e-02,
  147.              0.2734510407e-04,-0.2073370639e-05,0.2093887211e-06};
  148.     _Ty f[5]={ -0.1562499995e-01,
  149.              0.1430488765e-03,-0.6911147651e-05,
  150.              0.7621095161e-06,-0.934935152e-07};
  151.     _Ty g[5]={ 1.0,0.183105e-02,
  152.              -0.3516396496e-04,0.2457520174e-05, -0.240337019e-06};
  153.     _Ty h[5]={ 0.4687499995e-01,
  154.              -0.2002690873e-03,0.8449199096e-05,
  155.              -0.88228987e-06,0.105787412e-06};
  156.     _Ty t=Abs(x);
  157.     if(n<0) n=-n;
  158.     if(n!=1)
  159.     { 
  160. if(t<8.0)
  161.         {
  162. y=t*t;
  163. p=a[5];
  164. q=b[5];
  165. for(i=4; i>=0; i--)
  166.             { 
  167. p=p*y+a[i];
  168. q=q*y+b[i];
  169. }
  170. p=p/q;
  171.         }
  172.         else
  173.         { 
  174. z=8.0/t;
  175. y=z*z;
  176.             p=e[4];
  177. q=f[4];
  178.             for(i=3; i>=0; i--)
  179.             {
  180. p=p*y+e[i];
  181. q=q*y+f[i];
  182. }
  183.             s=t-0.785398164;
  184.             p=p*cos(s)-z*q*sin(s);
  185.             p=p*sqrt(0.636619772/t);
  186.         }
  187.     }
  188.     if(n==0) return(p);
  189.     b0=p;
  190.     if(t<8.0)
  191.     { 
  192. y=t*t; 
  193. p=c[5];
  194. q=d[5];
  195.         for(i=4; i>=0; i--)
  196.         {
  197. p=p*y+c[i];
  198. q=q*y+d[i];
  199. }
  200.         p=x*p/q;
  201.     }
  202.     else
  203.     {
  204. z=8.0/t; 
  205. y=z*z;
  206.         p=g[4];
  207. q=h[4];
  208.         for(i=3; i>=0; i--)
  209.         {
  210. p=p*y+g[i];
  211. q=q*y+h[i];
  212. }
  213.         s=t-2.356194491;
  214.         p=p*cos(s)-z*q*sin(s);
  215.         p=p*x*sqrt(0.636619772/t)/t;
  216.     }
  217.     if(n==1) return(p);
  218.     b1=p;
  219.     if(x==0.0) return(0.0);
  220.     s=2.0/t;
  221.     if(t>1.0*n)
  222.     {
  223. if(x<0.0) b1=-b1;
  224.         for(i=1; i<n; i++)
  225.         { 
  226. p=s*i*b1-b0; 
  227. b0=b1; 
  228. b1=p;
  229. }
  230.     }
  231.     else
  232.     {
  233. m=(n+(int)sqrt(40.0*n))/2;
  234.         m=2*m;
  235.         p = q = b1 = 0.0;
  236. b0=1.0;
  237.         for(i=m-1; i>=0; i--)
  238.         { 
  239. t=s*(i+1)*b0-b1;
  240.             b1=b0;
  241. b0=t;
  242.             if(Abs(b0)>1.0e+10)
  243.             {
  244. b0=b0*1.0e-10; 
  245. b1=b1*1.0e-10;
  246.                 p=p*1.0e-10; 
  247. q=q*1.0e-10;
  248.             }
  249.             if((i+2)%2==0) q=q+b0;
  250.             if((i+1)==n) p=b1;
  251.         }
  252.         q=2.0*q-b0;
  253. p=p/q;
  254.     }
  255.     if((x<0.0)&&(n%2==1)) p=-p;
  256.     return(p);
  257. }
  258. //第二类整数阶贝塞尔函数
  259. template <class _Ty>
  260. _Ty IntegerBessel2ndFunction(int n, _Ty x)
  261. {
  262. int i;
  263.     _Ty y,z,p,q,s,b0,b1;
  264.     _Ty a[6]={ -2.957821389e+9,7.062834065e+9,
  265.              -5.123598036e+8,1.087988129e+7,-8.632792757e+4,
  266.              2.284622733e+2};
  267.     _Ty b[6]={ 4.0076544269e+10,7.452499648e+8,
  268.            7.189466438e+6,4.74472647e+4,2.261030244e+2,1.0};
  269.     _Ty c[6]={ -4.900604943e+12,1.27527439e+12,
  270.             -5.153438139e+10,7.349264551e+8,-4.237922726e+6,
  271.              8.511937935e+3};
  272.     _Ty d[7]={ 2.49958057e+13,4.244419664e+11,
  273.             3.733650367e+9,2.245904002e+7,1.02042605e+5,
  274.             3.549632885e+2,1.0};
  275.     _Ty e[5]={ 1.0,-0.1098628627e-02,
  276.              0.2734510407e-04,-0.2073370639e-05,
  277.              0.2093887211e-06};
  278.     _Ty f[5]={ -0.1562499995e-01,
  279.              0.1430488765e-03,-0.6911147651e-05,
  280.              0.7621095161e-06,-0.934935152e-07};
  281.     _Ty g[5]={ 1.0,0.183105e-02,
  282.              -0.3516396496e-04,0.2457520174e-05,
  283.              -0.240337019e-06};
  284.     _Ty h[5]={ 0.4687499995e-01,
  285.              -0.2002690873e-03,0.8449199096e-05,
  286.              -0.88228987e-06,0.105787412e-06};
  287.     if(n<0) n=-n;
  288.     if(x<0.0) x=-x;
  289.     if(FloatEqual(x,0.0)) return(-1.0e+70);
  290.     if(n!=1)
  291.     { 
  292. if(x<8.0)
  293.         {
  294. y=x*x; 
  295. p=a[5]; 
  296. q=b[5];
  297. for(i=4; i>=0; i--)
  298.             {
  299. p=p*y+a[i];
  300. q=q*y+b[i];}
  301. p=p/q+0.636619772*IntegerBessel1stFunction(0,x)*log(x);
  302.         }
  303.         else
  304.         { 
  305. z=8.0/x;
  306. y=z*z;
  307.             p=e[4];
  308. q=f[4];
  309.             for(i=3; i>=0; i--)
  310.             {
  311. p=p*y+e[i];
  312. q=q*y+f[i];
  313. }
  314. s=x-0.785398164;
  315.             p=p*sin(s)+z*q*cos(s);
  316.             p=p*sqrt(0.636619772/x);
  317.         }
  318.     }
  319.     if(n==0) return(p);
  320.     b0=p;
  321.     if(x<8.0)
  322.     {
  323. y=x*x; 
  324. p=c[5];
  325. q=d[6];
  326.         for(i=4; i>=0; i--)
  327.         {
  328. p=p*y+c[i];
  329. q=q*y+d[i+1];
  330. }
  331.         q=q*y+d[0];
  332.         p=x*p/q+0.636619772*(IntegerBessel1stFunction(1,x)*log(x)-1.0/x);;
  333.     }
  334.     else
  335.     { 
  336. z=8.0/x;
  337. y=z*z;
  338.         p=g[4]; 
  339. q=h[4];
  340.         for(i=3; i>=0; i--)
  341.         {
  342. p=p*y+g[i];
  343. q=q*y+h[i];
  344. }
  345.         s=x-2.356194491;
  346.         p=p*sin(s)+z*q*cos(s);
  347.         p=p*sqrt(0.636619772/x);
  348.     }
  349.     if(n==1) return(p);
  350.     b1=p;
  351.     s=2.0/x;
  352.     for(i=1; i<n; i++)
  353.     { 
  354. p=s*i*b1-b0; 
  355. b0=b1; 
  356. b1=p;
  357. }
  358.     return(p);
  359. }
  360. //变形第一类整数阶贝塞尔函数
  361. template <class _Ty>
  362. _Ty TransformativeIntegerBessel1stFunction(int n,_Ty x)
  363. {
  364. int i,m;
  365.     _Ty t,y,p,b0,b1,q;
  366.     _Ty a[7]={ 1.0,3.5156229,3.0899424,1.2067492,
  367.                          0.2659732,0.0360768,0.0045813};
  368.     _Ty b[7]={ 0.5,0.87890594,0.51498869,
  369.               0.15084934,0.02658773,0.00301532,0.00032411};
  370.     _Ty c[9]={ 0.39894228,0.01328592,0.00225319,
  371.                         -0.00157565,0.00916281,-0.02057706,
  372.                          0.02635537,-0.01647633,0.00392377};
  373.     _Ty d[9]={ 0.39894228,-0.03988024,-0.00362018,
  374.                         0.00163801,-0.01031555,0.02282967,
  375.                         -0.02895312,0.01787654,-0.00420059};
  376.     if(n<0) n=-n;
  377.     t=Abs(x);
  378.     if(n!=1)
  379.     { 
  380. if(t<3.75)
  381.         {
  382. y=(x/3.75)*(x/3.75);
  383. p=a[6];
  384.             for(i=5; i>=0; i--) p=p*y+a[i];
  385.         }
  386.         else
  387.         { 
  388. y=3.75/t;
  389. p=c[8];
  390.             for(i=7; i>=0; i--) p=p*y+c[i];
  391.             p=p*exp(t)/sqrt(t);
  392.         }
  393.     }
  394.     if(n==0) return(p);
  395.     q=p;
  396.     if(t<3.75)
  397.     {
  398. y=(x/3.75)*(x/3.75); 
  399. p=b[6];
  400.         for(i=5; i>=0; i--) p=p*y+b[i];
  401.         p=p*t;
  402.     }
  403.     else
  404.     { 
  405. y=3.75/t;
  406. p=d[8];
  407.         for(i=7; i>=0; i--) p=p*y+d[i];
  408.         p=p*exp(t)/sqrt(t);
  409.     }
  410.     if(x<0.0) p=-p;
  411.     if(n==1) return(p);
  412.     if(FloatEqual(x,0.0)) return(0.0);
  413.     y=2.0/t;
  414. t = b0 = 0.0;
  415. b1=1.0;
  416.     m=n+(int)sqrt(40.0*n);
  417.     m=2*m;
  418.     for(i=m; i>0; i--)
  419.     { 
  420. p=b0+i*y*b1; 
  421. b0=b1;
  422. b1=p;
  423.         if(Abs(b1)>1.0e+10)
  424.         {
  425. t=t*1.0e-10; 
  426. b0=b0*1.0e-10;
  427.             b1=b1*1.0e-10;
  428.         }
  429.         if(i==n) t=b0;
  430.     }
  431.     p=t*q/b1;
  432.     if((x<0.0)&&(n%2==1)) p=-p;
  433.     return(p);
  434. }
  435. //变形第二类整数阶贝塞尔函数
  436. template <class _Ty>
  437. _Ty TransformativeIntegerBessel2ndFunction(int n, _Ty x)
  438. {
  439. int i;
  440.     _Ty y,p,b0,b1;
  441.     _Ty a[7]={ -0.57721566,0.4227842,0.23069756,
  442.            0.0348859,0.00262698,0.0001075,0.0000074};
  443.     _Ty b[7]={ 1.0,0.15443144,-0.67278579,
  444.            -0.18156897,-0.01919402,-0.00110404,-0.00004686};
  445.     _Ty c[7]={ 1.25331414,-0.07832358,0.02189568,
  446.            -0.01062446,0.00587872,-0.0025154,0.00053208};
  447.     _Ty d[7]={ 1.25331414,0.23498619,-0.0365562,
  448.            0.01504268,-0.00780353,0.00325614,-0.00068245};
  449.     if(n<0) n=-n;
  450.     if(x<0.0) x=-x;
  451.     if(FloatEqual(x,0.0)) return(1.0e+70);
  452.     if(n!=1)
  453.     { 
  454. if(x < 2.0 || FloatEqual(x, 2.0))
  455. y=x*x/4.0; p=a[6];
  456.             for(i=5; i>=0; i--) p=p*y+a[i];
  457.             p=p-TransformativeIntegerBessel1stFunction(0,x)*log(x/2.0);
  458.         }
  459.         else
  460.         { 
  461. y=2.0/x; p=c[6];
  462.             for(i=5; i>=0; i--) p=p*y+c[i];
  463.             p=p*exp(-x)/sqrt(x);
  464.         }
  465.     }
  466.     if(n==0) return(p);
  467.     b0=p;
  468.     if(x < 2.0 || FloatEqual(x, 2.0))
  469.     { 
  470. y=x*x/4.0;
  471. p=b[6];
  472.         for(i=5; i>=0; i--) p=p*y+b[i];
  473.         p=p/x+TransformativeIntegerBessel1stFunction(1,x)*log(x/2.0);
  474.     }
  475.     else
  476.     { 
  477. y=2.0/x;
  478. p=d[6];
  479.         for(i=5; i>=0; i--) p=p*y+d[i];
  480.         p=p*exp(-x)/sqrt(x);
  481.     }
  482.     if(n==1) return(p);
  483.     b1=p;
  484.     y=2.0/x;
  485.     for(i=1; i<n; i++)
  486.     { 
  487. p=b0+i*y*b1;
  488. b0=b1; 
  489. b1=p;
  490. }
  491.     return(p);
  492. }
  493. //不完全贝塔函数
  494. template <class _Ty>
  495. _Ty IncompleteBetaFunction(_Ty a, _Ty b, _Ty x)
  496. {
  497. _Ty y;
  498.     if(a<0.0 || FloatEqual(a,0.0))
  499.     { 
  500. cout << "err**a<=0!";
  501. return(-1.0);
  502. }
  503.     if(b<0.0 || FloatEqual(b,0.0))
  504.     { 
  505. cout << "err**b<=0!";
  506. return(-1.0);
  507. }
  508.     if((x<0.0)||(x>1.0))
  509.     {
  510. cout << "err**x<0 or x>1 !";
  511.         return(1.0e+70);
  512.     }
  513.     if(FloatEqual(x,0.0)||FloatEqual(x,1.0)) y=0.0;
  514.     else
  515.     { 
  516. y=a*log(x)+b*log(1.0-x);
  517.         y=exp(y);
  518.         y=y*GammaFunction(a+b)/(GammaFunction(a)*GammaFunction(b));
  519.     }
  520.     if(x<(a+1.0)/(a+b+2.0))
  521.       y=y*beta(a,b,x)/a;
  522.     else
  523.       y=1.0-y*beta(b,a,1.0-x)/b;
  524.     return(y);
  525. }
  526. //不完全贝塔函数的从属函数
  527. template <class _Ty>
  528. _Ty beta(_Ty a, _Ty b, _Ty x)
  529. {
  530.     _Ty p0(0.0), q0(1.0), p1(1.0), q1(1.0), s1;
  531.     for(int k=1; k<101; k++)
  532.     {
  533. _Ty d=(a+k)*(a+b+k)*x;
  534. d=-d/((a+k+k)*(a+k+k+1.0));
  535.         p0=p1+d*p0;
  536. q0=q1+d*q0;
  537. _Ty s0=p0/q0;
  538.         d=k*(b-k)*x;
  539.         d=d/((a+k+k-1.0)*(a+k+k));
  540.         p1=p0+d*p1;
  541. q1=q0+d*q1;
  542. s1=p1/q1;
  543.         if(Abs(s1-s0)<Abs(s1)*1.0e-07) return(s1);
  544.     }
  545.     cout << "a or b too big !";
  546.     return(s1);
  547. }
  548. //正态分布函数
  549. template <class _Ty>
  550. _Ty NormalDistributionFunction(_Ty a, _Ty d, _Ty x)
  551. {
  552. _Ty y;
  553.     
  554.     if(d<0.0 || FloatEqual(d,0.0)) d=1.0e-10;
  555.     y=0.5+0.5*ErrorFunction((x-a)/(sqrt(2.0)*d));
  556.     return(y);
  557. }
  558. //t-分布函数
  559. template <class _Ty>
  560. _Ty tDistributionFunction(_Ty t, int n)
  561. {
  562. _Ty y;
  563.     
  564.     if(t<0.0) t = -t;
  565.     y=1.0-IncompleteBetaFunction(n/2.0, 0.5, n/(n+t*t));
  566.     return(y);
  567. }
  568. //X^2-分布函数
  569. template <class _Ty>
  570. _Ty X2DistributionFunction(_Ty x, int n)
  571. {
  572. _Ty y;
  573.     
  574.     if(x<0.0) x=-x;
  575.     y=IncompleteGammaFunction(n/2.0,x/2.0);
  576.     return(y);
  577. }
  578. //F-分布函数
  579. template <class _Ty>
  580. _Ty FDistributionFunction(_Ty f, int n1, int n2)
  581. {
  582. _Ty y;
  583.     //extern double lbeta();
  584.     if(f<0.0) f=-f;
  585.     y=IncompleteBetaFunction(n2/2.0,n1/2.0,n2/(n2+n1*f));
  586.     return(y);
  587. }
  588. //正弦积分
  589. template <class _Ty>
  590. _Ty SineIntegralFunction(_Ty x)
  591. {
  592. int m(1), i, j;
  593.     _Ty aa,bb,w,xx;
  594.     _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
  595.     _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
  596. 0.4786286705,0.2369268851};
  597.     if(FloatEqual(x,0.0)) return(0.0);
  598.     _Ty h=Abs(x); 
  599. _Ty s=Abs(0.0001*h);
  600.     _Ty p(1.0e+35), ep(FLOATERROR), g(0.0);
  601.     while((ep>0.0000001 || FloatEqual(ep,0.0000001)) && (Abs(h)>s))
  602.     { 
  603. g=0.0;
  604.         for(i=1;i<=m;i++)
  605.         { 
  606. aa=(i-1.0)*h; 
  607. bb=i*h;
  608.             w=0.0;
  609.             for(j=0;j<5;j++)
  610.             {
  611. xx=((bb-aa)*t[j]+(bb+aa))/2.0;
  612.                 w=w+sin(xx)/xx*c[j];
  613.             }
  614.             g=g+w;
  615.         }
  616.         g=g*h/2.0;
  617.         ep=Abs(g-p)/(1.0+Abs(g));
  618.         p=g;
  619. m=m+1;
  620. h=Abs(x)/m;
  621.     }
  622.     return(g);
  623. }
  624. //余弦积分
  625. template <class _Ty>
  626. _Ty CosineIntegralFunction(_Ty x)
  627. {
  628. int m(1), i, j;
  629.     _Ty ep(FLOATERROR),aa,bb,w,xx,g(0.0);
  630.     _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
  631.     _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
  632. 0.4786286705,0.2369268851};
  633.     
  634.     if(FloatEqual(x,0.0)) x = 1.0e-35;
  635.     if(x<0.0) x = -x;
  636.     _Ty r = 0.57721566490153286060651;
  637.     _Ty q = r + log(x);
  638.     _Ty h = x; 
  639. _Ty s = Abs(0.0001*h);
  640.     _Ty p=1.0e+35;
  641.     while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
  642.     { 
  643. g=0.0;
  644.         for(i=1;i<=m;i++)
  645.         { 
  646. aa=(i-1.0)*h; 
  647. bb=i*h;
  648.             w=0.0;
  649.             for(j=0;j<5;j++)
  650.             {
  651. xx=((bb-aa)*t[j]+(bb+aa))/2.0;
  652.                 w=w+(1.0-cos(xx))/xx*c[j];
  653.             }
  654.             g=g+w;
  655.         }
  656.         g=g*h/2.0;
  657.         ep=Abs(g-p)/(1.0+Abs(g));
  658.         p=g; m=m+1; h=x/m;
  659.     }
  660.     g=q-g;
  661.     return(g);
  662. }
  663. //指数积分
  664. template <class _Ty>
  665. _Ty ExponentIntegralFunction(_Ty x)
  666. {
  667. int m(1), i, j;
  668.     _Ty ep(FLOATERROR),aa,bb,w,xx,g(0.0);
  669.     _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
  670.     _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
  671. 0.4786286705,0.2369268851};
  672.     
  673.     if(FloatEqual(x,0.0)) x=1.0e-10;
  674.     if(x<0.0) x=-x;
  675.     _Ty r=0.57721566490153286060651;
  676.     _Ty q=r+log(x);
  677.     _Ty h=x;
  678. _Ty s=Abs(0.0001*h);
  679.     _Ty p=1.0e+35;
  680.     while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
  681.     { 
  682. g=0.0;
  683.         for(i=1;i<=m;i++)
  684.         {
  685. aa=(i-1.0)*h; bb=i*h;
  686.             w=0.0;
  687.             for(j=0;j<5;j++)
  688.             { 
  689. xx=((bb-aa)*t[j]+(bb+aa))/2.0;
  690.                 w=w+(exp(-xx)-1.0)/xx*c[j];
  691.             }
  692.             g=g+w;
  693.         }
  694.         g=g*h/2.0;
  695.         ep=Abs(g-p)/(1.0+Abs(g));
  696.         p=g; m=m+1; h=x/m;
  697.     }
  698.     g=q+g;
  699.     return(g);
  700. }
  701. //第一类椭圆积分
  702. template <class _Ty>
  703. _Ty Ellipse1stIntegral(_Ty k, _Ty f)
  704. {
  705. int n(0);
  706.     _Ty pi(3.1415926), e(1.0), ff;
  707.     //_Ty fk();
  708.     if(k<0.0) k=-k;
  709.     if(k>1.0) k=1.0/k;
  710.     _Ty y = Abs(f);
  711.     
  712.     while(y>pi||FloatEqual(y,pi))
  713.     {
  714. n=n+1;
  715. y=y-pi;
  716. }
  717.     
  718.     if(y>pi/2.0||FloatEqual(y,pi/2.0))
  719.     {
  720. n=n+1;
  721. e=-e; 
  722. y=pi-y;
  723. }
  724.     if(n==0)
  725. ff=fk(k,y);
  726.     else
  727.     { 
  728. ff=fk(k,pi/2.0);
  729.         ff=2.0*n*ff+e*fk(k,y);
  730.     }
  731.     if(f<0.0) ff=-ff;
  732.     return(ff);
  733. }
  734. //第一类椭圆积分辅助函数
  735. template <class _Ty>
  736. _Ty fk(_Ty k, _Ty f)
  737. int m(1), i, j;
  738.     _Ty p(1.0e+35),ep(FLOATERROR),aa,bb,w,xx,g(0.0),q;
  739.     _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
  740.     _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
  741. 0.4786286705,0.2369268851};
  742.     
  743.     _Ty h=Abs(f); 
  744. _Ty s=Abs(0.0001*h);
  745.     //p=1.0e+35; ep=0.000001;
  746.     while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
  747.     { 
  748. g=0.0;
  749.         for(i=1;i<=m;i++)
  750.         {
  751. aa=(i-1.0)*h; 
  752. bb=i*h;
  753.             w=0.0;
  754.             for(j=0;j<5;j++)
  755.             { 
  756. xx=((bb-aa)*t[j]+(bb+aa))/2.0;
  757.                 q=sqrt(1.0-k*k*sin(xx)*sin(xx));
  758.                 w=w+c[j]/q;
  759.             }
  760.             g=g+w;
  761.         }
  762.         g=g*h/2.0;
  763.         ep=Abs(g-p)/(1.0+Abs(g));
  764.         p=g; 
  765. m=m+m; 
  766. h=0.5*h;
  767.     }
  768.     return(g);
  769. }
  770. //第二类椭圆积分
  771. template <class _Ty>
  772. _Ty Ellipse2ndIntegral(_Ty k, _Ty f)
  773. {
  774. int n(0);
  775.     _Ty pi(3.1415926), e(1.0), ff;
  776.     //_Ty ek();
  777.     if(k<0.0) k=-k;
  778.     if(k>1.0) k=1.0/k;
  779.     _Ty y = Abs(f);
  780.     
  781.     while(y>pi||FloatEqual(y,pi))
  782.     {
  783. n=n+1; 
  784. y=y-pi;
  785. }
  786.     
  787.     if(y>pi/2.0||FloatEqual(y,pi/2.0))
  788.     {
  789. n=n+1;
  790. e=-e; 
  791. y=pi-y;
  792. }
  793.     if(n==0)
  794. ff=ek(k,y);
  795.     else
  796.     { 
  797. ff=ek(k,pi/2.0);
  798.         ff=2.0*n*ff+e*ek(k,y);
  799.     }
  800.     if(f<0.0) ff=-ff;
  801.     return(ff);
  802. }
  803. //第二类椭圆积分辅助函数
  804. template <class _Ty>
  805. _Ty ek(_Ty k, _Ty f)
  806. { int m(1), i, j;
  807.     _Ty p(1.0e+35),ep(FLOATERROR),aa,bb,w,xx,g(0.0),q;
  808.     _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
  809.     _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
  810. 0.4786286705,0.2369268851};
  811.     
  812.     _Ty h=Abs(f);
  813. _Ty s=Abs(0.0001*h);
  814.     
  815.     while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
  816.     { 
  817. g=0.0;
  818.         for(i=1;i<=m;i++)
  819. {
  820. aa=(i-1.0)*h;
  821. bb=i*h;
  822.             w=0.0;
  823.             for(j=0;j<5;j++)
  824.             { 
  825. xx=((bb-aa)*t[j]+(bb+aa))/2.0;
  826.                 q=sqrt(1.0-k*k*sin(xx)*sin(xx));
  827.                 w=w+q*c[j];
  828.             }
  829.             g=g+w;
  830.         }
  831.         g=g*h/2.0;
  832.         ep=Abs(g-p)/(1.0+Abs(g));
  833.         p=g; 
  834. m=m+m; 
  835. h=0.5*h;
  836.     }
  837.     return(g);
  838. }
  839. #endif // _SPECIALFUNCTION_INL