diff options
| -rw-r--r-- | src/projet.cpp | 8 | ||||
| -rw-r--r-- | src/stratified_sampling.hpp | 29 |
2 files changed, 19 insertions, 18 deletions
diff --git a/src/projet.cpp b/src/projet.cpp index b4fa5f9..c4bd6d8 100644 --- a/src/projet.cpp +++ b/src/projet.cpp @@ -6,6 +6,7 @@ #include <cmath> #include <algorithm> #include "opti.hpp" +#include "option.hpp" using namespace std; @@ -49,8 +50,9 @@ void exemple1_stratified() { vector<double> q = quantile_norm(100, 1); vector<double> p(100, 0.01); asian_option A(0.05, 1.0, 50, 0.1, d, 45); - f_mu G(mu,A); - std::vector<compose_t <f_mu, multi_gaussian_truncated> > X; + exponential_tilt<asian_option> G(mu, A); + typedef compose_t<exponential_tilt<asian_option>, multi_gaussian_truncated> tilted_option; + std::vector<tilted_option> 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))); @@ -58,7 +60,7 @@ void exemple1_stratified() { for(int i=0; i<100; i=i+10){ std::cout<<X[i]()<<endl; } - stratified_sampling<compose_t <f_mu, multi_gaussian_truncated> > S(p, X); + stratified_sampling<tilted_option> S(p, X); S.draw(1000); cout<<"l'estimateur de la moyenne est :"<<S.estimator().first<<endl; } diff --git a/src/stratified_sampling.hpp b/src/stratified_sampling.hpp index 9099e38..9175f75 100644 --- a/src/stratified_sampling.hpp +++ b/src/stratified_sampling.hpp @@ -3,7 +3,6 @@ #include <iostream> #include "var_alea.hpp" #include <gsl/gsl_cdf.h> -#include "option.hpp" using namespace std; @@ -14,14 +13,14 @@ struct gaussian_truncated : var_alea<double> { gaussian_truncated(double a, double b, double mu = 0, double sigma = 1) :a(a), b(b), V(gsl_cdf_ugaussian_P(a), gsl_cdf_ugaussian_P(b)), mu(mu), sigma(sigma) {}; - + double operator()() { double v = V(); return mu + gsl_cdf_gaussian_Pinv(v,sigma); } - + private: - double a, b; + double a, b; uniform V; double mu; double sigma; @@ -31,7 +30,7 @@ struct multi_gaussian_truncated : public var_alea<std::vector<double> > { multi_gaussian_truncated(double a, double b, const std::vector<double> u) :a(a), b(b), V(gsl_cdf_ugaussian_P(a), gsl_cdf_ugaussian_P(b)), G(0,1), u(u), d(u.size()) {}; - + std::vector<double> operator()() { double v = V(); double Z = gsl_cdf_gaussian_Pinv(v,1); @@ -49,9 +48,9 @@ struct multi_gaussian_truncated : public var_alea<std::vector<double> > } return X; } - + private: - double a, b; + double a, b; uniform V; gaussian G; std::vector<double> u; @@ -180,15 +179,16 @@ pair<double,double> stratified_sampling<L>::estimator() const { return {est_mean, est_std}; } -struct f_mu : public std::unary_function<std::vector<double>, double> +template <typename Fct> +struct exponential_tilt : public std::unary_function<std::vector<double>, double> { - f_mu(std::vector<double> mu, asian_option A) : mu(mu), A(A){ + exponential_tilt(std::vector<double> mu, Fct f) : mu(mu), f(f){ norm_mu = 0; for(unsigned int i=0; i<mu.size(); i++) { norm_mu += mu[i]*mu[i]; } }; - + double operator()(std::vector<double> X) { std::vector<double> Y(X.size()); double scal = 0; @@ -196,12 +196,11 @@ struct f_mu : public std::unary_function<std::vector<double>, double> Y[i] = X[i] + mu[i]; scal+=X[i]*mu[i]; } - return A(Y)*exp(-scal-0.5*norm_mu); + return f(Y) * exp(-scal-0.5*norm_mu); }; - - private : + + private: std::vector<double> mu; - asian_option A; + Fct f; double norm_mu; }; - |
