我正在编写一个脚本,用Python进行分析计算。为此,我需要参数的矢量表示,以及一些基本的矢量运算,如梯度和散度,因此我开始在SymPy中工作。然而,我注意到在球面坐标系中并没有一种简单的方法。
在阅读了文档后,我发现Cartessian环境可以简单地定义为
from sympy.vector import CoordSys3D
N = CoordSys3D('N')
并直接开始使用酉笛卡尔酉向量i,j,k
v = 2*N.i + 3*N.j - N.k
对于球面坐标,有没有任何方法可以初始化这样一个环境,在这里我可以访问径向、θ和φ酉向量,从而相应地进行基本向量运算?提前感谢您!
如果指示变换为"球形",则可以将球面坐标酉向量访问为"r"、"t"、"p"(或者可以使用"radius"、"theta"、"phi"等全名(,而不是"i"、"j"、"k":
>>> from sympy.vector import CoordSys3D
>>> P = CoordSys3D('P', transformation='spherical', variable_names=list('rtp'))
>>> P.r
P.r
经过一番阅读,我发现可以用variable_names()
并且新基的酉向量为vector_names()
因此,球面坐标系的完整定义是
P = CoordSys3D('P', transformation='spherical',
vector_names=list('rtp'),
variable_names=list('RTP'))
现在酉向量确实尊重正确的关系,例如
P.r & P.t = 0
P.r ^ P.t = P.p
其中&
代表点积,^
代表叉积
似乎没有完全实现球面变换。
我试图将球形CoordSys3D转换为笛卡尔坐标系,但我没有像预期的那样工作。
Simpy提供了功能";express";但它似乎只是在倾斜系统上工作,而不是在球面坐标上。
>>> from sympy.vector import CoordSys3D, express
>>> N = CoordSys3D('N')
>>> from sympy.abc import a
>>> M = N.orient_new_axis('M', a, N.k)
>>> v1 = 1*N.i + 1*N.j + 1*N.k
>>> express(v1, M)
(sin(a) + cos(a))*M.i + (-sin(a) + cos(a))*M.j + M.k
>>> O = N.create_new('O', transformation='spherical')
>>> express(v1, O)
O.i + O.j + O.k
我希望最后一行的输出包含来自O的球面变量('rtp'(,以及来自三角计算的更多浮点数。
我是不是错过了什么?