在圆柱坐标中使用时,我发现 sympy.vector.divergence 函数存在问题。
有时它会给出正确的答案,但有时会给出错误的答案。
请参见下面的示例。
分歧(1 * rhat)返回0,当它应该返回1/R
分歧(R * rhat)返回2,正确答案。
from sympy.vector import CoordSys3D, divergence
N = CoordSys3D('N', transformation='cylindrical', vector_names=("r", "phi", "z"), variable_names=("R", "PHI", "Z"))
# Variables
R = N.R
PHI = N.PHI
Z = N.Z
# Basis Unit Vectors
rhat = N.r
phihat = N.phi
zhat = N.z
print( divergence( R * rhat )
# 2 correct answer
print( divergence( 1 * rhat )
# 0 WRONG!! should be 1/R
我已将问题报告为 sympy github 问题页面上的错误。
对于我尝试过的各种多项式,diverence() 在柱坐标中给出了正确的答案,例如:
散度(R**3 * rhat)
4 R^2
因此,它似乎使用了正确的柱坐标发散公式。我查看了divergence() 源代码。圆柱坐标没有特定的代码。相反,它通过使用蹩脚系数对任何曲线坐标系进行一般情况变换。
当参数中有一个变量 R 时,divergence() 可以正常工作,但是当只给出一个常量时它会给出错误的答案。
散度( R * rhat ) # 2 正确
分歧( 7 * rhat ) # 0 错误!应该是 7/R
我的第一个猜测是,divergence() 代码正在尝试使用它期望成为变量一部分的某些属性(即 R._CoordSys),但在传递常量时找不到它。