예제 #1
0
파일: TTables.c 프로젝트: xomachine/gabedit
static gdouble X1(gint n,gint l1,gint l2,gdouble A, gdouble B,gdouble g)
{
	gint i,r,l;
	gint imin,imax;
	gdouble X=0.0;
	gdouble fourg=4*g;

	l=l1+l2;
	imin=n;
	if(n%2 == 0)
	{
	 	if( l%2==0) imax = l;
	 	else imax = l-1;
	}
	else
	{
	 	if( l%2==0) imax = l-1;
	 	else imax = l;
	}
	for(i=imin;i<=imax;i+=2)
	{
	r = (i-n)/2;
/*	printf("n=%d i=%d r=%d \n",n,i,r);*/
/*	printf("CI2J=%f f=%f \n",binomial2(i,r),f(i,l1,l2,A,B));*/
	X+=binomial2(i,r)/dpn(fourg,i-r)*f(i,l1,l2,A,B);
	}
/*		printf("g=%f X=%f\n",g,X);*/
	return X;

}
예제 #2
0
파일: TTables.c 프로젝트: xomachine/gabedit
static gdouble X2(gint n,gint l1,gint l2,gdouble A, gdouble B,gdouble g)
{
	gint i,r,l;
	gint imin,imax;
	gdouble X=0.0;
	gdouble fourg=4*g;

	l=l1+l2;
	imin=n;
	if(n%2 == 0)
	{
	 	if( l%2==0) imax = l;
	 	else imax = l-1;
	}
	else
	{
	 	if( l%2==0) imax = l-1;
	 	else imax = l;
	}
	for(i=imin;i<=imax;i+=2)
	{
		r = (i-n)/2;
		X+=m1p(i)*binomial2(i,r)/dpn(fourg,i-r)*f(i,l1,l2,A,B);
	}
	return X;
	
}
예제 #3
0
파일: TTables.c 프로젝트: xomachine/gabedit
static gdouble f(gint i,gint l,gint m,gdouble A,gdouble B)
{
	gint j,jmin,jmax;
	gdouble sum=0.0;

	jmin = 0;
	if(jmin<i-m) jmin =i-m;
	jmax = i;
	if(jmax>l) jmax = l;
	for( j=jmin;j<=jmax;j++)
	{
		sum += binomial(l,j)*binomial(m,i-j)*
		dpn(-A,l-j)*dpn(-B,m-i+j);

	}
	return sum; 
}
예제 #4
0
//---------------------------------------------------------------------------
//用于生成高斯点序列
int Gauss::Generate_gauss_array(vector<double> &gauss, vector<double> &weight)const
{
	//开始计算
	int n = precision;
	int iter = 10;   //迭代次数
	int m=int((n+1)/2); 
	int e1=n*(n+1);
	int mm=4*m-1;
	vector<long double> t;
	for(int i=3; i<=mm; i=i+4)
	{
		t.push_back((PI/(4*n+2))*i);
	}
	int nn=(1-(1-1/n)/(8*n*n));
	vector<long double> xo;
	for(int i=0; i<m; i++)
	{
		xo.push_back(nn*cos(t[i]));
	}
	vector<long double> pk;
	vector<long double> den(m);
	vector<long double> d1(m);
	vector<long double> dpn(m);
	vector<long double> d2pn(m);
	vector<long double> d3pn(m);
	vector<long double> d4pn(m);
	vector<long double> u(m);
	vector<long double> v(m);
	vector<long double> h(m);
	vector<long double> p(m);
	vector<long double> dp(m);

	for(int j=1; j<=iter; j++)
	{
		vector<long double> pkm1(m, 1.0);
		pk=xo;
		for(int k=2; k<=n; k++)
		{
			vector<long double> t1(m);
			vector<long double> pkp1(m);
			for(int i=0; i<m; i++)
			{
				t1[i]=xo[i]*pk[i];
				pkp1[i]=t1[i]-pkm1[i]-(t1[i]-pkm1[i])/k+t1[i];
			}
			pkm1=pk;
			pk=pkp1;
		}
		for(int i=0; i<m; i++)
		{
			den[i]=1.0-xo[i]*xo[i];
			d1[i]=n*(pkm1[i]-xo[i]*pk[i]);
			dpn[i]=d1[i]/den[i];
			d2pn[i]=(2.0*xo[i]*dpn[i]-e1*pk[i])/den[i];
			d3pn[i]=(4*xo[i]*d2pn[i]+(2-e1)*dpn[i])/den[i];
			d4pn[i]=(6*xo[i]*d3pn[i]+(6-e1)*d2pn[i])/den[i];
			u[i]=pk[i]/dpn[i]; 
			v[i]=d2pn[i]/dpn[i];
			h[i]=-u[i]*(1+(0.5*u[i])*(v[i]+u[i]*(v[i]*v[i]-u[i]*d3pn[i]/(3*dpn[i]))));
			p[i]=pk[i]+h[i]*(dpn[i]+(0.5*h[i])*(d2pn[i]+(h[i]/3)*(d3pn[i]+0.25*h[i]*d4pn[i])));
			dp[i]=dpn[i]+h[i]*(d2pn[i]+(0.5*h[i])*(d3pn[i]+h[i]*d4pn[i]/3));
			h[i]=h[i]-p[i]/dp[i]; 
			xo[i]=xo[i]+h[i];
		}
	}
	vector<long double> bp(m);
	vector<long double> fx(m);
	vector<long double> wf(m);
	for(int i=0; i<m; i++)
	{
		bp[i]=-xo[i]-h[i];
		fx[i]=d1[i]-h[i]*e1*(pk[i]+(h[i]/2)*(dpn[i]+(h[i]/3)*(d2pn[i]+(h[i]/4)*(d3pn[i]+(0.2*h[i])*d4pn[i]))));
		wf[i]=2*(1-bp[i]*bp[i])/(fx[i]*fx[i]);
	}

	if((m+m)>n) bp[m-1]=0;
	if((m+m) != n) m=m-1;
	for(int i=m-1; i>=0; i--)
	{
		bp.push_back(-bp[i]);
		wf.push_back(wf[i]);
	}
 	for(int i=0; i<n; i++)
	{
		gauss.push_back(bp[i]);
		weight.push_back(wf[i]);
	}

	//cout << "bp=" << endl;
	//for(int i=0; i<n; i++)
	//{
	//	cout << setprecision(20) << bp[i] << endl;
	//}
	//cout << "wf=" << endl;
	//long double sum=0.0;
	//for(int i=0; i<n; i++)
	//{
	//	sum += wf[i];
	//	cout << setprecision(20) << wf[i] << endl;
	//}
	//cout << setprecision(20) << "sum=" << sum << endl;

	return 1;
}