Как интерполировать векторное поле с Python? - PullRequest
1 голос
/ 04 ноября 2019

У меня есть 2D векторное поле (на самом деле это 3D, но если мы знаем, как это сделать с 2D, я думаю, что это будет легко обобщить в 3D), например:

import matplotlib.pyplot as plt, numpy as np
x = [0, 0, 1, 1, 2, 2, 0, 1, 2]
y = [1, 2, 1, 2, 1, 2, 1.5, 1.5, 1.5]
u = [0.5, -1, 0, 0, 0.25, 1, 0, 0, 0.75]
v = [1, 1, 1, 1, 1, 1, 1, 1, 1]
plt.quiver(x, y, u, v)
plt.show()

enter image description here

Как плавно интерполировать это векторное поле?

Я знаю, как использовать np.polyfit, но не понимаю, каквыполнить интерполяцию для векторного поля.

Пример: я хотел бы интерполировать [0,2]x[1,2] с сотнями стрелок.

1 Ответ

2 голосов
/ 04 ноября 2019

Используя методы NumPy meshgrid и SciPy interpolate.griddata, это может быть быстрым и возможным решением:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

x = [0, 0, 1, 1, 2, 2, 0, 1, 2]
y = [1, 2, 1, 2, 1, 2, 1.5, 1.5, 1.5]
u = [0.5, -1, 0, 0, 0.25, 1, 0, 0, 0.75]
v = [1, 1, 1, 1, 1, 1, 1, 1, 1]

plt.figure(1)
plt.quiver(x, y, u, v)

xx = np.linspace(0, 2, 10)
yy = np.linspace(1, 2, 10)
xx, yy = np.meshgrid(xx, yy)

points = np.transpose(np.vstack((x, y)))
u_interp = interpolate.griddata(points, u, (xx, yy), method='cubic')
v_interp = interpolate.griddata(points, v, (xx, yy), method='cubic')

plt.figure(2)
plt.quiver(xx, yy, u_interp, v_interp)
plt.show()

Вывод интерполированного графика:

Output

Игра с количеством точек, которые будут созданы в ходе вызовов np.linspace, дает вам более или менее стрелы.

Надеюсь, это поможет!

...