2017-05-31 4 views
-2

Existe-t-il un moyen de définir une fonction par dérivation symbolique? Par exemple,Existe-t-il un moyen de définir une fonction par dérivation symbolique?

def f(x):return x**x 
def df(x) : return diff(f(x),x) 

Ce code ne fonctionne pas, car df(1) ne serait pas possible (diff(f(1),1) n'a pas de sens.) Mais est-il un moyen de tirer profit du résultat de « diff »? Lors de l'impression df(x), il existe une jolie forme de fonction avec la variable x, donc soignée.

+0

Tout est possible. La question devrait donc plutôt être: existe-t-il déjà un mécanisme intégré pour cela? Non. Y a-t-il une bibliothèque qui fait ça? Peu probable, car cela nécessiterait un piratage très brutal des structures internes de Python (c'est-à-dire des objets de fonction). Les fonctions Python ne sont pas des fonctions mathématiques après tout. Si vous en avez réellement besoin, je vous suggère d'utiliser un langage mathématique spécialisé (par exemple, l'érable). – freakish

+1

Où est votre définition de 'diff'? – pkqxdd

+0

diff est une commande python qui fait la différenciation symbolique. –

Répondre

1

Vous n'avez pas besoin de Maple ou Mathematica. Python a sympy.

import numpy as np 
from sympy import symbols, diff, lambdify 

x = symbols('x') 

def f(x): 
    return x**x 

def df(x): 
    return diff(f(x)) 

print(df(x)) 

Ceci renvoie la dérivée symbolique x**x*(log(x) + 1). Maintenant, cela dépend de ce que vous voulez faire avec ça. Il semble que vous vouliez calculer des valeurs numériques sans nécessairement savoir que la dérivée est x**x*(log(x) + 1). La méthode recommandée par sympy pour calculer de nombreuses valeurs numériques est d'utiliser lambdify.

df_numeric = lambdify(x, df(x), modules=['numpy']) 
df_numeric(5) 

Cela donne 8154.4934763565643. Vous pouvez le vérifier par rapport à une fonction manuelle régulière:

def df_manual(n): 
    return n**n*(np.log(n) + 1) 

df_manual(5) 
+0

Vous pouvez aussi faire 'print (df (x) .subs (x, 5))'. Cette première dérive par rapport à x et remplace ensuite x avec 1 dans le résultat. – Hannebambel

+1

@Hannebambel Ouais! Je viens de mentionner 'lambdify' parce que j'ai supposé que le demandeur utiliserait la fonction pour de nombreuses valeurs. Mais 'subs 'est acceptable pour des résultats ponctuels, comme les docs le mentionnent ici en comparant les deux (un lien utile pour quiconque lit): http://docs.sympy.org/latest/modules/numeric-computation.html –

+0

Tant la réponse que le commentaire entendent répondre à ma question! Merci –