シンボリック派生を通じて関数を定義する方法はありますか?例えば、df(1)
は可能ではないので、シンボリック派生を通じて関数を定義する方法はありますか?
def f(x):return x**x
def df(x) : return diff(f(x),x)
このコードは、動作しません(diff(f(1),1)
は意味がありません。)しかし、「差分」の結果を利用する方法はありますか? df(x)
を印刷すると、変数x
のきれいな関数形式があります。
シンボリック派生を通じて関数を定義する方法はありますか?例えば、df(1)
は可能ではないので、シンボリック派生を通じて関数を定義する方法はありますか?
def f(x):return x**x
def df(x) : return diff(f(x),x)
このコードは、動作しません(diff(f(1),1)
は意味がありません。)しかし、「差分」の結果を利用する方法はありますか? df(x)
を印刷すると、変数x
のきれいな関数形式があります。
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)
'print(df(x).subs(x、5))'を実行することもできます。これはxに関して最初に派生し、その結果でxを1に置き換えます。 – Hannebambel
@Hannebambelはい!私は、質問者が多くの値に対して関数を使用すると仮定したので、 'lambdify'と言いました。しかし、「subs」は、2つを比較するときにここに記載されているように、1回限りの結果には問題ありません。(読んだ人の役に立つリンク):http://docs.sympy.org/latest/modules/numeric-computation.html –
答えとコメントの両方が私の質問に答えます。ありがとう –
すべて可能です。ですから、質問はむしろそうでなければなりません。既にそのためのメカニズムが組み込まれていますか?いいえ、それを行うライブラリはありますか?おそらく、これはPythonの内部構造(関数オブジェクト)のハードコアハッキングを必要とするためです。結局のところ、Python関数は数学関数ではありません。それが本当に必要な場合は、特殊な数学的な言葉(例えば、メープル)を使用することをお勧めします。 – freakish
あなたの定義はどこですか? – pkqxdd
diffはシンボリックな区別を行うpythonコマンドです。 –