aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/projet.cpp8
-rw-r--r--src/stratified_sampling.hpp29
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;
};
-