web-dev-qa-db-ja.com

Pythonで導関数をどのように評価しますか?

私はPythonの初心者です。私は最近、Sympyとその記号操作機能、特に微分について学びました。私は可能な限り最も簡単な方法で次のことをしようとしています:

  1. F(x、y)= x ^ 2 + xy ^ 2を定義します。
  2. Xに関してfを微分します。したがって、f '(x、y)= 2x + xy ^ 2です。
  3. 導関数を評価します(例:f '(1,1)= 2 + 1 = 3)。

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を計算できません」と表示されます。

5
user3843183

この質問への答えは非常に簡単です。確かに、他の回答で与えられた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))
_
1
user3843183

関数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
6
BrenBarn

関数fprime(x、y)でfprime(1,1)を呼び出すときは、次のように呼び出します。sym.diff(f(1,1)、1)

Xとxの値に異なる変数を使用する必要があります

0
Quartal