scipy Python流线算法

osh3o9ms  于 2023-02-16  发布在  Python
关注(0)|答案(1)|浏览(121)
    • 目标:**

我有两个表示速度分量的数组vxvy,我想写一个流线算法:
1.输入点的坐标(seed
1.根据输入点的速度分量评估输入点路径上的像素
1.返回seed点路径中各点的索引

    • 问题:**

我最初写了一个欧拉正演算法,但它很难解决我的问题。我被建议把我的问题看作一个常微分方程(ODE),其中dx/dt = v_x(t)和dy/dt = v_y(t)。我可以interpolate我的速度,但与solving的斗争与Scipy的ODE。我该怎么做呢?

    • 自制算法:**

我有两个数组vxvy表示速度分量。当一个数组有NaN时,另一个数组也有。我有一个起点,seed点。我想根据速度分量跟踪这个点经过了哪些单元格。我对速度分量vxvy进行插值,以便将它们输入到ODE解算器中。

    • 示例:**

这段代码测试了一个10x11速度数组的算法。我在ODE解算器处受阻。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import RegularGridInterpolator
from scipy.integrate import odeint

# Create coordinates
x = np.linspace(0, 10, 100)
y = np.linspace(11, 20, 90)
Y, X = np.meshgrid(x, y)

# Create velocity fields
vx = -1 - X**2 + Y
vy = 1 + X - Y**2

# Seed point
J = 5
I = 14

# Interpolate the velocity fields
interpvx = RegularGridInterpolator((y,x), vx)
interpvy = RegularGridInterpolator((y,x), vy)

# Solve the ODE to get the point's path, but I don't know what to put for the parameter t
#solx = odeint(interpvx, interpvx((I,J)), np.linspace(0,1,501))
#soly = odeint(interpvy, interpvx((I,J)), np.linspace(0,1,501))
tnkciper

tnkciper1#

我的一个同事提出了一个解决方案,我并不认为这是我的功劳,但考虑到Python没有流线型算法,希望这对这里的人有用:

import numpy as np
# Create coordinates
x = np.linspace(0, 1000, 100)
y = np.linspace(0, 1000, 90)
Y, X = np.meshgrid(x, y)

# Create velocity fields
vx = -1 - X**2 + Y
vy = 1 + X - Y**2

# Seed point
J = 5
I = 14

# Interpolate the velocities
from scipy.interpolate import RegularGridInterpolator
X, Y = np.meshgrid(x,y)
fx = RegularGridInterpolator((y, x), vx, bounds_error=False, fill_value=None)
fy = RegularGridInterpolator((y, x), vy, bounds_error=False, fill_value=None)

# define the velocity function to be integrated:
def f(t, y):
    return np.squeeze([fy(y), fx(y)])

# Solve for a seed point
from scipy.integrate import solve_ivp
sol = solve_ivp(f, [0, 100], [J,I], t_eval=np.arange(0,100,1))

相关问题