mardi, mai 30, 2006

Brownien et Matlab

En ce moment, je fais un peu de math financière... L'une des grandes questions lorsqu'on veut faire des simulations est: "Comment faire un mouvement brownien?" Donc voici une première mouture de mes petites fonctions matlab, il est bien sûr à noter qu'elles ne sont pas du tout optimisées et qu'il faudrait donc par exemple faire une dichotomie de l'espace de simulation et d'optimiser la taille de l'intervalle en fonction de la mémoire... à venir. En atendant les beaux jours voilà toujours 4 méthodes:
  1. La méthode des incréments:


    function B=increment(L)
    T=1;
    A=(sqrt(T)/sqrt(L))*sqrt(-2*log(rand(L,1))).*cos(2*pi*rand(L,1));
    Q=tril(ones(L,L),-1)+eye(L,L);
    B=Q*A;


    Voici le résultat:



  1. La méthode de Karhunen-Loève:


    function res=karhunen_loeve(L)

    %on se ramene à travailler sur [0,1] -> T=L
    n=0:L-1;
    t=transpose(n);

    Z=sqrt(-2*log(rand(L,1))).*cos(2*pi*rand(L,1));
    A=2*sqrt(2*L)./((2*n+1)*pi);
    Z=transpose(A).*Z;
    res=(sin((t*(2*n+1)*pi)/(2*L)))*Z;

    Voici le résultat:

  2. La méthode de Cholesky:


    function res=cholesky(N)
    G=min(diag(1:N)*ones(N,N),ones(N,N)*diag(1:N));
    res=chol(G)*(sqrt(1/N)*sqrt(-2*log(rand(N,1))).*cos(2*pi*rand(N,1)))+zeros(N,1);

    Voici le résultat:


  3. La méthode du point médian:


    function Res=pointmedian(T)
    Res=zeros(1,T);
    Res=1./Res;
    Res(1,1)=0;
    Res(1,T)=sqrt(T)*sqrt(-2*log(rand))*cos(2*pi*rand);
    for i= 1:T
    if Res(1,i)==Inf
    Res(1,i)=pmedian_recursif(Res,i);
    end
    end


    et la fonction récursive: pmedian_recursif


    function res=pmedian_recursif(Tableau,indice)
    j=sum(factor(indice)==2);
    k=indice/(2^j);

    if Tableau(max(1,(k-1)*2^j))==Inf
    gauche=pmedian_recursif(Tableau,(k-1)*2^j);
    else
    gauche=Tableau(max(1,(k-1)*2^j));
    end

    if Tableau((k+1)*2^j)==Inf
    droite=pmedian_recursif(Tableau,(k+1)*2^j);
    else
    droite=Tableau((k+1)*2^j);
    end

    res=(gauche+droite+sqrt(2^(j+1))*sqrt(-2*log(rand))*cos(2*pi*rand))/2;


    Voici le résultat:


Comments: Enregistrer un commentaire

Links to this post:

Créer un lien



<< Home

This page is powered by Blogger. Isn't yours?