python - 在 Sympy 中,如何定义像 f(x) 这样的通用函数,以便 sympy.diff(f(x), x) 返回 f' 而不是 0。

标签 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 无法知道 Pqz 的函数,可以吗?因此它将它们视为常量 - 就像除 z 之外的所有其他变量一样。您的表达式根本没有提及 z,因此它都是一个常量表达式 - 并且常量的派生是 0,没有异常(exception)。

确保sympy知道Pqz的函数。显然,这些功能是什么很重要 - 你不能将它们留空。平方与平方根的微分不同。如果您不知道,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

关于python - 在 Sympy 中,如何定义像 f(x) 这样的通用函数,以便 sympy.diff(f(x), x) 返回 f' 而不是 0。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54027321/

相关文章:

python - 如何按词典顺序组织 PolynomialFeatures 的系数,以便它们与多元多项式的 sympy 匹配?

python - Keras:input_shape=train_data.shape 产生 "list index out of range"

python - 从请求 Python 中清除 cookie

python - 无法在我的类(class)中使用 sympy 解析器;类型错误 : 'module' object is not callable

Python - 使用 sympy 和lambdaify 时,矩阵的点积似乎不起作用

python - 负实数的立方根

python 格式化一个 float 来打印 .123 而不是 0.123

python - keras 只会给出 0.5001 的精度

python - 拼写检查算法输出所有内容而不仅仅是拼写错误(Python)?

python - 如何指定 Function 或 IndexedBase 元素的假设/类型?