Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Sympy中,如何定义一个类似f(x)的泛型函数,使Sympy.diff(f(x),x)返回f';而不是0。_Python_Sympy - Fatal编程技术网

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