Интересувах се от интегриране на векторно поле (т.е. намиране на рационализация) за дадена начална точка с помощта на библиотеката 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 ?
Последният оператор за връщане е просто някакъв псевдо код. Но основно това е, което търся.
Редактиране:
scipy.interpolate.griddata изглежда е правилният начин. Възможно ли е да го включите в самата функция? Нещо в редовете на това:
def f(x,t):
return [scipy.interpolate.griddata(x,vx),scipy.interpolate.griddata(x,vy)]