使用scipy.integrate集成向量字段(numpy数组)

不道德的

我对使用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语句只是一些伪代码。但这基本上就是我想要的。

编辑 :

scipy.interpolate.griddata功能似乎是要走的路。是否可以将其合并到自身的功能中?符合以下内容:

    def f(x,t):
        return [scipy.interpolate.griddata(x,vx),scipy.interpolate.griddata(x,vy)]
安德拉斯·迪克(Andras Deak)

我打算建议matplotlib.pyplot.streamplotstart_points1.5.0版开始支持关键字参数,但是它不切实际并且也不准确。

你的代码示例是一个有点混乱,对我说:如果你有vxvy矢量场的坐标,那么你应该有2项目:xy使用这些,您确实可以scipy.interpolate.griddata用来获取平滑的矢量场进行积分,但是当我尝试这样做时,似乎占用了太多内存。这是基于的类似解决方案scipy.interpolate.interp2d

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as interp
import scipy.integrate as integrate

#dummy input from the streamplot demo
y, x = np.mgrid[-3:3:100j, -3:3:100j]
vx = -1 - x**2 + y
vy = 1 + x - y**2

#dfun = lambda x,y: [interp.griddata((x,y),vx,np.array([[x,y]])), interp.griddata((x,y),vy,np.array([[x,y]]))]
dfunx = interp.interp2d(x[:],y[:],vx[:])
dfuny = interp.interp2d(x[:],y[:],vy[:])
dfun = lambda xy,t: [dfunx(xy[0],xy[1])[0], dfuny(xy[0],xy[1])[0]]

p0 = (0.5,0.5)
dt = 0.01
t0 = 0
t1 = 1
t = np.arange(t0,t1+dt,dt)

streamline=integrate.odeint(dfun,p0,t)

#plot it
plt.figure()
plt.plot(streamline[:,0],streamline[:,1])
plt.axis('equal')
mymask = (streamline[:,0].min()*0.9<=x) & (x<=streamline[:,0].max()*1.1) & (streamline[:,1].min()*0.9<=y) & (y<=streamline[:,1].max()*1.1)
plt.quiver(x[mymask],y[mymask],vx[mymask],vy[mymask])
plt.show()

请注意,我使集成网格更加密集以提高精度,但是在这种情况下,它并没有太大变化。

结果:

输出

更新

在发表评论后,我重新探讨了griddata基于原始方法。这样做的原因是,虽然interp2d在为整个数据网格计算griddata插值时仅在给定给定点的点上计算插值,所以在有几个点的情况下,后者应该快得多。

我修复了先前griddata尝试中的错误并提出了

xyarr = np.array(zip(x.flatten(),y.flatten()))
dfun = lambda p,t: [interp.griddata(xyarr,vx.flatten(),np.array([p]))[0], interp.griddata(xyarr,vy.flatten(),np.array([p]))[0]]

与兼容odeint它为p给出的每个计算插值odeint该解决方案不会消耗过多的内存,但是使用上述参数运行花费更长的时间。这可能是由于对dfunin进行了很多评估odeint,远远超过了作为输入的100个时间点所显示的结果。

但是,interp2d即使两种方法都使用默认的linear插值方法,所得的流线也比使用所获得的流线要平滑得多

改善结果

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用scipy.integrate.simps进行集成

来自分类Dev

使用scipy.integrate.quad集成伽玛函数

来自分类Dev

使用scipy.integrate.odeint覆盖ODE集成中的值

来自分类Dev

使用scipy.integrate.quad集成伽玛函数

来自分类Dev

使用 SciPy 的并行 ODE 集成

来自分类Dev

将阶乘与numpy或scipy数组混淆使用

来自分类Dev

将numpy数组与scipy odeint一起使用

来自分类Dev

使用scipy.integrate.dblquad在Python中对x * np.log(x)进行双重集成

来自分类Dev

使用NumPy(或SciPy)裁剪部分图像

来自分类Dev

如何使用SciPy / Numpy过滤/平滑?

来自分类Dev

使用scipy.integrate.complex_ode而不是scipy.integrate.ode

来自分类Dev

如何使用args将数组传递给scipy.integrate.solve_ivp?

来自分类Dev

集成返回数组的函数(使用scipy quad)的pythonic方法是什么?

来自分类Dev

使用Monte Carlo与scipy.integrate.nquad的不同积分结果

来自分类Dev

使用scipy.integrate.quad时结果不连续

来自分类Dev

使用scipy.integrate.odeint时发生TypeError

来自分类Dev

使用scipy.integrate.quad时结果不连续

来自分类Dev

使用numpy数组向量化函数

来自分类Dev

使用SciPy集成本身涉及积分的功能

来自分类Dev

多重集成(使用 Scipy 或其他方式)

来自分类Dev

SciPy:使用b向量数组的元素方式非负最小二乘法

来自分类Dev

使用python numpy或scipy将线性数组插值到非线性数组

来自分类Dev

在大型拆分数组上高效执行numpy.sum(或scipy.integrate.simps())

来自分类Dev

使用SciPy / Numpy在Python中连接稀疏矩阵

来自分类Dev

使用numpy和scipy填充图像上的间隙

来自分类Dev

如何使用SciPy / NumPy查找并去除图像中的白色斑点?

来自分类Dev

在Azure Web角色中使用numpy和scipy

来自分类Dev

使用Numpy或Scipy从邻接矩阵连接的组件

来自分类Dev

使用numpy或scipy优化sympy代码的运行时

Related 相关文章

  1. 1

    使用scipy.integrate.simps进行集成

  2. 2

    使用scipy.integrate.quad集成伽玛函数

  3. 3

    使用scipy.integrate.odeint覆盖ODE集成中的值

  4. 4

    使用scipy.integrate.quad集成伽玛函数

  5. 5

    使用 SciPy 的并行 ODE 集成

  6. 6

    将阶乘与numpy或scipy数组混淆使用

  7. 7

    将numpy数组与scipy odeint一起使用

  8. 8

    使用scipy.integrate.dblquad在Python中对x * np.log(x)进行双重集成

  9. 9

    使用NumPy(或SciPy)裁剪部分图像

  10. 10

    如何使用SciPy / Numpy过滤/平滑?

  11. 11

    使用scipy.integrate.complex_ode而不是scipy.integrate.ode

  12. 12

    如何使用args将数组传递给scipy.integrate.solve_ivp?

  13. 13

    集成返回数组的函数(使用scipy quad)的pythonic方法是什么?

  14. 14

    使用Monte Carlo与scipy.integrate.nquad的不同积分结果

  15. 15

    使用scipy.integrate.quad时结果不连续

  16. 16

    使用scipy.integrate.odeint时发生TypeError

  17. 17

    使用scipy.integrate.quad时结果不连续

  18. 18

    使用numpy数组向量化函数

  19. 19

    使用SciPy集成本身涉及积分的功能

  20. 20

    多重集成(使用 Scipy 或其他方式)

  21. 21

    SciPy:使用b向量数组的元素方式非负最小二乘法

  22. 22

    使用python numpy或scipy将线性数组插值到非线性数组

  23. 23

    在大型拆分数组上高效执行numpy.sum(或scipy.integrate.simps())

  24. 24

    使用SciPy / Numpy在Python中连接稀疏矩阵

  25. 25

    使用numpy和scipy填充图像上的间隙

  26. 26

    如何使用SciPy / NumPy查找并去除图像中的白色斑点?

  27. 27

    在Azure Web角色中使用numpy和scipy

  28. 28

    使用Numpy或Scipy从邻接矩阵连接的组件

  29. 29

    使用numpy或scipy优化sympy代码的运行时

热门标签

归档