diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2016-04-20 20:25:38 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2016-04-21 07:25:35 -0400 |
| commit | a1a55eedff66329d3c0f71aead5e78df71ca6e37 (patch) | |
| tree | 29b0556a06ea731ab297fb409e5cbb9f4217b6f9 /src | |
| parent | 07aa7631a8128f66c1e132ce30000bb506c683ea (diff) | |
| download | projet_C++-a1a55eedff66329d3c0f71aead5e78df71ca6e37.tar.gz | |
rend le code un peu plus beau
Diffstat (limited to 'src')
| -rw-r--r-- | src/projet.cpp | 86 |
1 files changed, 43 insertions, 43 deletions
diff --git a/src/projet.cpp b/src/projet.cpp index 16aca2b..46952e2 100644 --- a/src/projet.cpp +++ b/src/projet.cpp @@ -13,18 +13,19 @@ using namespace std; struct first:public std::unary_function<std::vector<double>, double> -{ +{ double operator()(std::vector<double> X){ return X[0]; - } + } }; vector< vector<double> > exemple1_stratified() { + int I = 10; //le nombre de strates vector<double> q = quantile_norm(10, 1); - vector<double> p(10, 0.1); + vector<double> p(I, 1/(double)I); vector<gaussian_truncated> rvar; rvar.push_back(gaussian_truncated(GSL_NEGINF, q[0])); - for (int i=1; i<10; i++){ + for (int i=1; i<I; i++){ rvar.push_back(gaussian_truncated(q[i-1], q[i])); }; vector<int> N = {300, 1000, 10000, 20000}; //notre tableau du nombre successif de tirages, qui correspondent aux 300, 1300, 11300 et 31300 @@ -33,7 +34,7 @@ vector< vector<double> > exemple1_stratified() { stratified_sampling<gaussian_truncated> S(p,rvar); cout<<"N"<<"\t"<<"moyenne"<<"\t\t"<<"sigma"<<"\t"<<"théorique"<<endl; vector<double> r(4,0); - for (int i=0; i<4; i++){ + for (size_t i=0; i<N.size(); i++){ S.draw(N[i]); r[0]= r[0] + N[i]; r[1] = S.estimator().first; @@ -50,8 +51,8 @@ vector< vector<double> > exemple1_rqmc(){ vector<int> 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<double> > data (4); - for(int i =0; i<4; i++){ - data[i] = monte_carlo (I,quasi_mean<struct first, sobol> (N[i], 1, f)); + for(size_t i =0; i<N.size(); i++){ + data[i] = monte_carlo (I, quasi_mean<struct first, sobol> (N[i], 1, f)); } cout<<"moyenne"<<"\t\t"<<"sigma"<<"\t\t"<<"taille IC"<<endl; for(int i =0; i<3; i++){ @@ -61,46 +62,45 @@ vector< vector<double> > exemple1_rqmc(){ }; -std::vector<double> normalize (std::vector<double> mu) { +std::vector<double> normalize (std::vector<double> mu) { int d = mu.size(); - double norm_mu = 0; - std::vector<double> u(d); - for(int i=0; i<d; i++) { - norm_mu += mu[i]*mu[i]; - } + double norm_mu = 0; + std::vector<double> u(d); + for(int i=0; i<d; i++) { + norm_mu += mu[i]*mu[i]; + } for(int i=0; i<d; i++) { u[i] = mu[i]/sqrt(norm_mu); - } + } return u; } - - - vector <vector<double> > exemple2_stratified (int d){ - std::vector<double> mu(d); - vector<double> K = {45, 50, 55}; - vector<int> N = {100000, 400000, 500000}; - vector< vector<double> > data(3); - vector<double> q = quantile_norm(100, 1); - vector<double> p(100, 0.01); - double r = 0.05; - double T = 1.0; - double S0 = 50; - double V = 0.1; - typedef compose_t<exponential_tilt<asian_option>, multi_gaussian_truncated> tilted_option; - for (int i=0; i<3; i++){ - mu = argmax(r, T, S0, V, K[i], d); - std::vector<double> u(d); - u = normalize(mu); + + +vector <vector<double> > exemple2_stratified (int d){ + vector<double> K = {45, 50, 55}; + vector<int> N = {100000, 400000, 500000}; + int I = 100; //le nombre de strates + vector< vector<double> > data(3); + vector<double> q = quantile_norm(I, 1); + vector<double> p(I, 1/(double)I); + double r = 0.05; + double T = 1.0; + double S0 = 50; + double V = 0.1; + typedef compose_t<exponential_tilt<asian_option>, multi_gaussian_truncated> tilted_option; + for (size_t i=0; i < K.size(); i++){ + vector<double> mu = argmax(r, T, S0, V, K[i], d); + std::vector<double> u = normalize(mu); asian_option A(r, T, S0, V, K[i], true); exponential_tilt<asian_option> G(mu, A); std::vector<tilted_option> X; - X.push_back(compose(G, multi_gaussian_truncated(GSL_NEGINF,q[0], u))); - for(int j=1; j<100; j++) { - X.push_back(compose(G, multi_gaussian_truncated(q[j-1],q[j], u))); + X.push_back(compose(G, multi_gaussian_truncated(GSL_NEGINF, q[0], u))); + for(int j=1; j < I; j++) { + X.push_back(compose(G, multi_gaussian_truncated(q[j-1], q[j], u))); } stratified_sampling<tilted_option> S(p, X); vector<double> r(3, 0); - for (int j=0; j<3; j++){ + for (size_t j=0; j < N.size(); j++){ S.draw(N[j]); } r[0] = K[i]; @@ -120,9 +120,11 @@ vector< vector<double> > exemple2_rqmc(int d) { double V = 0.1; vector< vector<double> > data(3); vector<double> K = {45, 50, 55}; - for(int i =0; i<3; i++){ + int I=100;//la taille du vrai Monte-Carlo + for(int i =0; i<3; i++) { asian_option A(r, T, S0, V, K[i], true); - data[i] = monte_carlo(100, quasi_mean<asian_option, sobol> (N, d, A));} + data[i] = monte_carlo(I, quasi_mean<asian_option, sobol> (N, d, A)); + } for(int i =0; i<3; i++){ std::cout<<data[i][0]<<std::endl; } @@ -146,18 +148,16 @@ int make_table1(vector< vector<double> > data1, vector< vector<double> > data2) int main() -{ +{ init_alea(2); //~ cout<<gsl_cdf_gaussian_Pinv(0.975,1)<<endl; //~ cout<<"Stratified_sampling sur l'exemple 1 de la normale"<<endl; - //~ vector< vector<double> > data1 = exemple1_stratified(); + //~ vector< vector<double> > data1 = exemple1_stratified(); //~ cout<<"Randomised quasi Monte-Carlo sur l'exemple 1 de la normale"<<endl; //~ vector< vector<double> > data2 = exemple1_rqmc(); //~ make_table1(data1, data2); exemple2_rqmc(16); exemple2_stratified(16); return 0; - -} - +} |
