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 :

Fonction définie par morceaux


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Fonction définie par morceaux
    Bonjour,

    J'ai plusieurs questions concernant un petit bout de code que je dois écrire. Le principe est de définir une fonction (du temps) continue est définie par morceaux sur un intervalle donné. Plusieurs questions se posent à moi :
    1) la première un peu bête...
    Je définis mon vecteur temps en fonction de ma fréquence d'échantillonage Fs t=[0:1/Fs:T]. Jusque là tout va bien j'ai bien dans mon Workspace mon vecteur t 1x238 double avec les différentes valeurs du temps.
    Maintenant, si j'écris par exmple w=cos(t), dans mon Workspace j'ai un 1x238 double pour w, mais avec des 1 dans toutes les cases... Ne dervais-je pas avoir les valeurs de w évaluées aux différents temps t ?
    Ce qui est étonnant c'est que si je plot(t,w), je retrouve bien la courbe de mon cos sur l'intervalle spécifié.
    A noter que ma variable w apparait en italique bleu dans le Workspace, cela a peut être son importance.

    2) Ma deuxième question concerne la définition de ma fonction par morceaux
    J'ai essayé de définir cela sous dans mon script principal sous en créant une fonction; sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t=[0/1/Fs:T]                               %mon vecteur temps
    for i=0:1:Fs*T                             %je parcours mes échantillons
        if t(i)<0.004                                %ma condition pour le premier tronçon
            w(i)=cos(t(i))                              %ma valeur de la fonction w sur le premier tronçon
        elseif (t(i)>=0.004)
            w(i)=.....
        end
    end

    Dans l'idée c'est ça que je veux faire mais le problème est qu'n incrémentant i dans la boucle for; pour i suffisamment grand, mon premier if devient toujours faux et mon deuxième if toujours vrai, et je ne retrouve donc au final dans w que les valeurs définies par ma deuxième fonction. Y a-t-il une méthode plus aisée peut-être en définissant deux vecteurs temps différents (un pour chaque morceau de fonction)

    Je vous remercie par avance ! !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Réponse à moi meme
    Résolu j'ai défini 3 vecteurs temps différents je me suis moins embêté. Ca a l'air de fonctionner niquel

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    La raison pour laquelle w est toujours à 1 (du moins à l'affichage sur Matlab) provient sans doute du fait que votre échelle de temps comprend des valeurs plus proches de 0 que de 1.
    Ainsi le cos(0) = 1. En essayant avec une fréquence Fs = 10MHz, le workspace m'affiche des valeurs arrondies. Si vous double cliquez sur w dans le workspace pour ouvrir le tableau de valeurs,
    et que vous double cliquez à nouveau sur une case présentant un '1', vous verrez que celui-ci finira par afficher la vraie valeur de w soit 0.9999...
    Par contre au moment du plot, Matlab comprend bien les bonnes valeurs de w et donc vous affiche votre courbe.
    Cette ambiguïté saute lorsque vous prenez une fréquence Fs proche de 1.

    Maintenant pour votre code je vous propose d'essayer celui-ci et de revenir me voir si un problème persiste.

    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
    Fs = 10*1e3; %[MHz] exemple
    T = (238-1)/Fs;
    t = 0:1/Fs:T;
     
    w = zeros(length(t));
    % w = cos(t); 
    % plot(t,w)
     
    for ii = 1:length(t)
     
        if t(ii) < 0.004; w(ii) = cos(t(ii));
        else w(ii) = 0; % exemple
        end
     
    end
     
    plot(t,w)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre réponse!

    Pour le Wrkspace c'était bien ça il arrondit comme peut le faire Excel par exemple.. !!
    Pour le code niquel ça ressemble à ce que j'ai tapé mais en plus clair tout de même et plus simple.

    Est-il par contre possible de définir une fonction de manière plus générique et d'évaluer après cette fonction aux points échantillonés définis par le vecteur temps. J'ai essayé de faire ça en définissant la fonction dans une fonction. (bien vu!) Mais je dois avoir un problème de syntaxe au moment ou dans ma feuille principale je veux faire appel à cette fonction pour définir ma fonction échantillonée à partir de la fonction de référence.. je ne sais pas si je suis bien clair.. Pouvez vous m'éclairer là dessus?

    Merci et bonne journée

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Si je vous comprends bien,

    vous souhaitez au départ tracer votre courbe avec un axe temporel plus résolu ("fonction plus générique"), et venir ensuite récupérer ponctuellement des données à l'aide
    d'une fonction d'échantillonnage ?
    Si c'est bien ca c'est assez simple, je vais attendre votre retour pour être sûr.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Oui voila =)

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur Photonique
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Photonique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 126
    Points
    126
    Par défaut
    Très bien.
    Pour cela sans doute le plus simple est de définir un nombre 'ns', pouvant être définit par Fs au besoin, qui va permettre de piocher une valeur tous les ns points
    dans vos vecteurs t et w.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ts = t(1:ns:end);
    ws = w(1:ns:end);
    Ne vous restera ensuite qu'à plotter :

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Mac52 Voir le message
    Très bien.
    Pour cela sans doute le plus simple est de définir un nombre 'ns', pouvant être définit par Fs au besoin, qui va permettre de piocher une valeur tous les ns points
    dans vos vecteurs t et w.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ts = t(1:ns:end);
    ws = w(1:ns:end);
    Ne vous restera ensuite qu'à plotter :

    Merci pour cette réponse. Je me suis mal fait comprendre.. dans ton code tu définis une fonction échantillonnée (ws) par sélection d'chantillons de la fonction (w) elle-même échantillonée donc ca suppose que w ait été définie comme dans ton code précédent (vecteur temps, pas d'échantillonage).
    Mais ce n'est pas trop grave ce n'est pas essentiel pour la suite de mon code.

    Merci encore

Discussions similaires

  1. [Débutant] Transfomée de Laplace d'une fonction définie par morceaux
    Par tibmaster dans le forum MATLAB
    Réponses: 0
    Dernier message: 14/12/2014, 22h01
  2. Interpolation de fonction définie par morceaux
    Par Benmu dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/07/2014, 14h32
  3. Réponses: 2
    Dernier message: 26/12/2010, 18h34
  4. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14
  5. Fonctions définies par l'utilisateur
    Par DiGueDao dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/06/2003, 11h17

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