Python 在Sympy中,如何定义一个类似f(x)的泛型函数,使Sympy.diff(f(x),x)返回f';而不是0。
我试图得到这个函数的导数Python 在Sympy中,如何定义一个类似f(x)的泛型函数,使Sympy.diff(f(x),x)返回f';而不是0。,python,sympy,Python,Sympy,我试图得到这个函数的导数 x, y, z, P, k, q = sp.symbols('x y z P k q') expr = sp.exp(-sp.I*(P+k/(2*q)*(x**2 + y**2))) 其中p和q是z的函数。我如何定义P和q,使sp.diff(P,z)返回P'而不是0?根据您所写的,sympy不知道P和q是z的函数,是吗?所以它将它们视为常量-就像所有其他变量一样,除了z。您的表达式根本没有提到z,因此它都是一个常量表达式-常量的派生是0,没有例外 确保sympy知道
x, y, z, P, k, q = sp.symbols('x y z P k q')
expr = sp.exp(-sp.I*(P+k/(2*q)*(x**2 + y**2)))
其中p和q是z的函数。我如何定义P和q,使sp.diff(P,z)返回P'而不是0?
根据您所写的,sympy不知道
P
和q
是z
的函数,是吗?所以它将它们视为常量-就像所有其他变量一样,除了z
。您的表达式根本没有提到z
,因此它都是一个常量表达式-常量的派生是0
,没有例外
确保sympy
知道p
和q
是z
的功能。显然,这些函数是什么很重要——你不能把它们留为空白。平方和平方根的区别不同。如果您不知道,sympy将尽其所能:
x, y, z, k = sp.symbols('x y z k')
P = sp.Function('P')
q = sp.Function('q')
expr = sp.exp(-sp.I*(P(z)+k/(2*q(z))*(x**2 + y**2)))
sp.diff(expr, z)
# => -I*(-k*(x**2 + y**2)*Derivative(q(z), z)/(2*q(z)**2) + Derivative(P(z), z))*
# exp(-I*(k*(x**2 + y**2)/(2*q(z)) + P(z)))
但如果你知道,它可以精确地计算:
x, y, z, k = sp.symbols('x y z k')
P = sp.Lambda(z, z * z)
q = sp.Lambda(z, sp.sqrt(z))
expr = sp.exp(-sp.I*(P(z)+k/(2*q(z))*(x**2 + y**2)))
sp.diff(expr, z)
# => -I*(-k*(x**2 + y**2)/(4*z**(3/2)) + 2*z)*
# exp(-I*(k*(x**2 + y**2)/(2*sqrt(z)) + z**2))
类似地,我认为您无法区分p
,但这是可行的:
sp.diff(P(z), z)
# => 2*z
从你写的东西中,sympy不知道
p
和q
是z
的函数,是吗?所以它将它们视为常量-就像所有其他变量一样,除了z
。您的表达式根本没有提到z
,因此它都是一个常量表达式-常量的派生是0
,没有例外
确保sympy
知道p
和q
是z
的功能。显然,这些函数是什么很重要——你不能把它们留为空白。平方和平方根的区别不同。如果您不知道,sympy将尽其所能:
x, y, z, k = sp.symbols('x y z k')
P = sp.Function('P')
q = sp.Function('q')
expr = sp.exp(-sp.I*(P(z)+k/(2*q(z))*(x**2 + y**2)))
sp.diff(expr, z)
# => -I*(-k*(x**2 + y**2)*Derivative(q(z), z)/(2*q(z)**2) + Derivative(P(z), z))*
# exp(-I*(k*(x**2 + y**2)/(2*q(z)) + P(z)))
但如果你知道,它可以精确地计算:
x, y, z, k = sp.symbols('x y z k')
P = sp.Lambda(z, z * z)
q = sp.Lambda(z, sp.sqrt(z))
expr = sp.exp(-sp.I*(P(z)+k/(2*q(z))*(x**2 + y**2)))
sp.diff(expr, z)
# => -I*(-k*(x**2 + y**2)/(4*z**(3/2)) + 2*z)*
# exp(-I*(k*(x**2 + y**2)/(2*sqrt(z)) + z**2))
类似地,我认为您无法区分p
,但这是可行的:
sp.diff(P(z), z)
# => 2*z
您可以使用
idiff
获得具有未赋值导数的脆弱结果:dPdz=idiff(expr,(p,q),z)
。从某种意义上讲,它是脆弱的,dPdz.doit()
将给出0,因为q没有对z的显式依赖
>>> idiff(expr,(P,q),z)
k*(x**2 + y**2)*Derivative(q, z)/(2*q**2)
>>> _.doit()
0
您可以使用
idiff
获得具有未赋值导数的脆弱结果:dPdz=idiff(expr,(p,q),z)
。从某种意义上讲,它是脆弱的,dPdz.doit()
将给出0,因为q没有对z的显式依赖
>>> idiff(expr,(P,q),z)
k*(x**2 + y**2)*Derivative(q, z)/(2*q**2)
>>> _.doit()
0