Из того, что вы написали, 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