我有一个代表反抛物线的数组,我想找到数组中任意位置的最大值。在我的应用程序中,我不能采取衍生物,我必须循环数组。 我通过从左边开始迭代数组来实现这一点,直到我得到一个低于前一次迭代的值:
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循环中的代码。 我编辑了代码以更好地解释我的意思。
答案 0 :(得分:0)
您要做的是网格搜索。您需要定义搜索网格点(此处为&#39; x&#39;)并计算这些点的抛物线的所有值(此处为&#39; y&#39;)。您可以使用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
答案 1 :(得分:0)
反抛物线(以均匀间隔的点采样)具有相邻点之间的差异总是减小的特性。最大值就在差异变为负值之前。
如果前两个点之间的差值为负或零,则最大值是数组中的第一个点。
否则,进行二分搜索以找到两个相邻点之间的最小正差。最大值将是这两点中的第二点。
答案 2 :(得分:0)
我编辑这篇文章希望问题现在更清楚了。
答案 3 :(得分:0)
您正在寻找的内容称为&#34;三元搜索&#34;:https://en.wikipedia.org/wiki/Ternary_search
它可以找到任何函数 f(x)的最大值,其中有一个增加的部分,可能后跟一个全部相等的部分,然后是一个递减的部分。
给定界限低和高,选择2点 m1 =低+(高 - 低)/ 3 和 m2 =低+(高 - 低)* 2/3 。
然后,如果 f(m1)> f(m2),您知道最大值是 x <= m2 ,因为 m2 不能增加部分。所以设置 high = m2 然后重试。
否则,您知道最大值位于 x&gt; = m1 ,因此设置 low = m1 并重试。
重复直到高 - 低&lt; 3 ,然后选择这些值中最大的一个。