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 :

générer un vecteur en utilisant "linspace" et "cat" [Débutant]


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 76
    Points : 54
    Points
    54
    Par défaut générer un vecteur en utilisant "linspace" et "cat"
    Bonjour, je souhaite créer un vecteur V dont je ne connais que les extremums locaux. Entre ces extremums locaux je voudrais calculer la valeur des autres points (j'utilise "linspace"). Puis je voudrais mettre bout-à-bout les résultats obtenus. Voici ce que j'ai fait pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    T=0:0.1:30;                                             %création du vecteur temps
    extrema_V=[0 10 120 60 80 80 80];             %vecteur des extremas locaux
    chg_V_at_t=[0 5 15 20 22 26 30];          %valeurs du temps pour lesquelles on atteint les extremas locaux.
    for i=1:lenght(extrema_V)
        L(i)=(linspace(extrema_V(i),extrema_V(i+1),6))'; 
        V=cat(1,L(i));
    end
    Je pense qu'il me faudrait un deuxième indice dans ma boucle for (?)
    Merci pour votre aide!

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Je ne comprends pas bien ce que tu veux faire Pourrais-tu nous montrer un exemple concret de ce que tu veux en sortie?

    As-tu testé ton code? Car je pense qu'il ne fonctionne pas: tu ne peux assigner un vecteur ((linspace(extrema_V(i),extrema_V(i+1),6))') dans un simple scalaire (L(i)).

    Tu vas aussi avoir une erreur lors de la dernière itération car la boucle parcourt toute la longueur du vecteur extrema_V alors que tu utilises un index i+1 or end+1 n'existe pas par définition.

    De plus, la boucle ne sert à rien puisque tu écrases à chaque fois la variable V, à la fin elle aura donc juste la valeur de la dernière itération.

    Duf

    EDIT: Je me suis essayé à l'exercice mais je sais pas si ca correspond à ce que tu souhaites:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    extrema_V=[0 10 120 60 80 80 80];             %vecteur des extremas locaux
    V = [];
    for i=1:length(extrema_V)-1
        V=[V; cat(1,linspace(extrema_V(i),extrema_V(i+1),6))];
    end
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    je n'ai pas trop compris ce que tu cherches à faire... Est ce qu'il s'agit d'une interpolation entre tes maxima locaux? Si c'est le cas, il ne convient pas d'utiliser linspace mais tout simplement interp1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    T=0:0.1:30;                                             %création du vecteur temps
    extrema_V=[0 10 120 60 80 80 80];             %vecteur des extremas locaux
    chg_V_at_t=[0 5 15 20 22 26 30];          %valeurs du temps pour lesquelles on atteint les extremas locaux.
     
     
    A=interp1(chg_V_at_t,extrema_V,T);
     
    % partie graphique
    plot(T,A)
    hold on
    stem(chg_V_at_t,extrema_V,'r')

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    C'est vrai que c'était pas au top de la clarté
    En fait j'aimerais calculer (par interpolation linéaire) les valeurs de V entre chaque extrema en utilisant n (ici n=6) points. Par exemple entre 0 et 10 on va obtenir 6 points, de même entre 10 et 120 etc.
    Et au final je voudrais créer un vecteur colonne de 6*6+2 lignes qui contienne les différents points calculés.
    Ici ca donnerait [0 2 4 6 8 10 32 54 76 98 120... 80]
    Duf, ton script le fait presque, j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V=[V; cat(1,linspace(extrema_V(i),extrema_V(i+1),6))];
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    V=[V; vertcat(V,linspace(extrema_V(i),extrema_V(i+1),6))];
    mais ce n'est pas encore ca.
    Merel, c'est vrai que je veux faire une interpolation linéaire entre mes points 0 10 120 etc. Utiliser "linspace" n'est donc pas adapté? parce que pour moi "linspace" et un cas particulier de "interp1". Me trompe-je?
    Merci pour vos réponses rapides en tout cas.
    Je vais continuer de chercher.

    But du script:
    obtenir tout les points entre les extremas locaux pour obtenir "beaucoup" de points pour ensuite faire une interpolation polynomiale sur l'ensemble des points pour obtenir un polynôme de degré élevé (nombre de points-1), qui me servira d'entrée (continue ?) sous Simulink.
    J'ai dans l'idée que l'interpolation me permettrait d'avoir une fonction de classe C1 et donc qui ne possède pas de "pics" (au sens de la continuité).
    Est-ce que ce serait le cas?
    Merci encore pour votre aide.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Je comprends un petit peu mieux même si je ne saisie toujours pas ton vecteur final 6*6+2. Pourquoi ton +2 (ca doit venir de moi, le lundi, j'ai toujours du mal à réfléchir)

    Sinon, je travaillerais plutôt avec un découpage sur le temps (ou chg_V_at_t) plutôt que sur les données. C'est pour ca que je préfère utiliser interp1..;

    Voici mon script modifié. J'obtiens un vecteur résultat de 36 lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    extrema_V=[0 10 120 60 80 80 80];             %vecteur des extremas locaux
    chg_V_at_t=[0 5 15 20 22 26 30];          %valeurs du temps pour lesquelles on atteint les extremas locaux.
     
    A=[];
     
    for i=1:length(chg_V_at_t)-1
    t=linspace(chg_V_at_t(i),chg_V_at_t(i+1),6);
    A=[A interp1(chg_V_at_t(i:i+1),extrema_V(i:i+1),t)];
    end
    edit : le script peut être écrit en 1 ligne... remplacer t par son expression dans le calcul de A.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Merci Merel pour ton script, c'est ce que je voulais obtenir. Par contre j'essaie de réutiliser les valeurs qui composent V (qui représente la vitesse) pour obtenir la position X et j'obtiens que des zeros dans mon vecteur X.. voici le code complet
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    %---------- CREATION DU VECTEUR VITESSE------------------------------------
     
     
    extrema_V=[0 10 120 60 80 80 80];    %vecteur des extremas locaux
    chg_V_at_t=[0 5 15 20 22 26 30];     %valeurs du temps pour lesquelles on 
                                         %atteint les extremas locaux.
     
    V=[]; % vecteur vitesse
     
    for i=1:length(chg_V_at_t)-1
    t=linspace(chg_V_at_t(i),chg_V_at_t(i+1),10);
    V=[V interp1(chg_V_at_t(i:i+1),extrema_V(i:i+1),t)];    
    end
    D=size(V);
    %--------- CREATION DU VECTEUR TEMPS --------------------------------------
     
    % T=0:0.1:input('durée de la simulation en s=');
    % dt=input('pas de calcul de la simulation en s=');
    T=0:0.1:30;
    dt=0.1;
     
    %-------- VECTEUR POSITION ------------------------------------------------
     
    X=zeros(D(1,2),1);       %remise à zéro du vecteur position
     
    for i=2:size(V)
        X(i,1)=(V(i)-V(i-1))*dt;      
    end
     
    X(1)=0;     %condition initiale sur la position
    Il n'y a pas de message d'erreur, mais c'est complètement incohérent.
    Merci à vous!

  7. #7
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Plutôt que de faire une boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i=2:size(V)
        X(i,1)=(V(i)-V(i-1))*dt;      
    end
    Tu devrais utiliser la fonction DIFF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X(:,1) = diff(V) * dt;
    Par contre ca ne devrait pas résoudre ton problème de 0. Es-tu sur que ton vecteur V est correct?

    EDIT: De plus, il faudrait utiliser LENGTH ou NUMEL au lieu de SIZE pour faire ta boucle
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Ce qui est bizarre c'est que tu ne rentres pas dans la boucle for

    essaye ca, ca marche chez moi

    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
    22
     
    extrema_V=[0 10 120 60 80 80 80];   
    chg_V_at_t=[0 5 15 20 22 26 30];    
     
     
    V=[]; 
     
    for i=1:length(chg_V_at_t)-1
    V=[V interp1(chg_V_at_t(i:i+1),extrema_V(i:i+1),linspace(chg_V_at_t(i),chg_V_at_t(i+1),10))];    
    end
     
    [l,c]=size(V);
     
    x=zeros(c,1);      
    x(1)=0; 
    dt=0.1;
     
    for j=2:c
     
        x(j)=(V(j)-V(j-1))*dt;
     
    end

    Le problème venait bien de la borne finale de la boucle. Size(V) renvoie deux valeurs. Il faut donc soit utiliser length ou numel comme le suggère duf soit passer par une variable intermédiaire.

  9. #9
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par Merel Voir le message
    Le problème venait bien de la borne finale de la boucle. Size(V) renvoie deux valeurs. Il faut donc soit utiliser length ou numel comme le suggère duf soit passer par une variable intermédiaire.
    Ou dans ce cas précis ne pas utiliser de boucle puisqu'elle ne semble pas indispensable...
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 76
    Points : 54
    Points
    54
    Par défaut
    Merci pour votre aide et pour ce que j'y apprends !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer web service en utilisant les fichiers .wsdl
    Par jhooles dans le forum Services Web
    Réponses: 1
    Dernier message: 05/08/2010, 09h21
  2. Réponses: 12
    Dernier message: 05/03/2010, 14h10
  3. Générer un vecteur binaire 8bits aléatoire
    Par mirva dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/12/2008, 16h47
  4. Réponses: 2
    Dernier message: 15/05/2008, 22h26

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