我试图弄清楚如何在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(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} }
答案 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_
中。