Пример #1
0
int main(void)
{
	double gam1,gam2,gampl,gammi,x,xgam1,xgam2,xgampl,xgammi;

	for (;;) {
		printf("Enter x:\n");
		if (scanf("%lf",&x) == EOF) break;
		beschb(x,&xgam1,&xgam2,&xgampl,&xgammi);
		printf("%5s\n%17s %16s %17s %15s\n%17s %16s %17s %15s\n",
			"x","gam1","gam2","gampl","gammi","xgam1","xgam2","xgampl","xgammi");
		gampl=1/exp(gammln((float)(1+x)));
		gammi=1/exp(gammln((float)(1-x)));
		gam1=(gammi-gampl)/(2*x);
		gam2=(gammi+gampl)/2;
		printf("%5.2f\n\t%16.6e %16.6e %16.6e %16.6e\n",x,gam1,gam2,gampl,gammi);
		printf("\t%16.6e %16.6e %16.6e %16.6e\n",xgam1,xgam2,xgampl,xgammi);
	}
	return 0;
}
Пример #2
0
	void bessjy(double x, double xnu, double *rj, double *ry, double *rjp, double *ryp)
	{
		int i, isign, l, nl;
		double a, b, br, bi, c, cr, ci, d, del, del1, den, di, dlr, dli, dr, e, f, fact, fact2,
			fact3, ff, gam, gam1, gam2, gammi, gampl, h, p, pimu, pimu2, q, r, rjl,
			rjl1, rjmu, rjp1, rjpl, rjtemp, ry1, rymu, rymup, rytemp, sum, sum1,
			temp, w, x2, xi, xi2, xmu, xmu2;

		if (x <= 0.0 || xnu < 0.0)
			throw;
		nl = (x < XMIN ? (int)(xnu + 0.5) : tmax(0, (int)(xnu - x + 1.5)));
		xmu = xnu - nl;
		xmu2 = xmu * xmu;
		xi = 1.0 / x;
		xi2 = 2.0 * xi;
		w = xi2 / PI;
		isign = 1;
		h = xnu * xi;
		if (h < FPMIN)
			h = FPMIN;
		b = xi2 * xnu;
		d = 0.0;
		c = h;
		for (i = 1; i <= MAXIT; i++)
		{
			b += xi2;
			d = b - d;
			if (fabs(d) < FPMIN)
				d = FPMIN;
			c = b - 1.0 / c;
			if (fabs(c) < FPMIN)
				c = FPMIN;
			d = 1.0 / d;
			del = c * d;
			h = del * h;
			if (d < 0.0)
				isign = -isign;
			if (fabs(del - 1.0) < EPS)
				break;
		}
		if (i > MAXIT)
			throw;
		rjl = isign * FPMIN;
		rjpl = h * rjl;
		rjl1 = rjl;
		rjp1 = rjpl;
		fact = xnu * xi;
		for (l = nl; l >= 1; l--)
		{
			rjtemp = fact * rjl + rjpl;
			fact -= xi;
			rjpl = fact * rjtemp - rjl;
			rjl = rjtemp;
		}
		if (rjl == 0.0)
			rjl = EPS;
		f = rjpl / rjl;
		if (x < XMIN)
		{
			x2 = 0.5 * x;
			pimu = PI * xmu;
			fact = (fabs(pimu) < EPS ? 1.0 : pimu / sin(pimu));
			d = -log(x2);
			e = xmu * d;
			fact2 = (fabs(e) < EPS ? 1.0 : sinh(e) / e);
			beschb(xmu, &gam1, &gam2, &gampl, &gammi);
			ff = 2.0 / PI * fact * (gam1 * cosh(e) + gam2 * fact2 * d);
			e = exp(e);
			p = e / (gampl * PI);
			q = 1.0 / (e * PI * gammi);
			pimu2 = 0.5 * pimu;
			fact3 = (fabs(pimu2) < EPS ? 1.0 : sin(pimu2) / pimu2);
			r = PI * pimu2 * fact3 * fact3;
			c = 1.0;
			d = -x2 * x2;
			sum = ff + r * q;
			sum1 = p;
			for (i = 1; i <= MAXIT; i++)
			{
				ff = (i * ff + p + q) / (i * i - xmu2);
				c *= (d / i);
				p /= (i - xmu);
				q /= (i + xmu);
				del = c * (ff + r * q);
				sum += del;
				del1 = c * p - i * del;
				sum1 += del1;
				if (fabs(del) < (1.0 + fabs(sum))*EPS)
					break;
			}
			if (i > MAXIT)
				throw;
			rymu = -sum;
			ry1 = -sum1 * xi2;
			rymup = xmu * xi * rymu - ry1;
			rjmu = w / (rymup - f * rymu);
		}
		else
		{
			a = 0.25 - xmu2;
			p = -0.5 * xi;
			q = 1.0;
			br = 2.0 * x;
			bi = 2.0;
			fact = a * xi / (p * p + q * q);
			cr = br + q * fact;
			ci = bi + p * fact;
			den = br * br + bi * bi;
			dr = br / den;
			di = -bi / den;
			dlr = cr * dr - ci * di;
			dli = cr * di + ci * dr;
			temp = p * dlr - q * dli;
			q = p * dli + q * dlr;
			p = temp;
			for (i = 2; i <= MAXIT; i++)
			{
				a += 2 * (i - 1);
				bi += 2.0;
				dr = a * dr + br;
				di = a * di + bi;
				if (fabs(dr) + fabs(di) < FPMIN)
					dr = FPMIN;
				fact = a / (cr * cr + ci * ci);
				cr = br + cr * fact;
				ci = bi - ci * fact;
				if (fabs(cr) + fabs(ci) < FPMIN)
					cr = FPMIN;
				den = dr * dr + di * di;
				dr /= den;
				di /= -den;
				dlr = cr * dr - ci * di;
				dli = cr * di + ci * dr;
				temp = p * dlr - q * dli;
				q = p * dli + q * dlr;
				p = temp;
				if (fabs(dlr - 1.0) + fabs(dli) < EPS)
					break;
			}
			if (i > MAXIT)
				throw;
			gam = (p - f) / q;
			rjmu = sqrt(w / ((p - f) * gam + q));
			rjmu = NRSIGN(rjmu, rjl);
			rymu = rjmu * gam;
			rymup = rymu * (p + q / gam);
			ry1 = xmu * xi * rymu - rymup;
		}
		fact = rjmu / rjl;
		*rj = rjl1 * fact;
		*rjp = rjp1 * fact;
		for (i = 1; i <= nl; i++)
		{
			rytemp = (xmu + i) * xi2 * ry1 - rymu;
			rymu = ry1;
			ry1 = rytemp;
		}
		*ry = rymu;
		*ryp = xnu * xi * rymu - ry1;
	}
