Мне было интересно интегрировать векторное поле (то есть найти линию тока) для заданной начальной точки с использованием библиотеки scipy.integrate
. Поскольку векторное поле представляет собой объект numpy.ndarray
, определенный на вычислительной сетке, значения между точками сетки необходимо интерполировать. Кто-нибудь из интеграторов справляется с этим? То есть, если бы я, например, попытался выполнить следующее
import numpy as np
import scipy.integrate as sc
vx = np.random.randn(10,10)
vy = np.random.randn(10,10)
def f(x,t):
return [vx[x[0],x[1]], vy[x[0],x[1]]] # which obviously does not work if x[i] is a float
p0 = (0.5,0.5)
dt = 0.1
t0 = 0
t1 = 1
t = np.arange(t0,t1+dt,dt)
sc.odeint(f,p0,t)
Изменить :
Мне нужно вернуть интерполированные значения векторного поля окружающих точек сетки:
def f(x,t):
im1 = int(np.floor(x[0]))
ip1 = int(np.ceil(x[1]))
jm1 = int(np.floor(x[0]))
jp1 = int(np.ceil(x[1]))
if (im1 == ip1) and (jm1 == jp1):
return [vx[x[0],x[1]], vy[x[0],x[1]]]
else:
points = (im1,jm1),(ip1,jm1),(im1,jp1),(ip1,jp1)
values_x = vx[im1,jm1],vx[ip1,jm1],vx[im1,jp1],vx[ip1,jp1]
values_y = vy[im1,jm1],vy[ip1,jm1],vy[im1,jp1],vy[ip1,jp1]
return interpolated_values(points,values_x,values_y) # how ?
Последний оператор return — это просто какой-то псевдокод. Но это в основном то, что я ищу.
Изменить :
def f(x,t):
return [scipy.interpolate.griddata(x,vx),scipy.interpolate.griddata(x,vy)]