Неожиданное переключение координат при изменении положения объекта в трехмерной сетке после выравнивания и интеграции.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Неожиданное переключение координат при изменении положения объекта в трехмерной сетке после выравнивания и интеграции.

Сообщение Anonymous »

Я работаю над обработкой и анализом данных поля скоростей из файлов VTI с использованием Python. Рабочий процесс включает в себя чтение файлов VTI, извлечение данных о скорости, вычисление траекторий объектов, создание траекторий в виде карт, а затем выполнение различных вычислений. Однако я столкнулся с проблемой, когда на картах создается впечатление, что оси смещены, что приводит к неверным расчетам дельты между соседними точками сетки.
Я использую интеграцию np.meshgrid объектов. или частицы изменяют форму и сглаживаются для интеграции, а затем принимают желаемую форму в зависимости от оси домена. Я не смог найти точку, в которой переключались оси x и z. Я мог сказать, что они переключались из-за того, что разница между одной точкой и соседом была равна нулю вдоль желаемой оси, но вдоль противоположной оси, поэтому z для x и x для z я получал ожидаемые координатные расстояния. По оси Y не возникло никаких проблем.
Кроме того, я заметил, что если я изменю x_grid, скажем, на 1–11 вместо 0–10, то рассчитанная там дельта будет такой, как и ожидалось. , то есть форма, которая, по моему мнению, подходит. Включив «order = F» для изменения формы, чтобы следовать порядку индексов, подобному Фортрану, во время процесса изменения формы сохраняется правильное выравнивание осей.
Почему изменение формы не работает как ожидается, если я не буду использовать индексацию Fortran? Или я неправильно понял или испортил изменение формы на другом этапе интеграции?
Мне удалось воссоздать проблему в следующем фрагменте:
import numpy as np
from scipy.integrate import solve_ivp

x_grid = np.linspace(0, 1, 10)
y_grid = np.linspace(0, 1, 10)
z_grid = np.linspace(0, 1, 10)
resolution = 0.01

domain_x = np.arange(x_grid.min(), x_grid.max() + resolution, resolution)
domain_y = np.arange(y_grid.min(), y_grid.max() + resolution, resolution)
domain_z = np.arange(z_grid.min(), z_grid.max() + resolution, resolution)

domain_shape = (len(domain_x), len(domain_y), len(domain_z))

#initial positions
initial_positions = np.array(np.meshgrid(domain_x, domain_y, domain_z, indexing='ij')).T.reshape(-1, 3)

def path_calc(t, y):
return y
# Solving
t_span = (0, 1)
times = np.linspace(0, 1, 10)
sol = solve_ivp(
path_calc,
t_span,
initial_positions.flatten(),
method='RK45',
t_eval=times,
vectorized=True
)
trajectories = sol.y.T.reshape(len(times), -1, 3)

def compute_maps(trajectories, domain_shape):
positions_final = trajectories[-1]

expected_num_positions = np.prod(domain_shape)
actual_num_positions = positions_final.shape[0]

if expected_num_positions != actual_num_positions:
raise ValueError(f"Expected number of positions {expected_num_positions} does not match actual number {actual_num_positions}")

map_x = positions_final[:, 0].reshape(domain_shape, order='F')
map_y = positions_final[:, 1].reshape(domain_shape, order='F')
map_z = positions_final[:, 2].reshape(domain_shape, order='F')

map_x_non = positions_final[:, 0].reshape(domain_shape)
map_y_non = positions_final[:, 1].reshape(domain_shape)
map_z_non = positions_final[:, 2].reshape(domain_shape)

maps = {
'map_x': map_x,
'map_y': map_y,
'map_z': map_z,
'map_x_non': map_x_non,
'map_y_non': map_y_non,
'map_z_non': map_z_non
}

return maps

maps = compute_maps(trajectories, domain_shape)

delta_x_calc = np.abs(maps['map_x'][1, 0, 0] - maps['map_x'][0, 0, 0])
delta_y_calc = np.abs(maps['map_y'][0, 1, 0] - maps['map_y'][0, 0, 0])
delta_z_calc = np.abs(maps['map_z'][0, 0, 1] - maps['map_z'][0, 0, 0])
delta_x_calc_non = np.abs(maps['map_x_non'][1, 0, 0] - maps['map_x_non'][0, 0, 0])
delta_y_calc_non = np.abs(maps['map_y_non'][0, 1, 0] - maps['map_y_non'][0, 0, 0])
delta_z_calc_non = np.abs(maps['map_z_non'][0, 0, 1] - maps['map_z_non'][0, 0, 0])


Подробнее здесь: https://stackoverflow.com/questions/787 ... d-grid-aft
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»