这是该问题的代码示例。
from sympy import Function, symbols, diff, cos,sin
x,y = symbols('x y')
f, g = symbols("f g", cls=Function)
g = g(x)
f= f(g) # function composition here
dfdx=diff(f,x) # chain rule here
dfdx
现在,为了
xi = symbols('xi')
dfdx.subs([(xi, sin(x)), (f, cos(xi)),(g, sin(x))])
最后
dfdx.subs([(xi, sin(x)), (f, cos(xi)),(g, sin(x))]).doit()
输出为0,为什么?不应该。前两行唯一不同的是末尾的
.doit()
。如果您手动计算导数,它将是 cos(x) (-sin(sin(x))。应该清楚的是,垂直条末尾的计算应该是 after 而不是在求导数之前。
您的符号 xi 将与其他替换隐式生成的符号不匹配:
In [53]: dfdx
Out[53]:
d d
─────(f(g(x)))⋅──(g(x))
dg(x) dx
In [54]: dfdx.subs(f, cos(xi))
Out[54]:
d d
──(g(x))⋅─────(cos(ξ))
dx dg(x)
In [55]: dfdx.subs(f, cos(xi)).subs(g, sin(x))
Out[55]:
d ⎛d ⎞│
──(sin(x))⋅⎜──(cos(ξ))⎟│
dx ⎝dξ ⎠│ξ=sin(x)
In [56]: dfdx.subs(f, cos(xi)).subs(g, sin(x)).atoms()
Out[56]: {1, ξ, x, ξ}
In [57]: srepr(dfdx.subs(f, cos(xi)).subs(g, sin(x)).atoms())
Out[57]: "{Integer(1), Symbol('xi'), Symbol('x'), Dummy('xi', dummy_index=1433950)}"
请注意,第二个符号 xi 是虚拟符号,被视为与您定义的
xi
不同的符号。导数是关于两个不同的符号,例如:
In [61]: d = Derivative(cos(x), y)
In [62]: d
Out[62]:
d
──(cos(x))
dy
In [63]: d.doit()
Out[63]: 0