2014-07-12 4 views
2

sympy에서 함수 파생의 수치 평가를 정의하려면 어떻게해야합니까? 함수에 대한 스플라인으로 설명 할 수있는 함수가 있고 scipy.interpolate를 사용하여 파생 함수입니다. 이 함수로 일부 식을 조작 한 다음 스플라인을 사용하여 식을 계산하려고합니다.은 sympy 함수의 파생어에 대한 수치 평가를 정의합니다.

lambdify를 사용하여 sympy 함수를 수치로 스플라인으로 평가할 수 있습니다. 그러나 어떻게 spline으로 수치 적으로 평가할 sympy 함수의 미분을 정의 할 수 있습니까?

예.

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은 평가하지 않으므로 파이썬 함수 일 수 있습니다. 그것은 또한 SymPy 함수에 인수로서 함수를 전달하는 것이 조금 이상하다는 점에서 더 의미가 있습니다.

모두 symfunc._imp_ = staticmethod(implementation) (여기서는 symfunc = Bimplementation = lambda r: B_spline(r))입니다. B_der_spline에 대한 새로운 SymPy 함수를 반환하도록 fdiff을 추가해야합니다.

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 
주기 비슷해