⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 specialfunction.inl

📁 vc++实现线性方程组求解 1全选主元高斯消元法 2全选主元高斯-约当消元法 3三对角方程组的追赶法 4一般带型方程组求解 5对称方程组的分解法 6对称正定方程组的平方根法
💻 INL
📖 第 1 页 / 共 2 页
字号:
			t=t*1.0e-10; 
			b0=b0*1.0e-10;
            b1=b1*1.0e-10;
        }
        if(i==n) t=b0;
    }
    p=t*q/b1;
    if((x<0.0)&&(n%2==1)) p=-p;
    return(p);
}

//变形第二类整数阶贝塞尔函数
template <class _Ty>
_Ty TransformativeIntegerBessel2ndFunction(int n, _Ty x)
{
	int i;
    _Ty y,p,b0,b1;

    _Ty a[7]={ -0.57721566,0.4227842,0.23069756,
           0.0348859,0.00262698,0.0001075,0.0000074};
    _Ty b[7]={ 1.0,0.15443144,-0.67278579,
           -0.18156897,-0.01919402,-0.00110404,-0.00004686};
    _Ty c[7]={ 1.25331414,-0.07832358,0.02189568,
           -0.01062446,0.00587872,-0.0025154,0.00053208};
    _Ty d[7]={ 1.25331414,0.23498619,-0.0365562,
           0.01504268,-0.00780353,0.00325614,-0.00068245};
    if(n<0) n=-n;
    if(x<0.0) x=-x;
    if(FloatEqual(x,0.0)) return(1.0e+70);
    if(n!=1)
    { 
		if(x < 2.0 || FloatEqual(x, 2.0))
		{ 
			y=x*x/4.0; p=a[6];
            for(i=5; i>=0; i--) p=p*y+a[i];
            p=p-TransformativeIntegerBessel1stFunction(0,x)*log(x/2.0);
        }
        else
        { 
			y=2.0/x; p=c[6];
            for(i=5; i>=0; i--) p=p*y+c[i];
            p=p*exp(-x)/sqrt(x);
        }
    }
    if(n==0) return(p);
    b0=p;
    if(x < 2.0 || FloatEqual(x, 2.0))
    { 
		y=x*x/4.0;
		p=b[6];
        for(i=5; i>=0; i--) p=p*y+b[i];
        p=p/x+TransformativeIntegerBessel1stFunction(1,x)*log(x/2.0);
    }
    else
    { 
		y=2.0/x;
		p=d[6];
        for(i=5; i>=0; i--) p=p*y+d[i];
        p=p*exp(-x)/sqrt(x);
    }
    if(n==1) return(p);
    b1=p;
    y=2.0/x;
    for(i=1; i<n; i++)
    { 
		p=b0+i*y*b1;
		b0=b1; 
		b1=p;
	}
    return(p);
}

//不完全贝塔函数
template <class _Ty>
_Ty IncompleteBetaFunction(_Ty a, _Ty b, _Ty x)
{
	_Ty y;

    if(a<0.0 || FloatEqual(a,0.0))
    { 
		cout << "err**a<=0!";
		return(-1.0);
	}
    if(b<0.0 || FloatEqual(b,0.0))
    { 
		cout << "err**b<=0!";
		return(-1.0);
	}
    if((x<0.0)||(x>1.0))
    {
		cout << "err**x<0 or x>1 !";
        return(1.0e+70);
    }
    if(FloatEqual(x,0.0)||FloatEqual(x,1.0)) y=0.0;
    else
    { 
		y=a*log(x)+b*log(1.0-x);
        y=exp(y);
        y=y*GammaFunction(a+b)/(GammaFunction(a)*GammaFunction(b));
    }
    if(x<(a+1.0)/(a+b+2.0))
      y=y*beta(a,b,x)/a;
    else
      y=1.0-y*beta(b,a,1.0-x)/b;
    return(y);
}

//不完全贝塔函数的从属函数
template <class _Ty>
_Ty beta(_Ty a, _Ty b, _Ty x)
{
    _Ty p0(0.0), q0(1.0), p1(1.0), q1(1.0), s1;

    for(int k=1; k<101; k++)
    {
		_Ty d=(a+k)*(a+b+k)*x;
		d=-d/((a+k+k)*(a+k+k+1.0));
        p0=p1+d*p0;
		q0=q1+d*q0;
		_Ty s0=p0/q0;
        d=k*(b-k)*x;
        d=d/((a+k+k-1.0)*(a+k+k));
        p1=p0+d*p1;
		q1=q0+d*q1;
		s1=p1/q1;
        if(Abs(s1-s0)<Abs(s1)*1.0e-07)	return(s1);
    }
    cout << "a or b too big !";
    return(s1);
}

