簡體   English   中英

使用Sympy返回自動導數

[英]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函數返回可調用函數?
  • 解決擴展問題:有什么方法可以將sympy表達式轉換為Python可評估表達式?

提前致謝。

您可以使用lambdifyget_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM