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 :

[griddata] Interpolation, message d'erreur


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut [griddata] Interpolation, message d'erreur
    Bonjour a tous,

    Voila j'essaye (tant bien que mal^^) de faire une interpolation.
    On m'a recommandé de le faire avec "griddata" mais j'obtient des message d'erreurs que je ne comprend pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    ??? Error using ==> delaunayn at 55
    Data containing Inf or NaN cannot be tessellated.
     
    Error in ==> griddata>linear at 140
        tri = delaunayn([x y]);
     
    Error in ==> griddata at 109
        zi = linear(x,y,z,xi,yi,opt);
     
    Error in ==> test1 at 34
          f1=griddata(Theta0(:),Imp0(:),f(:),Theta,Imp,'linear');
    Voila si on pouvais m'expliquer un peu.
    Theta0, Imp0,Theta et Imp sont des matrice crée a partir de meshgrid.
    f est aussi une matrice.

    merci

  2. #2
    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,

    le message est relativement explicite : la traingulation ne peut pas être calculé si ton set de données contient des valeurs Inf (infini) ou NaN (Not a Number).

    Donc apparemment, une de tes données en contient. Pour savoir laquelle, tu peux faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A = find(~isfinite(Theta0));
    Si A contient des valeurs, c'est que Theta0 contient soit des NaN, soit des Inf. Fais cela pour chacune de tes variables.

    La deuxième étape est de savoir comment ces valeurs particulières sont apparues : quel calcul les a généré? Est-ce normal?
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci,

    je viens d'essayer ta commande pour verifier mes variables.

    le probleme c'est que mes infinis provienne de ma fonction a la sortie de l'interp :s

    Est il possible que j'ai ce genre de message si l'interpolation vas chercher des points en dehors de ma grille d'origine ?
    Car si le probléme est la je pourrais peut etre y remedier...

  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
    Citation Envoyé par Cjordan Voir le message
    le probleme c'est que mes infinis provienne de ma fonction a la sortie de l'interp :s
    Je ne comprends pas bien : comment as-tu accès à la sortie de l'interpolation si celle-ci provoque une erreur?

    Sinon, si tu possède une version de matlab suffisamment récente, tu peux essayer TriScatteredInterp comme c'est conseillé dans la doc de griddata.
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Moi non plus je ne comprend pas bien ^^
    En fait c'est une boucle, et apparament, il arrive a la faire tourner une fois avant que ça bug

    Je met un morceau de mon programme, si ça permet d'etre plus clair

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for i=1:100
    M=trapz(imp,trapz(theta,cos(Theta0).*f)); %calcul des intégrales
    M2=trapz(imp,trapz(theta,sin(Theta0).*f));
    DV=sin(Theta0).*M - cos(Theta0).*M2;   % calcul de la dérivée du potentiel
          Theta0= Theta0 + deltat.*Imp0;
          Imp0= Imp0 - deltat.*DV;
           A = find(~isfinite(f)) 
          f1=griddata(Theta0(:),Imp0(:),f(:),Theta,Imp,'linear');
          f=f1;
        % A = find(~isfinite(f)) 
    end
    voila, alors pour bien définir le tout :
    f est une matrice
    imp,theta sont des linspace,
    Imp,Theta, Imp0 et Theta0 sont des matrice obtenue par meshgrid.
    J'ai aussi définit f en condition initiale en dehors de ma boucle.
    Bon je veut pas qu'on résoud mon probléme, mais si déja vous voyez un truc génant ça pourrais m'aider

    Remarque importante: A me retourne une matrice vide si je met en commentaire la ligne f1=.... et f=f1!
    A me retourne des nombre si j'enleve les commentaire.
    Ce qui veut dire que mon programme fait bien un tour de ma boucle !

  6. #6
    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
    Tu es sur que lorsque tu initialises f en dehors de ta boucle, f ne contient pas de NaN ou de Inf?

    Si oui, a priori, c'est donc bien griddata qui génère des NaN. Dans la doc de griddata, c'est précisé que cela peut arriver :
    Occasionally, griddata might return points on or very near the convex hull of the data as NaNs. This is because roundoff in the computations sometimes makes it difficult to determine if a point near the boundary is in the convex hull.
    Il faudrait analyser les données qui génère ces NaN : regarder ou ils se trouvent, essayer de comprendre pourquoi griddata les a placé là, éventuellement établir des règles pour les remplacer par des valeurs réelles... Mais sans toutes les données, cela va être difficile de pouvoir te donner une réponse précise...
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Ok merci.
    Oui je suis sur que f est correctement initialisé, je les représenté sur un grahique.

    Sinon, je vais voir si en étendant ma grille de départ je peut régler le souci (peut etre que comme j'ai dit, l'interpolation vas chercher des points qui en dehors de ma grille initiale).

    Merci en tout cas pour la commande de test infinie, ça pourras servir ^^

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    rebonjour,

    "return points on or very near the convex hull of the data" lol ça m'avance pas trop ^^

    Bon j'ai essayé le "TriScatteredInterp", ça me dit fonction introuvable...

    J'ai réessayé avec le interp2, et en faisant un ptit truc que je maîtrise pas, j'ai obtenue une sortie de mémoire...

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    N=100;
    Deltatheta=pi/5;
    Deltap=1;
    theta=linspace(-2*pi,2*pi,N);
    imp=linspace(-3,3,N);
    [Theta Imp]=meshgrid(theta, imp);
    f=zeros(N);
    %//////////////////////////////////////////
     
    %conditions initiales/////////////
     
    f((3*N)/10:(7*N)/10,N/6:(5*N)/6)=60/(N*N);
    Theta0=Theta;
    Imp0=Imp;
     
    %/////////////////////////////////
     
    %surface(f)
    deltat=0.01;
     
    %iteration sur le temps/////////////
     
    for i=1:100
    M=trapz(imp,trapz(theta,cos(Theta0).*f)); %calcul des intégrales
    M2=trapz(imp,trapz(theta,sin(Theta0).*f));
    DV=sin(Theta0).*M - cos(Theta0).*M2;   % calcul de la dérivée du potentiel
     
          Theta0= Theta0 + deltat.*Imp0;
          Imp0= Imp0 - deltat.*DV;
     
          f1=griddata(Theta0(:),Imp0(:),f(:),Theta,Imp,'linear');
          f=f1;
    end
     
    %//////////////////////////////////////
     
     
    surface(f)
    Voici mon code en entier, la je comprend vraiment pas comment régler mon probleme...
    Si vous trouvez dedans quelque chose de bizarre, je veut bien qu'on m'aide ^^

  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
    C'est normal que tu interpoles f sur Theta,Imp qui sont tes données initiales?

    Après, ça e m'étonne pas trop que des NaN soient générées vu la tête de ta surface initiale...

    Une solution pour supprimer les NaN (qui sont a priori générés sur les bords de ton domaine) serait de faire :


    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
    32
    33
    34
    35
    36
    N=100;
    Deltatheta=pi/5;
    Deltap=1;
    theta=linspace(-2*pi,2*pi,N);
    imp=linspace(-3,3,N);
    [Theta Imp]=meshgrid(theta, imp);
    f=zeros(N);
    %//////////////////////////////////////////
    
    %conditions initiales/////////////
    
    f((3*N)/10:(7*N)/10,N/6:(5*N)/6)=60/(N*N);
    Theta0=Theta;
    Imp0=Imp;
    
    %/////////////////////////////////
    
    %surface(f)
    deltat=0.01;
    
    %iteration sur le temps/////////////
    
    for i=1:100
    M=trapz(imp,trapz(theta,cos(Theta0).*f)); %calcul des intégrales
    M2=trapz(imp,trapz(theta,sin(Theta0).*f));
    DV=sin(Theta0).*M - cos(Theta0).*M2;   % calcul de la dérivée du potentiel
    
          Theta0= Theta0 + deltat.*Imp0;
          Imp0= Imp0 - deltat.*DV;
        
          f1=griddata(Theta0(:),Imp0(:),f(:),Theta,Imp,'linear');
          f=f1;
          f(isnan(f)) = 0;
    end
    
    %//////////////////////////////////////
    Mais après, je ne comprends pas trop ce que tu cherches à faire : tu calcules des nouveaux points de on domaine, mais l'interpolation se fait toujours sur les mêmes points initiaux??
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci, le programme tourne de cette maniére (meme si c'est assez long...).

    Ben ce que j'ai compris, je définit une grille initiale (Theta, Imp), dessus je "fabrique" ma fonction de densité initiale f.
    Je fais évolué ma grille initiale avec mes équations, et j'interpole pour remettre mes nouveaux points sur ma grille initiale (f est constante au cours du temps, enfin son intégrale).

    Pour l'instant c'est pas top mais je peut peut etre réglé quelques trucs...

Discussions similaires

  1. [TSocket] Message d'erreur
    Par rgz dans le forum Web & réseau
    Réponses: 6
    Dernier message: 04/07/2003, 09h16
  2. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  3. Réponses: 4
    Dernier message: 04/03/2003, 01h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 14h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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