sympy 会产生零导数,否则

问题描述 投票:0回答:1

这是该问题的代码示例。

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 而不是在求导数之前。

python sympy
1个回答
0
投票

您的符号 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
© www.soinside.com 2019 - 2024. All rights reserved.