首页 > 解决方案 > 在 Sympy 中,如何定义像 f(x) 这样的通用函数,以便 sympy.diff(f(x), x) 返回 f' 而不是 0。

问题描述

我正在尝试采用此功能的衍生物

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?

标签: pythonsympy

解决方案


从您写的内容来看, 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

推荐阅读