如何在SymPy中对柱坐标、球坐标系统下的向量执行各类运算?
SymPy非笛卡尔坐标系向量运算的正确方式
问题原因
你得到不符合预期结果的核心原因是混淆了非笛卡尔坐标系的坐标值和向量在对应正交基下的分量两个概念:
SymPy中CoordSys3D的N.i/N.j/N.k永远代表当前坐标系的三个正交单位基向量,对柱坐标系来说分别对应径向$\hat{\rho}$、角向$\hat{\phi}$、轴向$\hat{z}$,三个基互相垂直且长度为1。你代码中给角向基分量赋值$\pi/2$,自然模长计算结果为$\sqrt{4^2 + (\pi/2)^2 + 3^2} = \sqrt{\pi^2/4 +25}$,这个计算本身没有错误,只是不符合你想计算「柱坐标位置点$(4, \pi/2, 3)$对应位置向量模长」的需求。
正确实现方式
如果你要计算柱坐标下位置点对应向量的模长,注意柱坐标系下位置向量本身没有角向$\hat{\phi}$分量,位置坐标的$\phi$是用来指定基向量的朝向,不是向量分量:
from sympy import pi from sympy.vector import CoordSys3D # 定义柱坐标系 N = CoordSys3D('N', transformation='cylindrical', variable_names=("rho", "phi", "z")) # 定义位置点,参数依次为rho、phi、z的坐标值 p = N.point([4, pi/2, 3]) # 获取该点相对于原点的位置向量 v_pos = p.position_wrt(N.origin) # 计算模长 print(v_pos.magnitude()) # 输出 5
不同坐标系下的运算通用规则
- 所有基础向量运算(加减、点积、叉积、模长、归一化)的逻辑不受坐标系类型影响,只要基是正交单位基,运算规则和笛卡尔坐标系完全一致
- 如果需要做坐标值转换,可调用内置的坐标转换接口:
# 将柱坐标点转换为笛卡尔坐标 print(p.coordinates(N.cartesian())) # 输出 (0, 4, 3) # 将柱坐标点转换为球坐标 print(p.coordinates(N.spherical()))
注意事项
- 柱坐标、球坐标的角向基向量是随位置变化的,定义全局固定向量时建议先在笛卡尔坐标系创建,再转换到目标坐标系获取分量
- 不要将坐标值直接作为对应基向量的分量,角向、径向的坐标值和基向量分量是完全不同的概念
内容的提问来源于stack exchange,提问作者Miguel Zabala
相关产品推荐
相关产品推荐

