考虑一个函数A(x(z, y), y(z))
。我想从任意(x, y)
开始,然后沿着z
走。我有
dy/dz = 1
dx/dz = z y(1-x)/(y(y+z))
。对于epsilon z
,这会给出y(1-x)/(yy)
现在,采取以下离散化:
import numpy as np
x = np.linspace(0.01, 0.99, 100)
y = np.linspace(0.5, 2, 50)
X, Y = np.meshgrid(x, y, indexing='ij')
A = X*Y
d = Y*(1-X)/(Y*Y)
现在,A
是(x
,y
)中的二维函数:
A.shape
Out[25]: (100, 50)
通过构造在两个方面都在增加。
现在,从A
的每个起点开始,我想沿(d
,1)向量走,直到我达到{{1}以上的值}。我生成的矩阵1.5
与R
形状相同,应该包含A
维度中的网格点数。如果我从未达到该值(即y
< A
的相应边界),则任何可区分的输出(例如1.5
)都会很棒。
由于这很难手动完成,我无法给出准确的预期输出。但是,例如,取网格点nan
。让我们说在那个社区,(85, 20)
大致(实际上是0.13)。这意味着我想在本地沿着(1,10)对角线移动,直到我到达d=0.1
。在这种情况下,我想从A : A >= 1.5
走到A[85, 20]
,A[85+2, 20+20]
上方的第一个点,值为
1.5
所以,我沿着A[85+2, 20+20]
Out[51]: 1.5023964131106988
走了20个网格点。这意味着我生成的矩阵z
具有R
。
我对高效率的方式感兴趣,以及表现更差但更精确的解决方案。无论如何,我的解决方案必须以给定的矩阵为基础。
为了更加直观地了解我正在努力实现的目标,请考虑R[85, 20] == 20
。在那种情况下,我可以简单地
dx/dz = 0
但是,在我的例子中,我不能positive = A > 1.5
iX, iY = np.meshgrid(np.arange(100), np.arange(50), indexing='ij')
gridsMove = positive.argmax(axis=1)[:, np.newaxis]
R = np.maximum(gridsMove-iY, 0).astype(float)
# prune those here where we never arrive (argmax yields `0`, non robust test but works here)
R[gridsMove.repeat(50, axis=1) == 0] = np.nan
,因为我走的是多个轴。我必须做argmax(axis=1)
或类似的事情......