Forum Programmation.python dérivée discrète en python

Posté par  (site web personnel) .
Étiquettes : aucune
-1
28
sept.
2010
Bonjour,
je n'arrive pas a trouver de réponse satisfaisante et c'est pour ça que je viens vous demander de l'aide.
J'ai une fonction qui se présente comme ceci*: [[2,3,4],[2,4,6]]
La première sous-liste représente les abscisses et la deuxième sous-
liste mes ordonnées. Je voudrais calculer la dérivée première de cette matrice.
Dois je faire quelque chose du genre : f'(x) = lim|h->0 (f(x+h) - f(x))/h
Faut il que je me dirige vers la dérivation automatique et donc utiliser scipy/numpy?

Si quelqu'un l'avait déjà fait et pouvait m'éclairer un peu...


Merci d'avance
O.

* c'est un exemple très simplifié et mes fonctions (data) comptent plutôt entre 65 et 1000 points
  • # Euh.... si j'ai pas trop rouillé en math...

    Posté par  (site web personnel) . Évalué à 5.

    Vue que tu es en valeurs discrète tu ne peux calculer que 2 dérivées quand tu as 3 points....
    Donc j'utiliserais plutôt pour calculer la dérivée sur les 2 premiers point
    f'(x) = (Y2 - Y1) / (X2 - X1)

    La dérivée au 3ème point étant incalculable car tu n'as plus de point après....
    Après pour les fonctions python je botte en touche....

    Fuse : j'en Use et Abuse !

  • # cf cours de calcul numérique

    Posté par  . Évalué à 3.

    Bonjour,

    la dérivée numérique se calcule par le biais d'une formule à 2, ou 4 points.

    Il faut faire un dl au voisinage du point considéré, à +2h, +h, -h, -2h (pour la formule à quatre points) ou +h et -h (pour la formule à deux points) et en déduire l'expression de la dérivée première en négligeant les termes du second ordre.

    Le résultat numérique tend vers le résultat formel pour des h très petit, donc ça dépend du pas de discrétisation.

    http://www.collegedusud.ch/app/applmaths/cours/interpolation(...)

    Systemd, the bright side of linux, toward a better user experience and on the road to massive adoption of linux for the desktop.

  • # Réponse

    Posté par  . Évalué à 5.

    Ça sent l'exercice à faire à 3km, mais bon… Utiliser scipy ou numpy pour ça…
    def derivee(tableau):
      x, y = tableau
      d = []
      for i in range(len(x)-1):
        d.append((y[i+1]-y[i])/(x[i+1]-x[i]))
      return d
    
    Et si tu veux le faire encore plus pythonique, avec générateur pour du calcul à le demande  :
    def derivee(x, y):
      for i in range(len(x)-1):
        yield (y[i+1]-y[i])/(x[i+1]-x[i])
    
    (si tu veux garder ton format de données tout en un, suffit de l'appeler genre derivee(*tableau))
    • [^] # Re: Réponse

      Posté par  (site web personnel) . Évalué à 2.

      @benoar:
      pas du tout, j'ai passé l'âge de faire des exos depuis bien longtemps. C'est vraiment pour le plaisir de faire du python...

      Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

      • [^] # Re: Réponse

        Posté par  (site web personnel) . Évalué à 4.

        Voici ce que je propose en premier jet:

        # derivation

        import numpy
        from scipy.interpolate import interp1d
        from scipy.misc import derivative

        def first_derivative(list):
        x = range(len(list))
        f = interp1d(x,list)
        dTemp = []
        for i in range(1,len(list)-1):
        dTemp.append(derivative(f,i))
        return dTemp

        def second_derivative(list):
        fd = first_derivative(list)
        print 'first derivative done'
        fdd = first_derivative(fd)
        print 'second derivative done'


        J'ai fait un essai et ca marche plutôt pas mal. Pour info ceci me sert a déterminer l’abscisse du point d'inflexion d'une courbe en S.

        Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

        • [^] # Re: Réponse

          Posté par  (site web personnel) . Évalué à 1.

          Ma solution:

          def first_derivative(xlist,ylist):
          f = interp1d(xlist,ylist)
          dTemp = []
          for i in xlist[1:len(xlist)-1]:
          dTemp.append(derivative(f,float(i),n=2))
          xlist = xlist[1:len(xlist)-1]
          return xlist,dTemp

          Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

  • # Facile !

    Posté par  (site web personnel) . Évalué à 3.

    Ta fonction, c'est
    f(x) = 2x - 2.
    Donc ta dérivée, c'est
    f'(x) = 2.

    De rien, merci.
    --[-> ]

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.