TP 5 : simulation de variables aléatoires

Le but de ce TP est d'écrire une classe parente VariableAleatoire et des classes dérivées simulant des loi standards.

Rappel sur les nombres aléatoires

On rappelle qu'en C++ il existe un générateur pseudo-aléatoires dans cstdlib fournissant une fonction rand() qui renvoie un entier compris entre 0 et RAND_MAX.
Pour initialiser le générateur avec une graîne différente à chaque éxécution on utilisera la fonction srand(time(NULL)); en début de main.

Visualisation de distribution

Utilisez le visualisateur suivant pour vos vérifications :

Liste des valeurs (sous la forme 0.34343 separées par des espaces ou des sauts de ligne)
Pas du graphe:

Classe VariableAleatoire

Ecrire dans un fichier varalea.h la définition de classe suivante :
#ifndef _VARALEA_H #define _VARALEA_H class VariableAleatoire { public: VariableAleatoire() {}; virtual double valeur() = 0; }; #endif //_VARALEA_H
En ayant définis la fonction valeur comme virtuelle, on s'assure que les appels à cette fonction émise depuis des instances de classes dérivés utilise la version qu'elles ont défini. En donnant à cette fonction la valeur 0, on rend la méthode pure et la classe abstraite.

classe VAUniformeDiscrete

Ecrire une classe derivée de VariableAleatoire dont la valeur est celle d'une v.a. de loi uniforme sur un ensemble {m,m+1,...,n}.
Les entiers m et n valant par défaut 0 et RAND_MAX.

classe VAUniformeContinue

Ecrire une classe dérivée de VariableAleatoire dont la valeur simule celle d'une v.a. de loi uniforme sur un segment [a,b].
Pour la simulation on composera une VAUniformeDiscrete.

classe VANormale

Ecrire une classe dérivée de VariableAleatoire dont la valeur simule une loi normale.
Pour la simulation on composera deux VAUniformeContinue et on utilisera la méthode de Box-Muller (cf. Google).

classe VALogNormale

Ecrire une classe dérivée de VariableAleatoire dont la valeur simule une loi log-normale.
Pour la simulation on composera une VANormale.

Processus stochastiques

Inspirez-vous de l'approche précédente pour réaliser une classe abstraite ProcessusStochastique et des classes dérivées Brownien et BrownienGeometrique.

On modélisera un processus stochastique comme une suite de variables aléatoires indexés par le temps. On va simuler le processus en le discrétisant suivant un pas de temps dt donné en paramètre au constructeur. On donnera également une valeur initiale en paramètre. Le processus aura une methode virtuelle pure double suivante(double v) qui étant donné une valeur v en t renvoie la valeur en t+dt (cette méthode ne dépend pas de t en vertu de la définition d'un processus stochastique).

Le processus fournira une méthode double valeur(double t). On ramenera tout d'abord t au k*dt le plus proche. Pour avoir la valeur en k*dt avec k non nul (sinon on renvoie la valeur initiale) on prendra la valeur en (k-1)*dt et on appelera suivante.

Ainsi, on réalisera dans la classe ProcessusStochastique un cache permettant de stocker ces valeurs pour ne pas avoir à appeler deux fois valeur(1) quand on appelle valeur(2) puis valeur(3). Ce cache sera réalisé grâce à une map, une structure d'association fournie par la STL dans le fichier include du même nom.
Le type du cache sera alors map<int,double> cache;
Pour ajouter un élément de valeur x pour le temps k*dt, on utilisera juste cache[k] = x;. Pour savoir si un temps est deja associé on utilisera la fonction cache.count(k) renvoyant 1 si c'est le cas et 0 sinon.
On procedera donc ainsi dans le calcul de valeur(t), si t proche de k*dt et k dans le cache, on renvoie la valeur du cache, sinon on la calcule avec suivante et la valeur en (k-1).

Rajouter des classes dérivées avec des méthodes suivantes appropriées pour le Brownien et le BrownienGeometrique.

P.S. : appliquez-vous, vous re-utiliserez ces classes dans le projet.