//正态分布函数
template <class _Ty>
_Ty NormalDistributionFunction(_Ty a, _Ty d, _Ty x)
{
	_Ty y;
    
    if(d<0.0 || FloatEqual(d,0.0)) d=1.0e-10;
    y=0.5+0.5*ErrorFunction((x-a)/(sqrt(2.0)*d));
    return(y);
}

//t-分布函数
template <class _Ty>
_Ty tDistributionFunction(_Ty t, int n)
{
	_Ty y;
    
    if(t<0.0) t = -t;
    y=1.0-IncompleteBetaFunction(n/2.0, 0.5, n/(n+t*t));
    return(y);
}

//X^2-分布函数
template <class _Ty>
_Ty X2DistributionFunction(_Ty x, int n)
{
	_Ty y;
    
    if(x<0.0) x=-x;
    y=IncompleteGammaFunction(n/2.0,x/2.0);
    return(y);
}

//F-分布函数
template <class _Ty>
_Ty FDistributionFunction(_Ty f, int n1, int n2)
{
	_Ty y;
    //extern double lbeta();
    if(f<0.0) f=-f;
    y=IncompleteBetaFunction(n2/2.0,n1/2.0,n2/(n2+n1*f));
    return(y);
}

//正弦积分
template <class _Ty>
_Ty SineIntegralFunction(_Ty x)
{
	int m(1), i, j;
    _Ty aa,bb,w,xx;
    _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
											0.4786286705,0.2369268851};

    if(FloatEqual(x,0.0)) return(0.0);
    _Ty h=Abs(x); 
	_Ty s=Abs(0.0001*h);
    _Ty p(1.0e+35), ep(FLOATERROR), g(0.0);
    while((ep>0.0000001 || FloatEqual(ep,0.0000001)) && (Abs(h)>s))
    { 
		g=0.0;
        for(i=1;i<=m;i++)
        { 
			aa=(i-1.0)*h; 
			bb=i*h;
            w=0.0;
            for(j=0;j<5;j++)
            {
				xx=((bb-aa)*t[j]+(bb+aa))/2.0;
                w=w+sin(xx)/xx*c[j];
            }
            g=g+w;
        }
        g=g*h/2.0;
        ep=Abs(g-p)/(1.0+Abs(g));
        p=g;
		m=m+1;
		h=Abs(x)/m;
    }
    return(g);
}

//余弦积分
template <class _Ty>
_Ty CosineIntegralFunction(_Ty x)
{
	int m(1), i, j;
    _Ty ep(FLOATERROR),aa,bb,w,xx,g(0.0);
    _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
											0.4786286705,0.2369268851};
    
    if(FloatEqual(x,0.0)) x = 1.0e-35;
    if(x<0.0) x = -x;
    _Ty r = 0.57721566490153286060651;
    _Ty q = r + log(x);
    _Ty h = x; 
	_Ty s = Abs(0.0001*h);
    _Ty p=1.0e+35;
    while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
    { 
		g=0.0;
        for(i=1;i<=m;i++)
        { 
			aa=(i-1.0)*h; 
			bb=i*h;
            w=0.0;
            for(j=0;j<5;j++)
            {
				xx=((bb-aa)*t[j]+(bb+aa))/2.0;
                w=w+(1.0-cos(xx))/xx*c[j];
            }
            g=g+w;
        }
        g=g*h/2.0;
        ep=Abs(g-p)/(1.0+Abs(g));
        p=g; m=m+1; h=x/m;
    }
    g=q-g;
    return(g);
}

//指数积分
template <class _Ty>
_Ty ExponentIntegralFunction(_Ty x)
{
	int m(1), i, j;
    _Ty ep(FLOATERROR),aa,bb,w,xx,g(0.0);
    _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
											0.4786286705,0.2369268851};
    
    if(FloatEqual(x,0.0)) x=1.0e-10;
    if(x<0.0) x=-x;
    _Ty r=0.57721566490153286060651;
    _Ty q=r+log(x);
    _Ty h=x;
	_Ty s=Abs(0.0001*h);
    _Ty p=1.0e+35;
    while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
    { 
		g=0.0;
        for(i=1;i<=m;i++)
        {
			aa=(i-1.0)*h; bb=i*h;
            w=0.0;
            for(j=0;j<5;j++)
            { 
				xx=((bb-aa)*t[j]+(bb+aa))/2.0;
                w=w+(exp(-xx)-1.0)/xx*c[j];
            }
            g=g+w;
        }
        g=g*h/2.0;
        ep=Abs(g-p)/(1.0+Abs(g));
        p=g; m=m+1; h=x/m;
    }
    g=q+g;
    return(g);
}

