?? besjan.cpp
字號:
double t(double y)
{
double aaa,bbb,z,p,temp;
if (y <= 10.0)
{
aaa = 0.000057941 * y - 0.00176148 * y + 0.0208645;
bbb = 1;
temp = ((aaa * y - 0.129013) * y + 0.85777) * y + 1.0125;
}
else
{
z = log(y) - 0.775;
p = (0.775 - log(z)) / (1.0 + z);
temp = y / (p + 1.0) / z;
}
return temp;
}
void jap(double &x, double &a, double &nmax, double f[])
{
int n,m;
double fa[10], rr[10],mmax,e,eps,sum,d1,r,s,nu,al,li,am;
mmax = 10;
e = 4;
eps = 0.5 * pow(10 , (-e));
for (n = 0;n<=nmax;n++)
{
fa[n] = 0.0;
}
sum = exp(gammln(1.0 + a));
sum = exp(a * log(x / 2.0)) / sum;
d1 = 2.3026 * e + 1.3863;
if( nmax > 0 )
{
r = t(0.5 * d1 / nmax) * nmax;
}
else
{
r = 0.0;
}
s = t(0.73576 * d1 / x) * 1.3591 * x;
if (r <= s)
{
nu = 1 + int(s);
}
else
{
nu = 1 + int(r);
}
yi: m = 0;
al = 1.0;
li = int(nu / 2);
er: m = m + 1;
al = al * (m + a) / (m + 1);
if (m < li)
goto er;
n = 2 * m;
r = 0.0;
s = 0.0;
san: r = 1.0 / (2.0 * (a + n) / x - r);
if (int(n / 2) != n / 2.0)
{
am = 0.0;
}
else
{
al = al * (n + 2) / (n + 2.0 * a);
am = al * (n + a);
}
s = r * (am + s);
if (n <= nmax)
rr[n - 1] = r;
n = n - 1;
if (n >= 1)
goto san;
f[0] = sum / (1.0 + s);
for (n = 0;n<=nmax - 1;n++)
f[n + 1] = rr[n] * f[n];
for (n = 0 ;n<=nmax;n++)
{
if (fabs((f[n] - fa[n]) / f[n]) > eps)
{
for( m = 0;m<=nmax;m++)
fa[m] = f[m];
nu = nu + 5;
goto yi;
}
}
}
void besjan(double x,double a,double nm, double ih,double f[])
{
int i;
double temp;
temp=1;
if (ih == 1)
{
jap(x, a, nm, f);
_c_exit();
}
else
{
jap(x, a, temp, f);
f[1] = 2.0 * a * f[0] / x - f[1];
for (i = 1;i<=nm;i++)
f[i + 1] = 2.0 * (a - i) * f[i] / x - f[i - 1];
_c_exit();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -