équation dynamique

Signaler
Messages postés
25
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
2 mai 2007
-
Messages postés
25
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
2 mai 2007
-
Bonjour à tous, j'aimerais programmer une équation dynamique en C++ qui est:

    f(0,x)=[K-exp(x)]+ pour x=u;

    f(i+1,x)=pn*f(i,x+sigma*sqrt(delta))+(1-pn)*f(i,x-sigma*sqrt(delta));

voila mon code:

  double partiepositive (double k,double e) // renvoie la partie positive de k-e

{

  if (k>e) return k-e;

  else 0;

}


double phi(double u, double K,double  T,double  sigma,double N,double r,double i,double x)//equiation dynamique

{

    double delta=T/N;

    double res;

    double mu=r-sigma*sigma/2;

    double pn=0.5+mu*sqrt(delta)/(2*sigma);

    res=partiepositive(K,exp(x));

     double w1=x+sigma*sqrt(delta);

   double w2=x-sigma*sqrt(delta);

   

    if((i==0)&&(x=u))

      {return 0;}

    else

      {

        if(x>=u)

          return 0;

        else

          {   

        return pn*phi(u, K, T, sigma,N,r, i-1,w1)+(1-pn)*phi(u, K, T, sigma,N,r, i-1,w2);

          }

      }

      }

}


mon problème est que l'algorithme est très lent!!! à partir de i=27..

avez-vous des améliorations pour y remédier??

merci d'avance.

2 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Salut,


Tu pourrais commencer par mettre tes pré calculs ( de res, dew1 et
2...) dans les ifs, de manière à ne pas les faires quand ils ne servent
à rien.


Par contre, je suis sceptique sur ton implémetation.


Ton algo, ça à l'air d'être :


if x=u

  return 0

else

  return pn*f(i,x+sigma*sqrt(delta))+(1-pn)*f(i,x-sigma*sqrt(delta))

end if


Cela ne correspond pas aux formules mathématiques que tu nous donne :
Dans le else, tu renvois f(i+1,x) alors que c'est f(i,x) que la
fonction est sensée renvoyer... L'algo est plus compliqué que ce que tu
as écrit je pense.
Messages postés
25
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
2 mai 2007

non je crois que l'algo est correct (il fait bien le travail donné)
sauf qu'il n'est pas optimal. Sur un autre forum, on m'a informé que je
calculais plusieurs fois, et qu'il fallait les stocker dans 1 tableau.
Je ne vois pas du tout comment faire. Si tu as une suggestion...


double phi(double u, double K,double  T,double  sigma,double N,double r,double x)

{

 

  if((N==0)&&(x=u))

    {return 0;}

    else

      {

        double delta=T/N;

        double mu=r-sigma*sigma/2;

        double pn=0.5+mu*sqrt(delta)*0.5/(sigma);

        double s =sigma*sqrt(delta);

        double w1=x+s;

        double w2=x-s;

        if(x>=u)

          return 0;

        else{

          return pn*phi(u, K, T, sigma,N-1,r,w1)+(1-pn)*phi(u, K, T, sigma,N-1,r,w2);

        }

      }

    }

}

merci d'avance.