#include #include #include #include #include #include "stratified_sampling.hpp" #include #include #include "opti.hpp" #include "option.hpp" #include "rqmc.hpp" using namespace std; struct first:public std::unary_function, double> { double operator()(std::vector X){ return X[0]; } }; vector< vector > exemple1_stratified() { vector q = quantile_norm(10, 1); vector p(10, 0.1); vector rvar; rvar.push_back(gaussian_truncated(GSL_NEGINF, q[0])); for (int i=1; i<10; i++){ rvar.push_back(gaussian_truncated(q[i-1], q[i])); }; vector N = {300, 1000, 10000, 20000}; //notre tableau du nombre successif de tirages, qui correspondent aux 300, 1300, 11300 et 31300 //de l'article de Etoré et Jourdain vector< vector > data (4); stratified_sampling S(p,rvar); cout<<"N"<<"\t"<<"moyenne"<<"\t\t"<<"sigma"<<"\t"<<"théorique"< r(4,0); for (int i=0; i<4; i++){ S.draw(N[i]); r[0]= r[0] + N[i]; r[1] = S.estimator().first; r[2] = S.estimator().second; r[3] = 0.1559335; cout< > exemple1_rqmc(){ int I = 100; vector N = {3, 13, 113, 313}; //les N choisis pour que les NI soient égaux aux N de l'exemple 1 stratified_sampling first f; //comme quasi_gaussian retourne un vecteur, on doit composer avec f pour avoir le double QG()[0] vector< vector > data (4); for(int i =0; i<4; i++){ data[i] = monte_carlo (I,quasi_mean (N[i], 1, f)); } cout<<"moyenne"<<"\t\t"<<"sigma"<<"\t\t"<<"taille IC"< normalize (std::vector mu) { int d = mu.size(); double norm_mu = 0; std::vector u(d); for(int i=0; i mu(d); mu = argmax(0.05, 1.0, 50, 0.1, 45, d); std::vector u(d); u = normalize(mu); vector q = quantile_norm(100, 1); vector p(100, 0.01); asian_option A(0.05, 1.0, 50, 0.1, d, 45); exponential_tilt G(mu, A); typedef compose_t, multi_gaussian_truncated> tilted_option; std::vector X; X.push_back(compose(G, multi_gaussian_truncated(GSL_NEGINF,q[0], u))); for(int i=1; i<100; i++) { X.push_back(compose(G, multi_gaussian_truncated(q[i-1],q[i], u))); } for(int i=0; i<100; i=i+10){ std::cout< S(p, X); S.draw(1000); cout<<"l'estimateur de la moyenne est :"< result(3); result = monte_carlo(100, quasi_mean (N, d, A)); for(int i =0; i<3; i++){ std::cout< result2(3); result2 = monte_carlo(100, quasi_mean (N, d, A)); for(int i =0; i<3; i++){ std::cout< > data1, vector< vector > data2) { std::fstream fs("doc/table.tex", std::fstream::out);; fs< > data1 = exemple1_stratified(); cout<<"Randomised quasi Monte-Carlo sur l'exemple 1 de la normale"< > data2 = exemple1_rqmc(); make_table(data1, data2); exemple2_stratified(16); return 0; }