Как построить линии тока, когда я знаю u и v компоненты скорости (numpy 2d массивы), используя программу построения графиков в python? - программирование
Подтвердить что ты не робот

Как построить линии тока, когда я знаю u и v компоненты скорости (numpy 2d массивы), используя программу построения графиков в python?

Надеюсь, что сам заголовок был совершенно ясен, я решаю проблему с двумерной крышкой (квадратная область) с использованием метода дробных шагов, конечной разностной формулировки (примитивная переменная формы Навье-Стокса), у меня есть u и v компоненты скорость по всему домену, без ручного расчета линий тока, есть ли команда или инструмент построения графика, который выполняет эту работу для меня?

Надеюсь, этот вопрос достаточно уместен для программирования, так как мне нужен инструмент для построения линий тока без явного вычисления их.

Я решил ту же проблему в форме потока-завихренности NS, мне просто нужно было сделать контурный график функции потока, чтобы получить линии тока.

Я надеюсь, что инструмент или плоттер - это библиотека python, и более полная установка в Fedora (я могу скомпрометировать и использовать мяту) без особых проблем!

я был бы признателен, если кто-то отметит библиотеку и соответствующую команду (сэкономит много времени)

4b9b3361

Ответ 1

Посмотрите функция Tom Flannaghan streamplot. Ниже представлен соответствующий поток в списке пользователей, а также еще один аналогичный фрагмент кода Ray Speth, который делает вещи несколько иначе.

Если у вас есть проблемы со скоростью, возможно, более эффективно использовать некоторые функциональные возможности scipy, а не функции интеграции pure- numpy, используемые в обоих этих примерах. Однако я этого не пробовал, и они сознательно избегают зависимости от scipy. (scipy - довольно тяжелая зависимость по сравнению с numpy)

Из этого примера:

import matplotlib.pyplot as plt
import numpy as np
from streamplot import streamplot

x = np.linspace(-3,3,100)
y = np.linspace(-3,3,100)
u = -1-x**2+y[:,np.newaxis]
v = 1+x-y[:,np.newaxis]**2
speed = np.sqrt(u*u + v*v)

plt.figure()
plt.subplot(121)
streamplot(x, y, u, v, density=1, INTEGRATOR='RK4', color='b')
plt.subplot(122)
streamplot(x, y, u, v, density=(1,1), INTEGRATOR='RK4', color=u,
           linewidth=5*speed/speed.max())
plt.show()

enter image description here

Другой вариант - использовать VTK. Это ускорило трехмерное построение, поэтому для создания 2D-графика потребуется правильная настройка камеры (что не слишком сложно), и вы не сможете получить векторный вывод.

Mayavi, tvtk и mlab обеспечивают pythonic обертки для VTK. Эти функции имеют множество функций.

Самый простой способ использовать VTK для построения линий тока из массивов numpy - это использовать mayavi.mlab.flow. На данный момент я пропущу пример, но если вы хотите изучить с помощью VTK, я могу добавить его.

Ответ 2

В версии 1.2 Matplotlib теперь есть функция streamplot.