Пример #1
0
int gauss(dvec& x, dvec& w) {

    int n = x.size();
    double dist = 1;
    double tol = 1e-15;
    int iter = 0;

    // Use Chebyshev-Gauss nodes and initial guess
    initguess(x);
//    chebnodes(x);

    dvec x0(x);
    dvec L(n,0.0);
    dvec Lp(n,0.0);
    dvec a(n,0.0);
    dvec b(n,0.0);

    rec_legendre(a,b);

    // Iteratively correct nodes with Newton's method
    while(dist>tol) {     
        newton_step(a,b,x,L,Lp);
        dist = dist_max(x,x0); 
        ++iter;
        x0 = x;
    } 

    // Compute Weights
    for(int i=0;i<n;++i){
        w[i] = 2.0/((1-x[i]*x[i])*(Lp[i]*Lp[i]));
    }

    return iter;
}
Пример #2
0
int main(void)
{
    typedef double RealType;
    typedef mcpack::utils::GaussPotentialEnergy<RealType> PotEngType;
    typedef PotEngType::RealVectorType RealVectorType;
    typedef PotEngType::RealMatrixType RealMatrixType;
    typedef RealMatrixType::Index IndexType;
    typedef mcpack::hamiltonian::GaussKineticEnergy<RealType> KinEngType;
    typedef mcpack::hamiltonian::LeapFrog<PotEngType,KinEngType> IntegratorType;
    typedef mcpack::utils::RandomVariateGenerator<RealType> RandVarGenType;
    typedef mcpack::hamiltonian::HMCProposal<IntegratorType,RandVarGenType> HMCProposalType;
    //typedef mcpack::hamiltonian::ClassicHMC<HMCProposalType> HMCType;
    typedef mcpack::hamiltonian::MPIInterChainClassicHMC<HMCProposalType> HMCType;

    
    const IndexType N=10;

    RealVectorType mu=RealVectorType::Zero(N);
    RealMatrixType SigmaInv=RealMatrixType::Identity(N,N);
    RealMatrixType MInv=RealMatrixType::Identity(N,N);
    RealVectorType q0=RealVectorType::Random(N);

    const RealType eps=1;
    const IndexType Nsteps=10;

    PotEngType G(mu,SigmaInv);
    KinEngType K(MInv);

    IntegratorType Lp(G,K);

    HMCProposalType prop(Lp,eps,Nsteps);

    HMCType hmc(prop,q0,12346l);

    
    const IndexType NSamples=1000;

    RealMatrixType Samples(NSamples,N);

    hmc.Generate(Samples);
    
    std::cout<<"Acceptace Rate= "<<hmc.GetAcceptanceRate()<<std::endl;

	return 0;
}
Пример #3
0
double LVector::apertureFlux(double R_, int maxP) const
{
    static boost::shared_ptr<tmv::Vector<double> > fp;
    static double R=-1.;
    static double psize=-1;

    assert(R_>=0.);

    if (maxP<0) maxP= getOrder()/2;
    if (maxP > getOrder()/2) maxP=getOrder()/2;

    if (!fp.get() || R_ != R || maxP>psize) {
        fp.reset(new tmv::Vector<double>(maxP));
        psize = maxP;
        R = R_;
        tmv::Vector<double> Lp(maxP+1);
        tmv::Vector<double> Qp(maxP+1);
        double x = R*R;
        double efact = std::exp(-0.5*x);
        Lp[0] = Qp[0]=1.;
        if (maxP>0) {
            Lp[1] = 1. - x;
            Qp[1] = -1. - x;
        }
        for (int p=1; p<maxP; p++) {
            Lp[p+1] = ((2*p+1-x)*Lp[p]-p*Lp[p-1])/(p+1);
            Qp[p+1] = (-x*Lp[p]-Qp[p]+p*Qp[p-1])/(p+1);
        }
        for (int p=0; p<=maxP; p++)
            (*fp)[p] = 1. - efact*Qp[p]*(p%2==0 ? 1. : -1.);
    }

    double flux = 0.;
    for (int p=0; p<=maxP; p++)
        flux += (*_v)[PQIndex(p,p).rIndex()] * (*fp)[p];
    return flux;
}