我有一个表示逆抛物线的数组,我想要找到数组中任意位置的最大值。在我的应用程序中,我不能接受导数,我必须遍历数组。我通过迭代数组实现了这一点,从左边开始,直到得到比上一次迭代更低的值:
import numpy as np
def simulation(n):
# create inverse parabola
num = 21
parabola= np.linspace(-8, 12, num=num)
parabola= -np.abs(parabola) ** 2
return parabola[n]
previous_iteration = -1000 # some initialization
for n in range(num):
# Configure the entire system
# Run simulation
# simulation(n) - a function returning simulation result with configuration "n"
simulation_result = simulation(n)
if previous_iteration < simulation_result :
previous_iteration = simulation_result
else:
best_iteration = n-1
break
print(best_iteration)
print(previous_iteration)有更快的方法吗?
编辑:实际实现将在FPGA上进行,每次迭代时,我都必须配置系统并运行仿真,因此每次迭代都要花费大量时间。如果我运行所有可能的配置模拟,我将得到一个抛物线矢量,但这将是耗时和非常低效率。我正在寻找一种方法,以找到最大值,同时产生尽可能少的点。不幸的是,for循环必须保持不变,因为这是系统工作方式的表示。这里的关键是更改for循环中的代码。我编辑代码是为了更好地解释我的意思。
发布于 2018-05-04 12:07:31
逆抛物线(在均匀间隔点取样)具有相邻点之间的差异总是减小的性质。最大值就在差异变为负值之前。
如果前两个点之间的差值为负或零,则最大值是数组中的第一个点。
否则,进行二进制搜索,找出两个相邻点之间最小的正差。最大值将是这两点中的第二点。
发布于 2018-05-04 11:59:01
你想做的就是所谓的网格搜索。您需要定义搜索网格点(在“x”中),并计算这些点的抛物线的所有值(此处为'y')。可以使用np.argmax查找产生最大值的参数的索引:
import numpy as np
# Define inverse parabola
parabola = lambda x: -np.abs(x)**2
# Search axis
x = np.linspace(-8, 12, 21)
# Calculate parabola at each point
y = parabola(x)
# Find argument that yields maximum value
xmax = x[np.argmax(y)]
print(xmax) # Should be 0.0发布于 2018-05-04 13:34:07
我编辑了这篇文章,希望现在问题更清楚了。
https://stackoverflow.com/questions/50174228
复制相似问题