我需要找到广义状态空间的根源。也就是说,我有一个离散的维度网格,grid=AxBx(...)xX
我事先不知道它有多少维度(该解决方案应该适用于任何维度grid.size
)。
我想使用二分法找到内部f(z) = 0
每个状态的根 () 。说包含,我知道。然后我需要z
grid
remainder
f(z)
f'(z) < 0
z
如果remainder
> 0则增加z
如果remainder
< 0则减少
Wlog,说history
形状矩阵(grid.shape, T)
包含网格中每个点的早期值的历史,z
我需要增加z
(因为remainder
> 0)。然后我需要在zAlternative
里面选择history[z, :]
“最小的,大于z
”。在伪代码中,即:
zAlternative = hist[z,:][hist[z,:] > z].min()
我早些时候问过这个问题。我得到的解决方案是
b = sort(history[..., :-1], axis=-1)
mask = b > history[..., -1:]
index = argmax(mask, axis=-1)
indices = tuple([arange(j) for j in b.shape[:-1]])
indices = meshgrid(*indices, indexing='ij', sparse=True)
indices.append(index)
indices = tuple(indices)
lowerZ = history[indices]
b = sort(history[..., :-1], axis=-1)
mask = b <= history[..., -1:]
index = argmax(mask, axis=-1)
indices = tuple([arange(j) for j in b.shape[:-1]])
indices = meshgrid(*indices, indexing='ij', sparse=True)
indices.append(index)
indices = tuple(indices)
higherZ = history[indices]
newZ = history[..., -1]
criterion = 0.05
increase = remainder > 0 + criterion
decrease = remainder < 0 - criterion
newZ[increase] = 0.5*(newZ[increase] + higherZ[increase])
newZ[decrease] = 0.5*(newZ[decrease] + lowerZ[decrease])
但是,此代码不再为我工作。承认这一点让我感到非常难过,但我从不理解索引正在发生的魔力,因此很遗憾我需要帮助。
代码实际上做了什么,它给了我最低的和最高的。也就是说,如果我修复两个特定z
值:
history[z1] = array([0.3, 0.2, 0.1])
history[z2] = array([0.1, 0.2, 0.3])
我会得到higherZ[z1]
=0.3
和lowerZ[z2] = 0.1
,也就是极值。这两种情况的正确值都是0.2
. 这里出了什么问题?
如果需要,为了生成测试数据,您可以使用类似的东西
history = tile(array([0.1, 0.3, 0.2, 0.15, 0.13])[newaxis,newaxis,:], (10, 20, 1))
remainder = -1*ones((10, 20))
测试第二种情况。
预期结果
我调整了history
上面的变量,以提供向上和向下的测试用例。预期结果是
lowerZ = 0.1 * ones((10,20))
higherZ = 0.15 * ones((10,20))
也就是说,对于z
历史 [z, :] 中的每个点,下一个最高的先前值 ( higherZ
) 和下一个最小的先前值 ( lowerZ
)。由于所有点z
都具有完全相同的历史 ( [0.1, 0.3, 0.2, 0.15, 0.13]
),因此它们都将具有相同的lowerZ
和值higherZ
。当然,一般来说,每个矩阵的历史z
都是不同的,因此两个矩阵在每个网格点上都可能包含不同的值。