#include "low_discrepancy.hpp" #include #include #include "var_alea.hpp" double frac_part(double x); //fonctions de compositions de monte_carlo.hpp template struct generator { typedef _Result result_type; }; template struct compose_t : public generator< typename Fct::result_type > { compose_t(Fct f, VA X) : f(f), X(X) {}; typename Fct::result_type operator()() { return f(X()); }; private: Fct f; VA X; }; template inline compose_t compose(Fct f, VA X) { return compose_t(f, X); }; template struct mean_t: public generator { mean_t(int n, VA X): n(n), X(X) {}; double operator()(){ double sum = 0; for(int i=0; i inline mean_t mean(int n, VA X){ return mean_t(n, X); }; //Les classes de monte-Carlo template std::vector quasi_mean(int n, L X, double p=0.05) { std::vector result(3,0); double x; for (int j = 0; j < n; j++) { x = X(); result[0] += x; result[1] += x*x; } result[0] /= (double) n; result[1] = (result[1] - n*result[0]*result[0])/(double)(n-1); result[2] = gsl_cdf_gaussian_Pinv(1-p/2,1)*sqrt(result[1]/(double) n); return result; }; template std::vector quasi_mean(int n, Fct f, L X, double p=0.05) { return quasi_mean(n, compose(f, X), p); }; //Les classes de quasi-mean template struct quasi_gaussian : public var_alea > { quasi_gaussian (int d, double mean = 0, double std =1) : d(d), mean(mean), std(std), s(d), U(0,1), seed(d) { for(int i=0; i operator ()(){ std::vector result = s(); for(int i=0;i seed; }; struct gaussian_d : public var_alea > { gaussian_d(int d, double mean = 0, double std =1) : d(d), mean(mean), std(std), G(mean, std) {}; std::vector operator ()(){ std::vector result(d); for(int i=0;i