sympy中的函数分解

时间:2018-07-11 16:01:35

标签: python math sympy

我试图弄清楚如何在SymPy中进行功能分解

我可以在SymPy中进行功能合成:

from sympy import symbols, cos, sin, diff

x = symbols('x')
h = cos(x)
g = sin(h)

g
  

sin(cos(x))

SymPy能够区分这一点

diff(g)
  

-sin(x)* cos(cos(x))

但是我如何将sin(cos(x))分为f(x)=sin(x)g(x)=cos(x)看来它必须在内部执行此操作,即使这不是其中的一部分api,这将有助于在内部找到它的位置。我查看了源代码,只是看到它应用了商规则而不是链式规则,因此我可能在错误的位置查看了

def diff in the repo

def diff(f, x):
    """Computes partial derivative in ``x``.
    Examples
    ========
    >>> from sympy.polys.fields import field
    >>> from sympy.polys.domains import ZZ
    >>> _, x, y, z = field("x,y,z", ZZ)
    >>> ((x**2 + y)/(z + 1)).diff(x)
    2*x/(z + 1)
    """
    x = x.to_poly()
    return f.new(f.numer.diff(x)*f.denom - f.numer*f.denom.diff(x), f.denom**2)

我无法确定f.numer.diff的位置。 This code可能是这样,但我不确定,我也不知道如何确定该代码在哪里寻找我想要的东西。

我正在寻找的是给它一个类似的东西(使用不同的示例来展示我正在寻找的各种各样的东西)(2x)^5并得到2x和{{1} }

1 个答案:

答案 0 :(得分:1)

要将合成分解成碎片,请使用SymPy表达式的两个基本属性:func (the "outer" function) and args (its arguments)

expr = sin(cos(x))
print(expr.func, expr.args)   # prints sin and (cos(x), )
print(expr.func(x))   #  sin(x)
print(expr.args[0])   #  cos(x)

顺便说一下,链规则逻辑在Function类的内部_eval_derivative方法中。这就是f(g(x))的导数的评估最终导致的地方。您正在看Polys课。

各种对象的派生类的一般调度在Derivative.__new_中。