Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction spline cubique

trouver une fonction spline cubique

Sujet résolu
    12 mars 2020 à 1:19:03

    salam tout le monde

    svp j'ai une question pour python 2.7 est ce qu'il y a une fonction python spline cubique prête à utiliser facilement 

    merci

    • Partager sur Facebook
    • Partager sur Twitter
      12 mars 2020 à 10:57:17

      • Partager sur Facebook
      • Partager sur Twitter

      Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

        12 mars 2020 à 19:49:46

        merci Nozio pour le lien je l'ai utilisé et j'ai utilisé le code ci dessous et le graphe résultant de ce code celui qui est immédiatement dessous le code:

        """
        Created on Thu Mar 12 14:02:26 2020
        
        @author: pc
        """
        
        import numpy as np
        import matplotlib.pyplot as plt
        from scipy import interpolate
        
        #x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8)
        #y = np.sin(x)
        
        x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48]
        y1=[-150, -96, -95, -85, -74,-65, -55, -52, -46, -47]
        x=np.asarray(x1)
        y=np.asarray(y1)
        print(x, y)
        tck = interpolate.splrep(x, y, s=0) #si aucun lissage n'est souhaité s=0, une valeur de  doit être transmis aux routines.
        print('tck',tck)
        xnew = np.arange(-130, -20, 0.001)
        ynew = interpolate.splev(xnew, tck, der=0)
        
        plt.figure()
        
        plt.plot(x, y, 'x', xnew, ynew, 'b')
        plt.legend(['Linear', 'Cubic Spline', 'True'])
        plt.axis([-130, -10, -170, -10])
        plt.title('Cubic-spline interpolation')
        plt.show()

         La représentation ci dessus et le resultat du code au dessus mais moi je veux avoir comme la  representation graphique tout en bas utilisant spline cubique  qui donne une courbe fermée (graphe ci dessous) et je sais pas quoi ajouter dans le code pour l'avoir sachant que les deux graphes representent les meme x et y du code

        remarque importante : j'ai du ordonné les valeur de x selon un ordre croissant par ce que le code tournait pas et je sais pas si ça infectera le forme de la courbe pour avoir comme le dernier graphe

        merci pour l'aide 

        -
        Edité par youssef2_41 12 mars 2020 à 20:24:52

        • Partager sur Facebook
        • Partager sur Twitter
          12 mars 2020 à 20:11:04

          Alors il faut faire un tout petit peu différemment : en gros, tu as tracé une courbe \(x, y(x)\) (celle qui ne t'intéresse pas); tu dois "séparer" les variables \(x\) et \(y\) en introduisant un paramètre \(t\). Tu obtiens donc une courbe \(x(t), y(t)\) qui est donc fermée. Tu fais deux interpolations, une pour \(x\) et une pour \(y\) (contre une seule auparavant). Appelons \(x'(t), y'(t)\) la courbe interpolée, ben tu la traces :)
          • Partager sur Facebook
          • Partager sur Twitter

          Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

            12 mars 2020 à 22:59:38

            merci beaucoup  mais je serai reconnaissant si tu me fait juste un tout petit bout de code pour m'expliquer mieux et surtout le problème qui me dérange que je dois ordonner les valeur des x et y je crois 

            merci 

            • Partager sur Facebook
            • Partager sur Twitter
              13 mars 2020 à 0:03:28

              Bonjour.

              Après une petite recherche avec notre ami Gogol, un petit exemple de code pour le traçage d'une courbe paramétrée. Ouh là, me fait vieux, y'a un peu plus de vingt ans, on faisait ça sur des TI82 !!!

              from matplotlib.pylab import plot, cos, sin, pi, arange
              T = arange(0,2*pi,0.01)
              X = cos(T)*(1-cos(T))
              Y = sin(T)*(1-cos(T))
              plot(X,Y)

              Plus qu'à adapter à ton cas de figure.

              • Partager sur Facebook
              • Partager sur Twitter

              PB68

                13 mars 2020 à 2:06:55

                nozio merci pour l'exemple mais je crois que il ne peut pas répondre à ma question moi j'ai deux liste c'est tout et x et y dans mon cas sont des valeur aléatoire donc aucune fonction pourrait les relier avec un autre paramètre sauf qu'il y a un liste t =[0.0, 0.1, .....,0.9] qui sont relié a x et y donc je sais pas comment adapter le code de ton exemple avec les listes 

                pour PB68 merci pour l'aide mais ce que je cherchais c'est l'interpolation cubic spline

                cordiallement

                -
                Edité par youssef2_41 13 mars 2020 à 2:07:53

                • Partager sur Facebook
                • Partager sur Twitter
                  13 mars 2020 à 7:09:01

                  youssef2_41 a écrit:

                  nozio merci pour l'exemple mais je crois que il ne peut pas répondre à ma question moi j'ai deux liste c'est tout et x et y dans mon cas sont des valeur aléatoire donc aucune fonction pourrait les relier avec un autre paramètre sauf qu'il y a un liste t =[0.0, 0.1, .....,0.9] qui sont relié a x et y donc je sais pas comment adapter le code de ton exemple avec les listes 

                  pour PB68 merci pour l'aide mais ce que je cherchais c'est l'interpolation cubic spline

                  cordiallement

                  -
                  Edité par youssef2_41 il y a environ 4 heures

                  Moi, je donnais juste une info sur la notion de courbe paramétrée.

                  Après, pour ce qui de l'interpolation cubique, de mes souvenirs d'école, c'est un "moyen mathématique" permettant le traçage de courbe. C'est le principe utilisé pour les courbes de Béziers.



                  • Partager sur Facebook
                  • Partager sur Twitter

                  PB68

                    13 mars 2020 à 10:19:49

                    Si tu veux interpoler ta courbe fermée, tu peux vraiment reprendre tel quel le code de l'exemple (tu peux lancer le code ci-dessous).

                    import scipy.interpolate as si
                    import numpy as np
                    import matplotlib.pyplot as plt
                    
                    # Les donnees (je rajoute la premiere valeur)
                    x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120]
                    y1=[-150, -96, -95, -85, -74,-65, -55, -52, -46, -47, -150]
                    x=np.asarray(x1)
                    y=np.asarray(y1)
                    
                    
                    # J'interpole
                    x_tck, u = si.splprep([x, y], s=0, per=True)
                    t_new = np.linspace(0, 1, 1001)
                    
                    x_new, y_new = si.splev(t_new, x_tck)
                    
                    plt.figure()
                    plt.plot(x, y, "g*")
                    plt.plot(x_new, y_new, "r-")
                    plt.show()

                    Tu n'as même pas besoin d'expliciter le paramétrage puisque la fonction s'en charge pour toi (c'est la valeur \(u\) dans ce que retourne ta fonction). Après, il faudra peut-être jouer avec les options pour obtenir précisément ce que tu cherches. Garde à l'esprit qu'une interpolation ne fera pas de miracles. Ça reste une interpolation ...

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

                      13 mars 2020 à 11:59:00

                      merci infiniment pour ce bout de code ça se ferme et je sais que l'interpolation reste une interpolation donc pour ce que je représenterai graphiquement je voulais juste qu'il soit représenter comme il faut et si il y a des choses à en tirer comme conclusion c bien sinon donc pas de problème

                      mais le problème que le résultat passe pas par les point selon l'ordre comme le graphe que je voulais car j'ai dû ordonner la liste x1 et donc voilà le résultat qui est différent de ce que je cherchais (resultat juste en dessous, ce que je cherchais tout en bas sachant que les deux graphes représentent les meme données)

                      et je sais pas il y a une autre question stp, j'ai une autre liste rr= [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] dont les valeurs sont associées à x1 et y1 je sais pas si il y a une méthode pour forcer la courbe passer par les points dont les coordonnées (x1, y1 et les valeur de la liste rr) selon l'ordre de graphe toute en bas pour donner la meme figure, et si il y a la possibilité d'afficher les valeurs de la liste rr sur le graphe pour chaque point (x1, y1)

                      meric aussi à PB68 oui c'est ça le problème que je rencontre est forcer le passage de la courbe d'interpolation par les point selon un ordre précis car le code s'exécutait pas quand x1 comporte pas les valeur ordonnées selon l'ordre croissante donc si je veux forcer la courbe d'interpolation (cubic spline) passer le point 0.9 -> 0.8 -> 0.7 ........ 0.0 -> 0.9 et revenir au point 0.9 je sais pas si possible ou pas

                      merci infiniment 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 mars 2020 à 14:34:34

                        Le morceau de code suivant interpole tes données

                        # coding: utf-8
                        import scipy.interpolate as si
                        import numpy as np
                        import matplotlib.pyplot as plt
                        
                        ## Je genere ta courbe
                        t=np.arange(0, 1.1, 0.1)
                        x=np.array([-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120])
                        y=np.array([-150, -96, -95, -85, -74,-65, -55, -52, -46, -47, -150])
                        
                        # J'interpole
                        x_tck = si.splrep(t, x, s=0, per=1)
                        y_tck = si.splrep(t, y, s=0, per=1)
                        t_new = np.arange(0, 1.01, 0.01)
                        
                        x_new, y_new = si.splev(t_new, x_tck), si.splev(t_new, y_tck)
                        
                        plt.figure()
                        plt.plot(x, y, "g*")
                        plt.plot(x_new, y_new, "r-")
                        plt.show()

                        Tu remarqueras que j'ai fermé ta courbe en rajoutant le premier point à la fin! Pour obtenir le résultat voulu, il faudra sans doute jouer avec les options !

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Avez-vous entendu parler de Julia ? Laissez-vous tenter ...

                          14 mars 2020 à 16:45:18

                          merci beaucoup frérot le code marche bien mais malheureusement le fait d'ordonner x  pose grand problème pour obtenir la même chose car il passe par les point selon l'ordre croissant des valeurs de x et pas par les points comme le graphe l'indique car dans le graphe on passe par les points ayant les x0 suivant : x0=[-91, -51, -48, -49, -53, -62, -72, -86, -94, -120, -91] selon cet ordre et pas selon l'ordre suivant qu'on utilise dans le code x1=[-120, -94, -91, -86, -72,-62, -53, -51, -49, -48, -120]

                          si je garde l'ordre x0 le code m'affiche ce message d'erreur 

                          raise _iermess[ier][1](_iermess[ier][0])
                          ValueError:     Error on input data

                          je crois a un rapport avec le x0 et qu'il faut ordonner ses valeurs selon un ordre croissant

                          je sais pas vraiment comment sortir de cette impasse

                          voilà le graphe que me donne le code :

                          et le graphe que je voulais obtenir

                          merci pour l'aide si tu as un idée pour surmonter ce problème

                          -
                          Edité par youssef2_41 14 mars 2020 à 16:52:05

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 août 2021 à 10:22:15

                            Bonjour youssef, tu as trouvé une solution à ton problème?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 septembre 2021 à 14:00:11

                              Salam AsmaeAgouram

                              Oui j'ai résolu le problème

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 septembre 2021 à 14:04:29

                                youssef2_41 a écrit:

                                Oui j'ai résolu le problème

                                Bonjour,

                                Sujet résolu

                                Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 septembre 2021 à 17:09:59

                                  Salam AbcAbc6

                                  oui désolé j'ai cru que c'est déjà fait 

                                  désolé 

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  fonction spline cubique

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown