В Sympy, как мне определить универсальную функцию, такую ​​как f (x), такую, что sympy.diff (f (x), x) возвращает f ', а не 0. - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь взять производные этой функции

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?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете использовать idiff, чтобы получить хрупкий результат с неоцененными производными: dPdz = idiff(expr, (P, q), z). Это хрупко в том смысле, что dPdz.doit() даст 0, потому что нет явной зависимости от z для q.

>>> idiff(expr,(P,q),z)
k*(x**2 + y**2)*Derivative(q, z)/(2*q**2)
>>> _.doit()
0
0 голосов
/ 03 января 2019

Из того, что вы написали, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...