【问题标题】:define numerical evaluation of a derivative of a sympy function定义 sympy 函数的导数的数值评估
【发布时间】:2014-07-12 23:49:39
【问题描述】:

如何在 sympy 中定义函数导数的数值计算? 我有一些函数可以用样条函数来描述,它是使用 scipy.interpolate 导出的。 我想用这个函数操作一些表达式,然后用样条计算表达式。

我可以使用 lambdify 使 sympy 函数以样条曲线的形式进行数值计算。 但是如何定义一个 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

【问题讨论】:

    标签: python scipy sympy spline


    【解决方案1】:

    SymPy 不知道如何对样条函数求导,因为它只有来自 scipy 的数字版本。

    另外,A 可能只是一个 Python 函数,因为你永远不会不评估它。这也更有意义,因为将函数作为参数传递给 SymPy 函数有点奇怪。

    所有implemented_function 都是symfunc._imp_ = staticmethod(implementation)(这里是symfunc = Bimplementation = 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
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 1970-01-01
      • 2023-01-12
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多