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

Mathématiques Discussion :

Splines vs polyfit


Sujet :

Mathématiques

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut Splines vs polyfit
    Salut tous,

    je viens d'avoir un résultat assez étonnant avec mon programme et j'aimerai savoir si vous pouvez m'expliquer d'où cela vient et comme le résoudre.

    J'ai un fichier de données (cf. PJ) et j'aimerai interpoler cet courbe par un polynome afin d'avoir quelque chose de plus lisse.

    j'ai fais deux interpolations :
    - polynome de degrès 2
    - spline

    Avec le polynome de degrès 2 l'interpolation n'est pas top (la courbe interpolée va dans des valeurs négatives alors qu'aucun de mes points n'est négatif) ce qui me fait planter la suite de mon programme car il n'accepte pas des nombres negatifs.

    Je suis donc passé à l'interpolation spline mais là j'ai été étonné car j'ai exactement le même résultat !
    => pourriez vous m'expliquer comme cela se fait et comment contourner ce problème ?

    je vous remercie d'avance.

    ps: voici mon programme
    Code MATLAB : 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
     
    clear all; close all; clc;
    donnees=load('data.txt');
    %------------
    Xi=donnees(1);    Xc_im1=donnees(2);   Xc_i=donnees(3);
    Xc_ip1=donnees(4);Wc_im1=donnees(5);   Wc_i=donnees(6);
    Wc_ip1=donnees(7);
    %------------
    figure (1)
    hold on
    plot([Xc_im1,Xc_i,Xc_ip1],[Wc_im1,Wc_i,Wc_ip1],'linewidth',3)
    %------------
    p=polyfit([Xc_im1,Xc_i,Xc_ip1],[Wc_im1,Wc_i,Wc_ip1],2);
    %------------
    figure (1)
    hold on
    plot(linspace(Xc_im1,Xc_ip1,100),polyval(p,linspace(Xc_im1,Xc_ip1,100)),'m')
    plot(linspace(Xc_im1,Xc_ip1,100),spline([Xc_im1,Xc_i,Xc_ip1],[Wc_im1,Wc_i,Wc_ip1],linspace(Xc_im1,Xc_ip1,100)),'Or')

  2. #2
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Salut,

    Le problème vient du fait que tu cherches à interpoler 3 points avec un spline cubique.
    Il te faut au moins 4 points pour interpoler avec un polynôme de degré 3 (et obtenir un résultat différent du degré 2).
    Regarde ici : http://fr.wikipedia.org/wiki/Interpo...num%C3%A9rique

    Expliqué avec les mains :
    - pour une interpolation linéaire (degré 1) il te faut 2 points mini (soit 1 de plus que le degré)
    - et ça se généralise à tous les degrés

    Ici tu as 3 points, un polynôme de degré 2 suffit d'où ton résultat je pense.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'autant plus qu'un spline assure a continuité de la dérivée seconde à chaque point.

    Vu qu'il y a 3 points, les 2 points extrêmes n'ont aucun point avec lequel calculer une continuité, et donc moduler la courbe de degré 2.. C'est donc strictement équivalent à un polynôme..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    => je vois ce que vous voulais dire avec la dérivée seconde nulle sur les bords.

    mince alors, je ne sais plus comment interpoler donc ce type de courbe de façon efficace

    => merci en tous cas tous pour vos réponses

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    => je vois ce que vous voulais dire avec la dérivée seconde nulle sur les bords.

    mince alors, je ne sais plus comment interpoler donc ce type de courbe de façon efficace

    => merci en tous cas tous pour vos réponses
    ben, faudrait plus que 3 points... A moins que tu souhaites une approximation et non pas une interpolation...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    A moins que tu souhaites une approximation et non pas une interpolation...
    que veut tu dire par là ? ça pourrait me débloquer

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben une interpolation, tu passes par les points..

    Une approximation tu n'es pas obligé de passer par les points.

    Si tu as 3 points, tu peux par exemple faire une cubique qui passe par les 2 etrémités et passe "au plus près" du 3ième, au milieu.

    Tu peux aussi faire une cubique qui passe "au plus près en moyenne" des 3 points.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Après, je sais pas sur quelle application tu travailles mais si tu as juste 3 points, peut-être que tu n'as pas besoin de créer de grandes variations "factices" et sans aucune réalité physique entre ces points.
    Si une approximation linéaire ne te convient pas à cause de la non dérivabilité en certains points par exemple, tu peux aussi juste lisser la courbe, sans chercher à interpoler.

    Pour te donner un exemple, j'ai eu un jour le même problème que toi et il était important que je conserve la "forme globale" de la courbe. J'ai relié chaque point par une droite affine et j'ai convolué avec une gaussienne (fonction "conv" avec 'same' passé en argument). Ca lisse la courbe (et ça la fera pas passer dans les négatifs). Après, comme le disais Souviron34, ça dépend si tu veux garder précisément les valeurs de tes 3 points ou si tu acceptes de les approcher seulement.

    Enfin bref, tout ça pour dire que, selon les applications, l'interpolation n'est pas toujours LA solution miracle, il y a parfois beaucoup plus simple.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Merci tous pour vos info intéressantes.

    => je vais rester sur l'interpolation linéaire du coup

    => pas mal le truc de la convolution, je ne connaissez pas ...

    tu peux me montrer à quoi ressemble le bout de code en matlab ?
    (et si on veut programmer ceci soit même c'est compliqué ?)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ben une interpolation, tu passes par les points..
    oui, OK.

    Citation Envoyé par souviron34 Voir le message
    Une approximation tu n'es pas obligé de passer par les points.
    c'est donc un fit moindre carré ?

    Citation Envoyé par souviron34 Voir le message
    Si tu as 3 points, tu peux par exemple faire une cubique qui passe par les 2 etrémités et passe "au plus près" du 3ième, au milieu.
    => comment fait on ceci ? je sais faire une cubique de type moindre carré mais que si le nombre de points est supérieur ou égal à 4 ... ?

    Citation Envoyé par souviron34 Voir le message
    Tu peux aussi faire une cubique qui passe "au plus près en moyenne" des 3 points.
    même remarque que précédente...

  11. #11
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Tu peux regarder ce bout de code (j'ai pas essayé mais j'ai mis des valeurs numériques pour qu'il puisse tourner normalement pour que tu puisses voir le résultat). Si tu changes la valeur de sigma, tu devrais aussi oberver des différences sur le résultat obtenu.
    J'aurais pu faire un exemple plus simple, mais par manque de temps, j'ai repris une application de ce principe déjà codée pour un projet.

    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
     
    chp_lune = zeros(1,12060); % Initialisation
    chp_lune(1:3015) = 3;        % Ciel
    chp_lune(3016:9044-floor(6029*0.14)) = 180;   % Lune non eclairee
    chp_lune(9044-floor(6029*0.14)+1:9044) = 300; % Lune eclairee
    chp_lune(9045:12060) = 3;  % Ciel
     
    figure
    plot(1:12060,chp_lune)
    xlabel('Espaces de travail')
    ylabel('Température (K)')
    title('Profil de température brut de la scène')
     
    % Convolution avec la gaussienne de l'antenne pour avoir le profil du champ
    % electrique
    sigma = (2/60)*pi/180; % sigma pour une gaussienne de "largeur" 4' = 2*sigma
    alph_minProfil = ( 291-12060/2*0.005:0.005:291+(12060/2-1)*0.005);
    alph_radProfil = alph_minProfil/60*pi/180;
     
    gauss_refProfil = 1/(sqrt(2*pi)*sigma)*exp(-(alph_radProfil-0.0846*ones(1,12060)).*(alph_radProfil-0.0846*ones(1,12060))/(2*sigma^2)); % Definition de la gaussienne avec laquelle on convolue
     
    figure
    plot(1:12060,gauss_refProfil)
    xlabel('Espaces de travail (1 wksp ~ 0.005'')')
    ylabel('Amplitude')
    title('Gaussienne de largeur 2''')
     
    profil_lune = conv(chp_lune,gauss_refProfil,'same'); % Convolution entre le profil de base et la gaussienne
    maxi = max(profil_lune); % Recherche du maximum
    normalisationfactor = 300/maxi; % Calcul du facteur de normalisation pour conserver des valeurs de temperature correctes
    profil_lune2 = profil_lune*normalisationfactor; % Normalisation
     
    figure
    plot(1:12060,profil_lune2)
    xlabel('Espaces de travail')
    ylabel('Temperature de la scene')
    title('Profil de temperature de la scene observee')
    C'est simple et rapide à coder !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup !!!

    => juste un petit beug dans le programme je pense :
    ??? Error using ==> conv
    Too many input arguments.


    => ceci apparait à la ligne 27 avec conv...

  13. #13
    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 programme fonctionne. Apparemment tu as donné le nom "conv" à une fonction alors que c'est déjà le nom d'une fonction matlab. Pour trouver le fichier en question :
    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.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par magelan Voir le message
    Bonjour
    salut Magelan

    Citation Envoyé par magelan Voir le message
    le programme fonctionne. Apparemment tu as donné le nom "conv" à une fonction alors que c'est déjà le nom d'une fonction matlab.
    je crois qu'en fait ici l'auteur du programme cherche bien à utiliser la fonction "conv" de matlab mais c'est cette fonction qui dit quelle à trop d'arguments

    Citation Envoyé par magelan Voir le message
    Pour trouver le fichier en question :
    merci pour l'info

  15. #15
    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
    Encore une fois le programme d'eskapp fonctionne, conv a le bon nombre d'arguments.

    Donc 21did21, le problème vient de chez toi, as-tu modifié le programme? As-tu essayé le which -all conv? que renvoie-t-il?
    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.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    d'accord. Merci Magelan, voici ce que me renvoi la commande que tu m'as dis :

    C:\Program Files\MATLAB\R2008a\toolbox\matlab\datafun\conv.m
    C:\Program Files\MATLAB\R2008a\toolbox\comm\comm\@gf\conv.m % gf method

  17. #17
    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
    Autant pour moi, c'est ta version de conv qui n'accepte pas l'option 'same' en 3ème paramètre et qui n'a donc que 2 paramètres. Je pensais que cette option était disponible depuis longtemps.
    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.

  18. #18
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Salut,

    Je pensais aussi que 'same' existait depuis longtemps.
    Tu peux exécuter le programme sans l'argument same. Le vecteur rendu seras juste 2 fois plus long.
    Mais il n'y a qu'une ligne à ajouter pour revenir au résultat que donnerait conv avec l'argument 'same'. En fait cet argument permet de récupérer uniquement la partie centrale de la convolution, un vecteur de même dimension que les vecteur que tu convolues

    Après, avec ou sans cet argument, l'idée reste la même : une convolution par une gaussienne, ça lisse une courbe.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup pour votre aide
    Citation Envoyé par eskapp Voir le message
    Mais il n'y a qu'une ligne à ajouter pour revenir au résultat que donnerait conv avec l'argument 'same'. En fait cet argument permet de récupérer uniquement la partie centrale de la convolution, un vecteur de même dimension que les vecteur que tu convolues
    pourrais tu me dire quelle ligne il faut ajouter je vais tester les deux version et essayer de comprendre tout ceci (je ne suis pas vraiment familier des convolutions)
    => merci beaucoup
    Citation Envoyé par eskapp Voir le message
    Après, avec ou sans cet argument, l'idée reste la même : une convolution par une gaussienne, ça lisse une courbe.
    Oui, en effet, je viens de regarder le résultat est super !!!!
    même magnifique je dirais

    ps: mais il faut que je me penche sur la théorie car je ne comprends pas le fond du truc (qu'es ce exactement une convolution, pourquoi on peut faire ceci avec ...)

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

Discussions similaires

  1. utilisation fonction polyfit/polyval
    Par golzag dans le forum MATLAB
    Réponses: 2
    Dernier message: 20/03/2007, 13h27
  2. les fonctions splines
    Par princess dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/11/2006, 11h34
  3. continuité géométrique d'une spline
    Par chonos dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/01/2006, 17h20
  4. [GIMP] [Script-FU] Utilisation fonction gimp-curves-spline
    Par narmataru dans le forum Autres langages
    Réponses: 1
    Dernier message: 09/02/2005, 17h25
  5. [TP]Splines
    Par Eric Sigoillot dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 30/06/2002, 19h08

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