回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我需要创建一个函数,它是np梯度函数的逆函数</p>
<p>其中Vx、Vy阵列(速度分量向量)为输入,输出为数据点x、y处的反导数阵列(到达时间)</p>
<p>我在(x,y)网格上有数据,每个点都有标量值(时间)</p>
<p>我使用了numpy梯度函数和线性插值来确定每个点的梯度向量<strong>速度<strong>(Vx,Vy)(见下文)</p>
<p>我通过以下方式实现了这一目标:</p>
<pre><code> #LinearTriInterpolator applied to a delaunay triangular mesh
LTI= LinearTriInterpolator(masked_triang, time_array)
#Gradient requested at the mesh nodes:
(Vx, Vy) = LTI.gradient(triang.x, triang.y)
</code></pre>
<p>下面的第一幅图显示了每个点的速度矢量,点标签表示形成导数(Vx,Vy)的时间值
<a href="https://i.stack.imgur.com/OOoex.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/OOoex.png" alt="Velocity vectors shown at each point with associated time value"/></a></p>
<p>下一幅图显示了导数(Vx,Vy)的<strong>结果标量值<strong>,绘制为带相关节点标签的彩色等高线图</p>
<p><a href="https://i.stack.imgur.com/9MnB2.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9MnB2.png" alt="Derivative scalar plot"/></a></p>
<p>因此,我的挑战是:</p>
<p><strong>我需要逆转这个过程</强></p>
<p>使用梯度向量(Vx,Vy)或结果标量值确定该点的原始时间值</p>
<p>这可能吗</p>
<p>知道numpy.gradient函数是使用内部点的二阶精确中心差分和边界处的一阶或二阶精确单侧(向前或向后)差分计算的,我确信有一个函数可以逆转这个过程</p>
<p>我在想,在原始点(x1,y1处的t=0)到Vx,Vy平面上的任何点(xi,yi)之间取一个直线导数,可以得到速度分量的总和。然后我可以把这个值除以两点之间的距离,得到所用的时间</p>
<p>这种方法有效吗?如果是这样的话,哪个numpy积分函数应用得最好</p>
<p><a href="https://i.stack.imgur.com/9reZY.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9reZY.png" alt="enter image description here"/></a></p>
<p>我的数据示例可以在这里找到[http://www.filedropper.com/calculatearrivaltimefromgradientvalues060820]</p>
<p>非常感谢你的帮助</p>
<p>编辑:</p>
<p>也许这张简图可以帮助我理解我想去的地方。。
<a href="https://i.stack.imgur.com/hqP10.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/hqP10.png" alt="SImplified drawing"/></a></p>
<p>编辑:</p>
<p>感谢@Aguy,他对本规范做出了贡献。。我曾尝试使用间距为0.5 x 0.5m的网格网格来获得更精确的表示,并计算每个网格点的梯度,但我无法正确地将其积分。我也有一些边缘影响,影响结果,我不知道如何纠正</p>
<pre><code>import numpy as np
from scipy import interpolate
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
#Createmesh grid with a spacing of 0.5 x 0.5
stepx = 0.5
stepy = 0.5
xx = np.arange(min(x), max(x), stepx)
yy = np.arange(min(y), max(y), stepy)
xgrid, ygrid = np.meshgrid(xx, yy)
grid_z1 = interpolate.griddata((x,y), Arrival_Time, (xgrid, ygrid), method='linear') #Interpolating the Time values
#Formatdata
X = np.ravel(xgrid)
Y= np.ravel(ygrid)
zs = np.ravel(grid_z1)
Z = zs.reshape(X.shape)
#Calculate Gradient
(dx,dy) = np.gradient(grid_z1) #Find gradient for points on meshgrid
Velocity_dx= dx/stepx #velocity ms/m
Velocity_dy= dy/stepx #velocity ms/m
Resultant = (Velocity_dx**2 + Velocity_dy**2)**0.5 #Resultant scalar value ms/m
Resultant = np.ravel(Resultant)
#Plot Original Data F(X,Y) on the meshgrid
fig = pyplot.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(x,y,Arrival_Time,color='r')
ax.plot_trisurf(X, Y, Z)
ax.set_xlabel('X-Coordinates')
ax.set_ylabel('Y-Coordinates')
ax.set_zlabel('Time (ms)')
pyplot.show()
#Plot the Derivative of f'(X,Y) on the meshgrid
fig = pyplot.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(X,Y,Resultant,color='r',s=0.2)
ax.plot_trisurf(X, Y, Resultant)
ax.set_xlabel('X-Coordinates')
ax.set_ylabel('Y-Coordinates')
ax.set_zlabel('Velocity (ms/m)')
pyplot.show()
#Integrate to compare the original data input
dxintegral = np.nancumsum(Velocity_dx, axis=1)*stepx
dyintegral = np.nancumsum(Velocity_dy, axis=0)*stepy
valintegral = np.ma.zeros(dxintegral.shape)
for i in range(len(yy)):
for j in range(len(xx)):
valintegral[i, j] = np.ma.sum([dxintegral[0, len(xx) // 2],
dyintegral[i, len(yy) // 2], dxintegral[i, j], - dxintegral[i, len(xx) // 2]])
valintegral = valintegral * np.isfinite(dxintegral)
</code></pre>
<p><a href="https://i.stack.imgur.com/5AoON.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/5AoON.png" alt="enter image description here"/></a></p>
<p>现在,np.gradient应用于每个网格节点(dx,dy)=np.gradient(网格_z1)</p>
<p><a href="https://i.stack.imgur.com/ufApE.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ufApE.png" alt="enter image description here"/></a></p>
<p>现在在我的过程中,我将分析上面的梯度值,并进行一些调整(有一些非理想的边缘效果正在创建,我需要纠正),然后将积分值返回到一个与上面所示的f(x,y)非常相似的曲面</p>
<p>我需要一些调整集成功能的帮助:</p>
<pre><code>#Integrate to compare the original data input
dxintegral = np.nancumsum(Velocity_dx, axis=1)*stepx
dyintegral = np.nancumsum(Velocity_dy, axis=0)*stepy
valintegral = np.ma.zeros(dxintegral.shape)
for i in range(len(yy)):
for j in range(len(xx)):
valintegral[i, j] = np.ma.sum([dxintegral[0, len(xx) // 2],
dyintegral[i, len(yy) // 2], dxintegral[i, j], - dxintegral[i, len(xx) // 2]])
valintegral = valintegral * np.isfinite(dxintegral)
</code></pre>
<p>现在我需要计算原始(x,y)点位置的新“时间”值</p>
<p>更新(08-09-20):在@Aguy的帮助下,我得到了一些有希望的结果。结果如下所示(蓝色轮廓表示原始数据,红色轮廓表示综合值)</p>
<p>我仍在研究一种集成方法,可以消除最小(y)和最大(y)区域的误差</p>
<p><a href="https://i.stack.imgur.com/RD3Ce.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RD3Ce.png" alt="Getting closer"/></a></p>
<pre><code>from matplotlib.tri import (Triangulation, UniformTriRefiner,
CubicTriInterpolator,LinearTriInterpolator,TriInterpolator,TriAnalyzer)
import pandas as pd
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate
#-------------------------------------------------------------------------
# STEP 1: Import data from Excel file, and set variables
#-------------------------------------------------------------------------
df_initial = pd.read_excel(
r'C:\Users\morga\PycharmProjects\venv\Development\Trial'
r'.xlsx')
</code></pre>
<p>输入数据可以在这里找到<a href="http://www.filedropper.com/trial-wireup2" rel="nofollow noreferrer">link</a></p>
<pre><code>df_initial = df_initial .sort_values(by='Delay', ascending=True) #Update dataframe and sort by Delay
x = df_initial ['X'].to_numpy()
y = df_initial ['Y'].to_numpy()
Arrival_Time = df_initial ['Delay'].to_numpy()
# Createmesh grid with a spacing of 0.5 x 0.5
stepx = 0.5
stepy = 0.5
xx = np.arange(min(x), max(x), stepx)
yy = np.arange(min(y), max(y), stepy)
xgrid, ygrid = np.meshgrid(xx, yy)
grid_z1 = interpolate.griddata((x, y), Arrival_Time, (xgrid, ygrid), method='linear') # Interpolating the Time values
# Calculate Gradient (velocity ms/m)
(dy, dx) = np.gradient(grid_z1) # Find gradient for points on meshgrid
Velocity_dx = dx / stepx # x velocity component ms/m
Velocity_dy = dy / stepx # y velocity component ms/m
# Integrate to compare the original data input
dxintegral = np.nancumsum(Velocity_dx, axis=1) * stepx
dyintegral = np.nancumsum(Velocity_dy, axis=0) * stepy
valintegral = np.ma.zeros(dxintegral.shape) # Makes an array filled with 0's the same shape as dx integral
for i in range(len(yy)):
for j in range(len(xx)):
valintegral[i, j] = np.ma.sum(
[dxintegral[0, len(xx) // 2], dyintegral[i, len(xx) // 2], dxintegral[i, j], - dxintegral[i, len(xx) // 2]])
valintegral[np.isnan(dx)] = np.nan
min_value = np.nanmin(valintegral)
valintegral = valintegral + (min_value * -1)
##Plot Results
fig = plt.figure()
ax = fig.add_subplot()
ax.scatter(x, y, color='black', s=7, zorder=3)
ax.set_xlabel('X-Coordinates')
ax.set_ylabel('Y-Coordinates')
ax.contour(xgrid, ygrid, valintegral, levels=50, colors='red', zorder=2)
ax.contour(xgrid, ygrid, grid_z1, levels=50, colors='blue', zorder=1)
ax.set_aspect('equal')
plt.show()
</code></pre>