2017-05-31 1 views
-2

シンボリック派生を通じて関数を定義する方法はありますか?例えば、df(1)は可能ではないので、シンボリック派生を通じて関数を定義する方法はありますか?

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

このコードは、動作しません(diff(f(1),1)は意味がありません。)しかし、「差分」の結果を利用する方法はありますか? df(x)を印刷すると、変数xのきれいな関数形式があります。

+0

すべて可能です。ですから、質問はむしろそうでなければなりません。既にそのためのメカニズムが組み込まれていますか?いいえ、それを行うライブラリはありますか?おそらく、これはPythonの内部構造(関数オブジェクト)のハードコアハッキングを必要とするためです。結局のところ、Python関数は数学関数ではありません。それが本当に必要な場合は、特殊な数学的な言葉(例えば、メープル)を使用することをお勧めします。 – freakish

+1

あなたの定義はどこですか? – pkqxdd

+0

diffはシンボリックな区別を行うpythonコマンドです。 –

答えて

1

MapleやMathematicaは必要ありません。 Pythonには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)) 

これは、シンボリック派生体x**x*(log(x) + 1)を返します。今、それはあなたがそれで何をしたいかによって異なります。デリバティブがx**x*(log(x) + 1)であることを必ずしも知らずに数値を計算したかったようです。 sympyが多くの数値を計算するには、lambdifyを使用することをお勧めします。

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

これは8154.4934763565643です。通常の手動機能と照合して確認できます。

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

df_manual(5) 
+0

'print(df(x).subs(x、5))'を実行することもできます。これはxに関して最初に派生し、その結果でxを1に置き換えます。 – Hannebambel

+1

@Hannebambelはい!私は、質問者が多くの値に対して関数を使用すると仮定したので、 'lambdify'と言いました。しかし、「subs」は、2つを比較するときにここに記載されているように、1回限りの結果には問題ありません。(読んだ人の役に立つリンク):http://docs.sympy.org/latest/modules/numeric-computation.html –

+0

答えとコメントの両方が私の質問に答えます。ありがとう –

関連する問題