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 interp1 "The values of X should be distinct"


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut Problème interp1 "The values of X should be distinct"
    Bonjour j'ai ce message d'erreur lorsque je tente de faire une interpolation.
    ??? Error using ==> interp1 at 261
    The values of X should be distinct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1:z 
     d2(i)=interp1(time,d1,time2(i));
     P2(i)=interp1(d1,P,d2(i));
    end
    time, d1 et P sont des vecteurs issus de mes données, comportant 7580 valeurs.
    time2 comporte les mêmes valeurs que time mais avec un pas plus petit pour plus de précision.
    d2 est le vecteur d1 interpolé pour qu'il fasse la même longueur que time 2 (dimension > 40 000 valeurs).
    Lorsque j'essaye de déterminer P2 par interpolation, j'obtiens le message d'erreur ci dessus.

    Je pense que c'est dû au vecteur d1. En effet celui ci comporte plusieurs fois la même valeur à des pas de temps différents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    294
    294
    294
    295
    295
    295
    295
    295
    295
    296
    296
    par exemple.

    Est ce que l'erreur vient d'ici (à noter que les valeurs de d1 sont toujours croissantes).
    Je ne peux pas faire , car dans ce cas d1 et P n'aurait pas la même longueur. Je ne peux pas non plus recalculer P avec une boucle car il me manquerait des valeurs.

    Comment pourrais-je faire pour réussir mon interpolation ?

    Je vous remercie

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Tout d'abord une première remarque, il me semble que tu peux éviter la boucle sur i en faisant directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    d2=interp1(time,d1,time2);
    P2=interp1(d1,P,d2);
    Ensuite le fond du problème, c'est effectivement que d1 ne prend pas de valeurs uniques et qu'il ne sait donc pas comment interpoler.

    Cela dit vu la construction que tu fais, tu devrais pouvoir contourner le problème:
    - Assure toi que pour deux valeurs identiques de d1, P prends la même valeur. (Si ce n'est pas le cas, ton problème semble mal posé et il faut que tu nous expliques ce que représente d1 et P et comment se fait il que tu ne connaisses pas les dates auxquelles correspondent ces valeur)
    - Filtre par valeurs uniques avant la 2nde interpolation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    d2=interp1(time,d1,time2);
    [b,m,n] = unique(d1);
    P2=interp1(d1(m),P(m),d2);
    Une seconde solution consiste à rendre les dates distinctes (arbitrairement, selon leur ordre dans les matrices, voici un exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    d2=interp1(time,d1,time2);
    dt= diff(d1);
    dt_step= min(dt(dt>0));
    N= length(d1);
    tie_order= (dt_step/N):(dt_step/N):dt_step;
    d1_untied= d1+ order;
    P2=interp1(d1_untied,P(m),d2);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Merci VV33D, j'ai essayé la 1ere méthode, j'obtiens des résultats mais il ne sont pas cohérents.
    Pour les valeurs issus des données j'obtiens. (d1 et d2 représentent des distances, et P et P2 représentent l'effort subit par mon véhicule à chaque distance). P est différent pour une même distance dans mes données car il dépend d'autres paramètres qui eux évolue pour une même distance (c'est juste que la précision de la distance n'est pas assez précise, les valeurs sont arrondies à l'unité)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    d1	P
    0	1219.544105
    0	942.9848732
    1	597.9365095
    1	463.5609502
    1	439.0669896
    1	441.6812616
    2	443.8598216
    2	236.6611456
    2	102.7405776
    2	-33.79426237
    Quand pour ma simulation j'obtiens :
    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
    d2	P2
    0	942.9848732
    0	942.9848732
    0	942.9848732
    0.2	842.7241509
    0.6	642.2027063
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1	441.6812616
    1.2	346.5861568
    1.6	156.3959472
    2	-33.79426237
    2	-33.79426237
    2	-33.79426237
    Il associe tout le temps la dernière valeur de chaque distance à P2. De plus mon interpolation de d2 semble fausse également

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,
    Citation Envoyé par nilsmatlab Voir le message
    P est différent pour une même distance dans mes données car il dépend d'autres paramètres qui eux évolue pour une même distance (c'est juste que la précision de la distance n'est pas assez précise, les valeurs sont arrondies à l'unité)
    et tu n'as pas accès aux valeurs non arrondies? Car tout tes problèmes viennent de là...

    Par exemple, tu dis que l'interpolation de d2 est fausse :
    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
    d2
    0	
    0
    0	
    0.2
    0.6
    1	
    1	
    1	
    1	
    1
    1	
    1	
    1	
    1.2	
    1.6	
    2	
    2
    2
    Quelles valeurs aurais-tu souhaité obtenir?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Je ne comprends pas pourquoi tu ne fais pas juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    P2=interp1(d1,P,time2)
    Vu que tu as l'air de dire que les valeurs P correspondent aux "temps" d1

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par magelan Voir le message
    Bonjour,

    et tu n'as pas accès aux valeurs non arrondies? Car tout tes problèmes viennent de là...

    Quelles valeurs aurais-tu souhaité obtenir?
    Non, je récupère les valeurs comme ça et je ne peux pas les modifier.
    Avoir des valeurs qui augmentent progressivement. Du coup j'ai recréer le vecteur d2 avec un pas que j'ai fixé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d2 = [d1(1):0.15:d1(end)];
    , mais ça fait vraiment "bidouille", parce que le 0.15 ne provient de nulle part

    Je ne comprends pas pourquoi tu ne fais pas juste
    Code :Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    P2=interp1(d1,P,time2)
    C'est ce que j'ai fait en tout premier, et c'est là que Matlab m'a sorti l'erreur qui est dû au fait que d1 comporte plusieurs valeurs identiques...

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par nilsmatlab Voir le message
    Du coup j'ai recréer le vecteur d2 avec un pas que j'ai fixé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d2 = [d1(1):0.15:d1(end)];
    , mais ça fait vraiment "bidouille", parce que le 0.15 ne provient de nulle part
    En même temps tu fais une interpolation (approximation) sur des données très approximatives... je vois pas bien ce que tu peux faire avec ces données
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Mais il n'existe pas de solutions pour faire une interpolation lorsqu'il y a plusieurs x identiques ?

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Un exemple indépendant de tes données : voici ce que interp1 "voit" :

    des points qui ont la même abscisse mais des ordonnées différentes... comment veux-tu qu'il interpole quoi que ce soit? Quel règle il dois appliquer? Comment ferais-tu toi à la main pour interpoler? Il n'existe pas de méthodes générales dans ce cas, donc avec les infos que tu nous as donné, non l'interpolation n'est pas possible.
    Images attachées Images attachées  
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Je vous remercie, je vais essayer de contourner le problème, car je ne dispose pas de plus de données également.

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/06/2008, 20h16
  2. Réponses: 3
    Dernier message: 17/07/2007, 15h53
  3. Problème Cast avec NULL values
    Par WwiloO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2005, 10h49
  4. Cannot insert the value NULL into column ...
    Par nmerydem dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/11/2004, 10h28

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