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; }
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; }
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; }
//--------------------------------------------------------------------------- //用于生成高斯点序列 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; }