Как построить линии тока, когда я знаю U и V компоненты скорости (NumPy 2D-массивы), используя программу построения в Python? - PullRequest
17 голосов
/ 28 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

23 голосов
/ 29 ноября 2011

Взгляните на функцию Тома Фланнагана streamplot . соответствующая нить в списке пользователей находится здесь , а также есть еще один подобный фрагмент кода от Ray Speth , который делает вещи немного по-другому.

Если у вас проблемы со скоростью, может быть более эффективно использовать некоторые интеграционные функции scipy вместо чисто интегральных функций 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.Это ускоренное 3D-построение, поэтому для создания 2D-графика потребуется правильно настроить камеру (что не так уж сложно), и вы не сможете получить векторный вывод.

Mayavi, tvtk и mlab предоставляют питонные оболочки для VTK.У этого есть много функциональности по этим направлениям.

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

4 голосов
/ 19 февраля 2013

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

3 голосов
/ 28 ноября 2011
...