2014-07-12 71 views
2

如何定義sympy中函數的導數的數值評估? 我有一些函數可以用函數樣條描述,它是使用scipy.interpolate的派生函數。 我想用這個函數處理一些表達式,然後用樣條線來評估表達式。定義sympy函數的導數的數字評估

我可以使用lambdify使sympy函數以數值形式評估爲樣條。 但是,我怎樣才能定義一個sympy函數的派生數值評估爲樣條?

E.g.

import sympy as sp 
import numpy as np 
from scipy.interpolate import InterpolatedUnivariateSpline 
from sympy.ultilitis.lambdify import implemented_function, lambdify 

r = sp.symbols('r') 
B = sp.symbols('B', cls=sp.Function) 

B_spline = InterpolatedUnivariateSpline([1,2,3,4],[1,4,9,16]) 
B_der_spline = InterpolatedUnivariateSpline([1,2,3,4],[2,4,6,8]) 
B = implemented_function(B, lambda r: B_spline(r)) 

class A(sp.Function): 
    nargs = 2 

    @classfunction 
    def eval(cls, r, B): 
     return r**2*B(r) 

A_eval = lambdify(r, A(r,B)) 
A_eval(3) 
>>> 81.0 
A_diff_eval = lambdify(r, sp.diff(A(r,B))) 
A_diff_eval(3) 
>>> NameError: global name 'Derivative' is not defined 

回答

2

SymPy不知道如何獲取樣條函數的導數,因爲它只有scipy的數字版本。

此外,A這裏可能只是一個Python函數,因爲你永遠不會評估它。這也更有意義,因爲將函數作爲參數傳遞給SymPy函數有點奇怪。

全部implemented_function確實是symfunc._imp_ = staticmethod(implementation)(這裏是symfunc = Bimplementation = lambda r: B_spline(r))。您還需要添加fdiff,以便它返回一個新的SymPy函數B_der_spline。喜歡的東西

class B_spline_sym(Function): 
    _imp_ = staticmethod(B_spline) 

    def fdiff(self, argindex=1): 
     return B_der_spline_sym(self.args[0]) 

class B_der_spline_sym(Function): 
    _imp_ = staticmethod(B_der_spline) 

def A(r, B): 
    return r**2*B(r) 

給予

In [87]: B = B_spline_sym 

In [88]: A_eval = lambdify(r, A(r,B)) 

In [89]: A_eval(3) 
Out[89]: 81.0 

In [91]: A_diff_eval = lambdify(r, sp.diff(A(r,B))) 

In [92]: A_diff_eval(3) 
Out[92]: 108.0