AuZex.cin

From TORI
Jump to navigation Jump to search

// AuZex.cin is numerical implementation in C++ of function AuZex, with is inverse function of SuZex and the Abel function of function LambertW; the AuZex approximations are used in the algorithm.

// #include "tania.cin"
// #include "SuZex.cin"
// z_type zex(z_type z) { return z*exp(z) ; }
// LambertW is suppozed to be included separately
z_type AuZexAsy(z_type z){ int m=15,n; z_type s;
DB AuZexAsyCo[66]={
//     1.1259817765745026,
       1.1259817765744977,
-0.16666666666666667,0.0625,-0.035185185185185185,   0.020833333333333333,-0.0097619047619047619,
  0.00035686728395061728,0.0057788485764676241,    -0.0054935515873015873,-0.0025850528358244408,
  0.012198640046296296,-0.0064941110501851844,    -0.026451479667987191,0.047851552440450232,
  0.053758729874794383,-0.27073626193208126,    -0.0065521186641040204,1.6278812626136699,
  -1.6076876900940989,-10.838187174665133,    24.785092910583443,78.1860907900493,
  -340.82033939567854,-562.09669036948494,    4908.2972195975399,2830.3348202280227,
  -77032.682625139301,31753.861334668919,    1.3308075281671887e6,-1.9538825394585991e6,
  -2.5276072666444939e7,6.8487621133842322e7,    5.2387590408716527e8,-2.2452803031477711e9,
  -1.1695088667110365e10,7.5450114071773863e10,    2.7518770516521089e11,-2.679843770347832e12,
  -6.5513897892809159e12,1.0183199942874624e14,    1.4245100909222102e14,-4.1590749536758109e15,
  -1.7035860994968719e15,1.8277639374581802e17,    -1.0679787375232343e17,-8.6360007004109277e18,
  1.4065535508735497e19,4.3787928905903592e20,    -1.2109904910255305e21,-2.3763215966256672e22,
  9.6017875634223775e22,1.3758361324208134e24,    -7.5814699303356225e24,-8.4659910118430712e25,
  6.1398187270988087e26,5.5112074423601013e27,    -5.1693736994996277e28,-3.773953811181416e29,
  4.5556026027743353e30,2.6980978199281418e31,    -4.2167875664888744e32,-1.9922345654966198e33,
  4.1064414540582216e34,1.4932212480440397e35,    -4.2098201366546206e36 };
 s=AuZexAsyCo[m]*z;   for(n=m-1;n>0;n--){s+=AuZexAsyCo[n]; s*=z;}
 return s + AuZexAsyCo[0] + .5*log(z)-1./z;}
z_type AuZex01(z_type z){ int n, m=39; 
 double AuZexCo[46]={0,
  1.4011764331478447,-1.2313176379841106,   1.1612567820116564,-1.123126930577658,
  1.0992876544297898,-1.0830479804216504,   1.0713113178859344,-1.0624516150969114,
  1.0555359459048546,-1.049992436340172,    1.0454519353364795,-1.0416660012642422,
  1.0384615628127265,-1.035714498198056,    1.0333335508961627,-1.0312501692201073,
  1.0294118808316126,-1.0277778512023086,   1.0263158327950879,-1.0250000237496548,
  1.0238095356162695,-1.0227272776768976,   1.0217391317101858,-1.0208333328204302,
  1.019999998732505,-1.019230767751615,     1.0185185170386828,-1.01785714143099,
  1.0172413778515972,-1.0166666648687321,   1.016131566418359,-1.015697093269014,
  1.0152, -1.0148, 1.0141, -1.014, 1.013, -1.012, 1.011,-1.010, 1.008, -1.006, 1.004, -1.002, 1. };
z_type s=AuZexCo[m];
for(n=m-1;n>0;n--) {s+= AuZexCo[n]; s*=z; }  return s;  }

z_type auzex(z_type z){ int n; 
 for(n=0;n<80;n++){ 
if(abs(z-1.)<.4) return AuZex01(z-1.)+(0.+n); 
if(abs(z)<.1) return AuZexAsy(z)+(0.+n);; 
z=LambertW(z); }
printf("z= %10.5f %10.5f n=%2d what to do?\n",Re(z), Im(z), n); getchar(); 
return 0.;}

//Copyleft 2012 by Dmitrii Kouznetsov // // // // // //