[英]Returning automatic derivatives with Sympy
我正在嘗試建立一個類,其目標是將函數f
的派生也作為函數返回。 我已經閱讀了有關Sympy的文章,並開始嘗試使用此軟件包。
假設我有一個只有一個參數的簡單函數,如下所示:
def f1p(x):
return x**2 + 5**x * 2*x + 1
現在,我有一種方法可以確保函數只有一個參數,然后計算導數(僅作為表達式):
from sympy import *
import inspect
def get_derivative(fun):
parameters=inspect.getargspec(f).args
if(len(parameters)>1):
raise ValueError('Function has more than one parameter.')
fdiff=fun(Symbol(parameters[0])).diff()
print(fdiff)
假設fdiff
包含派生函數的主要表達式,因此,我要解決的問題是返回一個函數以對其求值,例如:
f_deriv=get_derivative(f1p) #f_deriv is a callable function
print(f_deriv(a)) #Prints derivative value of f1p in a
注意:我已經嘗試return eval/exec(diff)
但這是一個壞主意,因為需要聲明參數。 我也嘗試用以下方式包裝表達式:
eval('def foo('+parameters[0]+'):\n\treturn '+diff)
這仍然不是一個好主意。
假設現在我們在基本函數中使用(例如)對數,因此我們以這種方式實現
import math
def f1p(x):
return x**2 + 5**x * 2*x + 1 + math.log(x)
當我對此應用上一個函數時,出現以下錯誤:
TypeError: can't convert expression to float
這是由於Sympy無法理解math.log(x)
。 因此,我的問題是:
get_derivative
函數返回可調用函數? 提前致謝。
您可以使用lambdify從get_derivative
返回callable:
import inspect
from sympy import symbols, diff
from sympy.utilities.lambdify import lambdify
def get_derivative(function):
if len(inspect.getfullargspec(function).args) > 1:
raise ValueError('Function has more than one parameter.')
x = symbols('x')
return lambdify(x, diff(f1p(x), x))
您的第一個f1p
版本的檢查結果:
def f1p(x):
return x**2 + 5**x * 2*x + 1
derivative = get_derivative(f1p)
derivative(1)
這將給28.094379124341003
。 這是正確的結果。
現在,如果要使用對數,則應該使用sympy而不是math的對數 :
from sympy import log
def f1p(x):
return x**2 + 5**x * 2*x + 1 + log(x)
derivative = get_derivative(f1p)
derivative(1)
這將給29.094379124341003
。 也正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.