Преобразование декартовых координат в цилиндрические координаты - PullRequest
0 голосов
/ 29 мая 2020

Что с этим не так, пожалуйста? Я хотел бы определить декартову систему координат, а затем я хотел бы вычислить цилиндрическую координату относительно оси 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)

1 Ответ

1 голос
/ 29 мая 2020

Близко к опечатке.

В ошибочной строке вы используете 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, pi / 2 [открытый сегмент, а atan2 может обрабатывать весь круг ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...