IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

problème fonction CONV(x,y)


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut problème fonction CONV(x,y)
    Bonjour,

    J'ai un petit soucis en utilisant la fonction conv(,). Voici mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    clc;
    close all;
     
    u=@(x)heaviside(x);
    v=@(x) exp(-2*x).*heaviside(x);
     
    dx=1;
    x=0:dx:120;
     
    u_x=u(x);
    v_x=v(x);
    w=conv(v_x,u_x);
     
    z=0:dx: (length(x)*2-2)*dx;
     
    figure
    hold on
     
    plot(x,v_x,'b-',x,u_x,'g-')
    plot(z,w,'r-')
    plot(x,1/2*(1-exp(-2*x)).*heaviside(x),'y-')
    A chaque essai (et ce pour différentes fonctions, intervalle et pas) Matlab me donne bien une réponse dont la forme est correcte (semblable au produit de convolution calculé à la main) mais il n'a pas la bonne échelle selon l'axe Y. Par exemple plus dx est petit (0,1 par example) plus le produit de convolution aura un maximum élevé ce que je n'arrive pas à expliquer.
    Si vous compilez vous aurez: en vert et bleu les fct de départ, en rouge le produit de convolution calculé par matlab et en jaune la réponse exacte.

    Lorsque l'on regarde ce que matlab fait on trouve que pour w(3) il a fait w(3)=u(1)*v(3)+u(2)*v(2)+u(3)*v(3) ce qui explique que lorsque mon pas diminue je trouve max(w) de plus en plus grand mais ça ne correspond pas à la définition du produit de convolution selon l'intégrale telle que décrit ici: http://fr.wikipedia.org/wiki/Produit_de_convolution
    Suis je entrain d'utiliser la mauvaise fonction? Ou le pas doit-il être fixé à une certaine valeur pour que cov(u,v) corresponde bien à l'intégrale?
    Je me dis qu'il faut peut-être passer en fréquentiel par fourier puis produit scalaire puis transformée de fourier inverse pour revenir en temporel...


    D'avance merci pour votre aide!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Scientific consultant in spatial remote sensing
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Scientific consultant in spatial remote sensing
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Salut,

    Je ne suis pas un expert, mais comme tu dis, ce résultat est "normal". Ce que calcule Matlab avec conv(), c'est le produit de convolution discret: conv(X(n),Y(n)) où n est une variable entière. Donc si tu changes ton pas, tu change tes fonctions X(n) et Y(n), et le résultat est différent.

    Toi, tu recherches à calculer une approximation numérique d'un produit de convolution continu, conv(x(t),y(t)), ton approximation étant d'autant meilleure que tu réduis le pas numérique que tu utilises. Donc pour ça, tu dois prendre la formule du produit de convolution continu (avec l’intégrale et le dt), et regarder comment on fait un calcul numérique approché d'une intégrale. Le plus simple, et ce qui correspond probablement à ce que tu veux faire, c'est d'utiliser la méthode des rectangles. Dans ce cas, l'approximation de ton produit de convolution continue est simplement le produit de convolution discret de tes vecteurs, le conv(X(n),Y(n)) que tu calcules dans ton exemple, multiplié par le pas numérique que tu as choisi, dx dans ton cas je crois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    figure; hold on;
    color_list={'r','m','g'};
    for id=1:3
     h=10^(-id);
     t=[-1:h:1];
     x=exp(-10*t.^2);
     y=double(abs(t)<=0.5);
     convcont_approx=h*conv(x,y,'same');
     if id==3
      hx=plot(t,x,'k-');
      hy=plot(t,y,'b-');
     end
     h_conv(id)=plot(t,convcont_approx,'-','color',color_list{id});
     conv_leg{id}=sprintf('conv(x(t),(y(t)) pour h=%.3f',h);
    end
    legend([hx hy h_conv],{'x(t)','y(t)',conv_leg{:}})
    xlabel('t')

Discussions similaires

  1. Problème : Fonctions et commande Execute
    Par bubi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/11/2005, 11h01
  2. Problème fonction SDL
    Par seeme dans le forum SDL
    Réponses: 2
    Dernier message: 06/11/2005, 20h22
  3. Problème fonction PL/SQL
    Par SSJ17Vegeta dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2005, 21h14
  4. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 22h53
  5. Réponses: 2
    Dernier message: 20/08/2004, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo