私はPythonの初心者です。私は最近、Sympyとその記号操作機能、特に微分について学びました。私は可能な限り最も簡単な方法で次のことをしようとしています:
1と2の方法を知っています。問題は、手順3で導関数を評価しようとすると、pythonが導関数を計算できないというエラーが発生することです。これは、最小値です。実例:
import sympy as sym
import math
def f(x,y):
return x**2 + x*y**2
x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
print(fprime(x,y)) #This works.
print(fprime(1,1))
最後の行に3が出力されると思います。何も出力されず、「1次導関数wrt1を計算できません」と表示されます。
この質問への答えは非常に簡単です。確かに、他の回答で与えられたsubs
オプションは、数値で導関数を評価するために機能しますが、導関数をプロットしたい場合は機能しません。これを修正する方法があります:以下で説明するように、lambdify。
Lambdifyを使用して、すべてのsympy関数(区別できるが評価できない)を対応するnumpy関数(評価、プロットなどはできるが区別できない)に変換します。たとえば、sym.sin(x)はnp.sin(x)に置き換えられます。アイデアは、sympy関数を使用して関数を定義し、必要に応じて区別してから、元の関数のラム化バージョンである新しい関数を定義することです。
以下のコードのように、sym.lambdifyは次の入力を受け取ります。
sym.lambdify(variable, function(variable), "numpy")
3番目の入力「numpy」は、sympy関数を対応するnumpy関数に置き換えるものです。例は次のとおりです。
_def f(x):
return sym.cos(x)
def fprime(x):
return sym.diff(f(x),x)
fprimeLambdified = sym.lambdify(x,f(x),"numpy")
_
次に、関数fprime(x)
は-sym.sin(x)
を返し、関数fprimeLambdified(x)
は-np.sin(x)
を返します。現在、特定の入力値でfprimeLambdified
を「呼び出す」/評価することができますが、前者はnumpy式で構成され、後者はsympy式で構成されているため、fprime
を「呼び出す」/評価することはできません。つまり、fprimelambdified(math.pi)
を入力するのは理にかなっており、これは出力を返しますが、fprime(math.pi)
はエラーを返します。
複数の変数で_sym.lambdify
_を使用する例を以下に示します。
_import sympy as sym
import math
def f(x,y):
return x**2 + x*y**2
x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
print(fprime(x,y)) #This works.
DerivativeOfF = sym.lambdify((x,y),fprime(x,y),"numpy")
print(DerivativeOfF(1,1))
_
関数fprime
は導関数ではありません。これは、導関数を(Sympy式として)返す関数です。それを評価するには、.subs
を使用して値をこの式にプラグインできます。
>>> fprime(x, y).evalf(subs={x: 1, y: 1})
3.00000000000000
fprime
を実際に導関数にしたい場合は、関数でラップするのではなく、導関数式をfprime
に直接割り当てる必要があります。次に、直接evalf
することができます。
>>> fprime = sym.diff(f(x,y),x)
>>> fprime.evalf(subs={x: 1, y: 1})
3.00000000000000
関数fprime(x、y)でfprime(1,1)を呼び出すときは、次のように呼び出します。sym.diff(f(1,1)、1)
Xとxの値に異なる変数を使用する必要があります