Interpoler Matlab

Résolu/Fermé
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 - 26 mars 2009 à 20:45
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 - 29 mars 2009 à 03:59
Bonjour,

J'aimerai interpoler, deux vecteurs, mais le problème c'est que si ces deux vecteurs comportent un même élément, la fonction interp1 ne fonctionne plus, voici un exemple ;

A=[1
2
3
4
0
3
3];
B=[2
6
8
8
4
1
5];
xi=0:0.8:4;
yi=interp1(A,B,xi)

qui peut m'aider ?

merci d'avance,

5 réponses

Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
29 mars 2009 à 03:59
Bonsoir

Il y a toujours des incohérences dans ton message. Tu dis que tu veux tracer X en fonction de Y et que Matlab n'accepte pas que X contienne des valeurs identiques pour l'interpolation. Ce n'est pas le cas, le vecteur image peut très bien avoir plusieurs valeurs identiques, dans ton message il s'agit de X, notation peu habituelle soit dit en passant, par convention, on choisit habituellement de noter Y le vecteur image ;-)

De plus, cette interpolation :
A(isnan(A)) = interp1(find(~isnan(A)), A(~isnan(A)), find(isnan(A)), 'spline');
N'est ni plus ni moins la même chose que cela lorsque A n'est pas patché avec des NaN :
A=interp1((1:numel(A)),A,(1:numel(B)),'spline')
Et enfin, si après cela tu veux interpoler de B en fonction de A, deux cas se présentent si A contient des valeurs identiques :

1) Si les valeurs de B correspondant aux indices pour lesquelles les valeurs de A sont identiques ne vérifient pas la même propriété, B ne représente pas une fonction de A. Vouloir faire une interpolation est un non-sens mathématique.

2) Si les valeurs de B correspondant aux indices pour lesquelles les valeurs de A sont identiques vérifient la même propriété, on peut effectivement considérer que B est une fonction de A. Et dans ce cas, il suffit d'enlever les valeurs répétitives.
Vouloir interpoler une fonction qui par exemple vérifie f(1)=4 en répétant moult fois à Matlab que f(1)=4, d'une part, cela ne sert à rien, d'autre part Matlab n'en veut pas.
Alors, une fois que A est à la même taille que B, si on veut interpoler B fonction de A, on fait quelque chose de ce genre :
nb_points=100;
xi=linspace(min(A),max(A),nb_points);
[Au indices]=unique(A);
yi=interp1(Au,B(indices),xi);
Il n'y a donc que 3 solutions possibles pour le problème que tu énonces. Soit tu le formules mal et dans ce cas je ne peux rien faire, soit c'est un problème non soluble (cas 1), soit il est soluble et la solution est d'interpoler en enlevant les valeurs répétitives.

Bonne nuit
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
26 mars 2009 à 21:40
Bonsoir mon ami !

Je ne comprends pas très bien ce que tu cherches à faire.
Cela est tout à fait normal que tu ne puisses pas interpoler de la façon dont tu veux le faire si le vecteur X comporte des valeurs identiques.
En quelque sorte, c'est comme si tu disposais des valeurs d'une fonction f:x→y définie en un certain nombre de points x1, x2, x3, ..., xn dont les valeurs en ces points sont f(x1)=y1, f(x2)=y2, f(x3)=y3, ..., f(xn)=yn et que tu cherches à interpoler (linéairement, à l'aide de spline etc...) cette fonction f sur un ensemble de points plus important.
Le vecteur des abscisses x ne peut contenir deux mêmes valeurs xi et xj qu'à la seule condition que f(xi)=f(xj) c'est-à-dire yi=yj. Or ce n'est pas le cas dans l'exemple que tu nous montres.
Par contre, si tes vecteurs x et y vérifie la propriété que je viens d'écrire, il te suffit d'utiliser la fonction unique (help unique ou doc unique pour plus d'informations) avant d'utiliser interp1 pour ne pas avoir de valeurs identiques dans le vecteur x (il faudrait ensuite raccourcir aussi le vecteur y en enlevant les valeurs de même indice que celles enlevées dans le vecteur x pour le faire correspondre au nouveau vecteur x).

Je te souhaite une bien bonne nuit !
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
27 mars 2009 à 14:10
Bonjour Fee Fay,

j'espère que t'as passé d'agréablesmoments au cours de tes vacances.

Pour revenir à ma question en fait j'ai un vecteur X formé de 1146 valeurs et un autre Y de 98 valeurs, et j'aimerai avoir pour les deux vecteurs 1146 valeurs, le seul problème restant c'est que le vecteur X comporte plusieurs valeurs qui sont les mêmes et dans ce cas et c'est la même chose pour Y et je ne peux pas enlever les valeurs qui se dédoublent, est ce qu'il y a une solution pour interpoler avec Matlab, si on désire garder ces valeurs ?

merci d'avance,

fou_cinglé
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
27 mars 2009 à 15:53
Je n'étais pas en vacances !

Je suis désolé fou_cinglé mais ta demande n'a pas réellement de sens, enfin... peut-être est-ce juste ta façon de l'expliquer qui la rend si bizarre :-D

Comme je l'ai écrit au message 1, pour utiliser la fonction interp1, les valeurs du vecteur x doivent être distinctes et si elles ne le sont pas mais que y vérifie les conditions que j'ai énoncées dans mon message, elles ne sont que redondances. Et si tu ne les enlèves pas, Matlab te donnera la même erreur quand tu essaieras d'utiliser la fonction interp1.

De plus, x et y doivent être de même taille pour utiliser la fonction interp1, ce qui est tout à fait logique sinon comment savoir quelle valeur du vecteur x correspond à quelle valeur du vecteur y ?
Mais ce n'est pas le cas dans le problème que tu m'exposes.

Essaie éventuellement de m'expliquer en termes mathématiques précis ce que tu cherches à faire ;-)

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 mars 2009 à 17:40
Bonjour,

je vais essayer d'expliquer en espérant que je réussirai.

En fait mon vecteur X est formé de 1146 valeurs, certaines sont les memes, et je ne peux rien faire, vu que ce sont des valeurs réelles expérimentales, par suite je ne peux pas les enlever, maitenant pour l'autre vecteur Y formé de 98 valeurs, j'ajoute des NaN pour obtenir le meme nombre de valeurs, et puis j'interpole en utilisant la fonction spline, mais le problème c'est que matlab n'accepte pas le fait que dans le vecteur X il y a des valeurs qui se répétent, et par suite il n'exécute pas le code d'interpolation.

tu vas me dire, mais les NaN se répétent aussi, mais là je n'ai pas un problème, vu que j'ai trouvé une fonction qui peut interpoler malgré la présence des NaN.

voici un exemple,

A=[1
2
3
4
0
NaN
NaN];
B=[2
6
8
8
4
1
5];
xi=0:0.8:4;
A(isnan(A)) = interp1(find(~isnan(A)), A(~isnan(A)), find(isnan(A)), 'spline');
yi=interp1(A,B,xi)

et ce code réussit par exemple, mais si jamais dans A, je mets deux valeurs qui se répétent, alors le code ne s'exécute plus.

je ne sais pas si c'est plus clair, maitenant.

finalement mon but étant de tracer un graphe de ce vecteur X formé de 1146 valeurs en fonction du vecteur Y formé de 98 valeurs.

je ne sais pas si c'est clair,

merci d'avance,

fou_cinglé