Как найти сходимость в векторном поле? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь найти области или точки сходимости в векторном поле.

Я использовал приведенный ниже код для создания следующего графика:

import matplotlib.pyplot as plt
import numpy as np


def generate_fake_data():
    return -(np.sin(X) * np.cos(Y) + np.cos(X)), -(-np.cos(X) * np.sin(Y) + np.sin(Y))


x = np.arange(0, 2 * np.pi + 2 * np.pi / 20, 2 * np.pi / 20)
y = np.arange(0, 2 * np.pi + 2 * np.pi / 20, 2 * np.pi / 20)

X, Y = np.meshgrid(x, y)

u, v = generate_fake_data()

fig, ax = plt.subplots(figsize=(7, 7))

# quiveropts = dict(headlength=0, headaxislength=0, pivot='middle', units='xy')
# ax.quiver(X, Y, u, v, **quiveropts)
ax.quiver(X, Y, u, v)

ax.xaxis.set_ticks([])
ax.yaxis.set_ticks([])
ax.axis([0, 2 * np.pi, 0, 2 * np.pi])
ax.set_aspect('equal')
ax.axis("off")
plt.gca().set_axis_off()
plt.subplots_adjust(top=1, bottom=0, right=1, left=0,
                    hspace=0, wspace=0)
plt.margins(0, 0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("mock_data.png", bbox_inches='tight', pad_inches=0)

enter image description here

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

Я надеюсь, что Для этого можно использовать значения curl, но можно использовать любой метод.

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

1 Ответ

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

Для точек схождения расходимость векторного поля <0. </p>

from functools import reduce
conv = reduce(np.add,np.gradient(u)) + reduce(np.add,np.gradient(v))

(см. Вычислить расхождение векторного поля, используя python)

We требуется только отрицательное расхождение:

conv[conv>=0] = np.nan

plt.imshow(conv): чем темнее, тем больше сходится поле:

enter image description here

Поиск абсолютный минимум (в правом верхнем углу) прост:

absmin = np.unravel_index(np.nanargmin(conv), conv.shape)
print(absmin, conv[absmin])
#(0, 15) -0.6669774724547413

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

lm = detect_local_minima(conv)
list(zip(lm))
[(0, 15), (1, 0), (19, 15), (20, 0)]

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

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