Пример #3
0
void bessik(float x, float xnu, float *ri, float *rk, float *rip, float *rkp)
{
	void beschb(double x, double *gam1, double *gam2, double *gampl,
		double *gammi);
	void nrerror(char error_text[]);
	int i,l,nl;
	double a,a1,b,c,d,del,del1,delh,dels,e,f,fact,fact2,ff,gam1,gam2,
		gammi,gampl,h,p,pimu,q,q1,q2,qnew,ril,ril1,rimu,rip1,ripl,
		ritemp,rk1,rkmu,rkmup,rktemp,s,sum,sum1,x2,xi,xi2,xmu,xmu2;

	if (x <= 0.0 || xnu < 0.0) nrerror("bad arguments in bessik");
	nl=(int)(xnu+0.5);
	xmu=xnu-nl;
	xmu2=xmu*xmu;
	xi=1.0/x;
	xi2=2.0*xi;
	h=xnu*xi;
	if (h < FPMIN) h=FPMIN;
	b=xi2*xnu;
	d=0.0;
	c=h;
	for (i=1;i<=MAXIT;i++) {
		b += xi2;
		d=1.0/(b+d);
		c=b+1.0/c;
		del=c*d;
		h=del*h;
		if (fabs(del-1.0) < EPS) break;
	}
	if (i > MAXIT) nrerror("x too large in bessik; try asymptotic expansion");
	ril=FPMIN;
	ripl=h*ril;
	ril1=ril;
	rip1=ripl;
	fact=xnu*xi;
	for (l=nl;l>=1;l--) {
		ritemp=fact*ril+ripl;
		fact -= xi;
		ripl=fact*ritemp+ril;
		ril=ritemp;
	}
	f=ripl/ril;
	if (x < XMIN) {
		x2=0.5*x;
		pimu=PI*xmu;
		fact = (fabs(pimu) < EPS ? 1.0 : pimu/sin(pimu));
		d = -log(x2);
		e=xmu*d;
		fact2 = (fabs(e) < EPS ? 1.0 : sinh(e)/e);
		beschb(xmu,&gam1,&gam2,&gampl,&gammi);
		ff=fact*(gam1*cosh(e)+gam2*fact2*d);
		sum=ff;
		e=exp(e);
		p=0.5*e/gampl;
		q=0.5/(e*gammi);
		c=1.0;
		d=x2*x2;
		sum1=p;
		for (i=1;i<=MAXIT;i++) {
			ff=(i*ff+p+q)/(i*i-xmu2);
			c *= (d/i);
			p /= (i-xmu);
			q /= (i+xmu);
			del=c*ff;
			sum += del;
			del1=c*(p-i*ff);
			sum1 += del1;
			if (fabs(del) < fabs(sum)*EPS) break;
		}
		if (i > MAXIT) nrerror("bessk series failed to converge");
		rkmu=sum;
		rk1=sum1*xi2;
	} else {
		b=2.0*(1.0+x);
		d=1.0/b;
		h=delh=d;
		q1=0.0;
		q2=1.0;
		a1=0.25-xmu2;
		q=c=a1;
		a = -a1;
		s=1.0+q*delh;
		for (i=2;i<=MAXIT;i++) {
			a -= 2*(i-1);
			c = -a*c/i;
			qnew=(q1-b*q2)/a;
			q1=q2;
			q2=qnew;
			q += c*qnew;
			b += 2.0;
			d=1.0/(b+a*d);
			delh=(b*d-1.0)*delh;
			h += delh;
			dels=q*delh;
			s += dels;
			if (fabs(dels/s) < EPS) break;
		}
		if (i > MAXIT) nrerror("bessik: failure to converge in cf2");
		h=a1*h;
		rkmu=sqrt(PI/(2.0*x))*exp(-x)/s;
		rk1=rkmu*(xmu+x+0.5-h)*xi;
	}
	rkmup=xmu*xi*rkmu-rk1;
	rimu=xi/(f*rkmu-rkmup);
	*ri=(rimu*ril1)/ril;
	*rip=(rimu*rip1)/ril;
	for (i=1;i<=nl;i++) {
		rktemp=(xmu+i)*xi2*rk1+rkmu;
		rkmu=rk1;
		rk1=rktemp;
	}
	*rk=rkmu;
	*rkp=xnu*xi*rkmu-rk1;
}