如何在sympy中定义函数导数的数值计算? 我有一些功能,我可以用函数的样条线描述它和使用scipy.interpolate的派生。 我想用这个函数操作一些表达式,然后用样条函数计算表达式。
我可以使用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
答案 0 :(得分:2)
SymPy不知道如何获取样条函数的导数,因为它只有scipy的数字版本。
此外,A
这里可能只是一个Python函数,因为你永远不会评估它。这也更有意义,因为将函数作为参数传递给SymPy函数有点奇怪。
所有implemented_function
都是symfunc._imp_ = staticmethod(implementation)
(此处symfunc = B
和implementation = lambda r: B_spline(r)
)。您还需要添加fdiff
,以便为B_der_spline
返回新的SymPy函数。像
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