//第一类椭圆积分
template <class _Ty>
_Ty Ellipse1stIntegral(_Ty k, _Ty f)
{
	int n(0);
    _Ty pi(3.1415926), e(1.0), ff;
    //_Ty fk();
    if(k<0.0) k=-k;
    if(k>1.0) k=1.0/k;
    _Ty y = Abs(f);
    
    while(y>pi||FloatEqual(y,pi))
    {
		n=n+1;
		y=y-pi;
	}
    
    if(y>pi/2.0||FloatEqual(y,pi/2.0))
    {
		n=n+1;
		e=-e; 
		y=pi-y;
	}
    if(n==0)
		ff=fk(k,y);
    else
    { 
		ff=fk(k,pi/2.0);
        ff=2.0*n*ff+e*fk(k,y);
    }
    if(f<0.0) ff=-ff;
    return(ff);
}

//第一类椭圆积分辅助函数
template <class _Ty>
_Ty fk(_Ty k, _Ty f)
{ 
	int m(1), i, j;
    _Ty p(1.0e+35),ep(FLOATERROR),aa,bb,w,xx,g(0.0),q;
    _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
											0.4786286705,0.2369268851};
    
    _Ty h=Abs(f); 
	_Ty s=Abs(0.0001*h);
    //p=1.0e+35; ep=0.000001;
    while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
    { 
		g=0.0;
        for(i=1;i<=m;i++)
        {
			aa=(i-1.0)*h; 
			bb=i*h;
            w=0.0;
            for(j=0;j<5;j++)
            { 
				xx=((bb-aa)*t[j]+(bb+aa))/2.0;
                q=sqrt(1.0-k*k*sin(xx)*sin(xx));
                w=w+c[j]/q;
            }
            g=g+w;
        }
        g=g*h/2.0;
        ep=Abs(g-p)/(1.0+Abs(g));
        p=g; 
		m=m+m; 
		h=0.5*h;
    }
    return(g);
}

//第二类椭圆积分
template <class _Ty>
_Ty Ellipse2ndIntegral(_Ty k, _Ty f)
{
	int n(0);
    _Ty pi(3.1415926), e(1.0), ff;
    //_Ty ek();
    if(k<0.0) k=-k;
    if(k>1.0) k=1.0/k;
    _Ty y = Abs(f);
    
    while(y>pi||FloatEqual(y,pi))
    {
		n=n+1; 
		y=y-pi;
	}
    
    if(y>pi/2.0||FloatEqual(y,pi/2.0))
    {
		n=n+1;
		e=-e; 
		y=pi-y;
	}
    if(n==0)
		ff=ek(k,y);
    else
    { 
		ff=ek(k,pi/2.0);
        ff=2.0*n*ff+e*ek(k,y);
    }
    if(f<0.0) ff=-ff;
    return(ff);
}

//第二类椭圆积分辅助函数
template <class _Ty>
_Ty ek(_Ty k, _Ty f)
{	int m(1), i, j;
    _Ty p(1.0e+35),ep(FLOATERROR),aa,bb,w,xx,g(0.0),q;
    _Ty t[5]={-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459};
    _Ty c[5]={0.2369268851,0.4786286705,0.5688888889,
											0.4786286705,0.2369268851};
    
    _Ty h=Abs(f);
	_Ty s=Abs(0.0001*h);
    
    while((ep>0.0000001||FloatEqual(ep,0.0000001))&&(Abs(h)>s))
    { 
		g=0.0;
        for(i=1;i<=m;i++)
		{
			aa=(i-1.0)*h;
			bb=i*h;
            w=0.0;
            for(j=0;j<5;j++)
            { 
				xx=((bb-aa)*t[j]+(bb+aa))/2.0;
                q=sqrt(1.0-k*k*sin(xx)*sin(xx));
                w=w+q*c[j];
            }
            g=g+w;
        }
        g=g*h/2.0;
        ep=Abs(g-p)/(1.0+Abs(g));
        p=g; 
		m=m+m; 
		h=0.5*h;
    }
    return(g);
}

#endif		// _SPECIALFUNCTION_INL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -