直角坐标到柱坐标的变换

Transformation of Cartesian coordinates to Cylindrical coordinates

请问这是怎么回事?我想定义笛卡尔坐标系,然后我想计算相对于轴 x 的圆柱坐标。

我收到一个错误:

    R = math.sqrt(y[i]**2 + z[i]**2)
TypeError: only size-1 arrays can be converted to Python scalars

代码:

import numpy as np
import math

XMIN =-0.15
XMAX = 0.15
YMIN = -0.1
YMAX = 0.1
ZMIN = -0.1
ZMAX = 0.1
sampling = 100

x_ = np.linspace(XMIN, XMAX, sampling)
y_ = np.linspace(YMIN, YMAX, sampling)
z_ = np.linspace(ZMIN, ZMAX, sampling)

x, y, z = np.meshgrid(x_, y_, z_, indexing='ij')

assert np.all(x[:,0,0] == x_)
assert np.all(y[0,:,0] == y_)
assert np.all(z[0,0,:] == z_)

# cylindric coordinates (R, theta, z)
R_coor = []
THETA_coor = []
Z_coor = []

for i in range(sampling-1):
    R = math.sqrt(y[i]**2 + z[i]**2)
    THETA = math.atan(y[i]/z[i])
    Z = x[i]
    R_coor.append(R)
    THETA_coor.append(THETA)
    Z_coor.append(Z)

差点打错字。

在有问题的行中,您使用的 math.sqrt 只能在 标量 上运行。您必须使用 numpy 版本 np.sqrt 来对 numpy ndarrays 进行操作,或者使用 x_, y_, z_ 来获得标量。

所以你应该使用:

for i in range(sampling-1):
    R = math.sqrt(y_[i]**2 + z_[i]**2)
    THETA = math.atan2(y_[i], z_[i])     # always prefere atan2 to atan...
    Z = x_[i]
    R_coor.append(R)
    THETA_coor.append(THETA)
    Z_coor.append(Z)

或:

for i in range(sampling-1):
    R = np.sqrt(y[i]**2 + z[i]**2)
    THETA = np.arctan2(y[i],z[i])
    Z = x[i]
    R_coor.append(R)
    THETA_coor.append(THETA)
    Z_coor.append(Z)

无关,但 atan 会在 pi/2 处中断,因为您得到无限商并且只能在 ]-pi/2、[=28= 中形成 return 角][ open segment,而atan2可以处理整圈...