équation dynamique

badboy93120 Messages postés 25 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 2 mai 2007 - 21 mars 2007 à 16:40
badboy93120 Messages postés 25 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 2 mai 2007 - 21 mars 2007 à 19:23
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 mars 2007 à 18: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.
0
badboy93120 Messages postés 25 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 2 mai 2007
21 mars 2007 à 19:23
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.
0
Rejoignez-nous