时差计算,scipy有时会最小化超调



我正在尝试使用时差来查找坐标系中的声源位置。

我们有一个成本函数如下:

def costfunction(point, meas_list, dims=2):
#### Cost function to be fed into the scipy.optimize.minimize function
#### For a candidate point, calculates the time differences, compares it
#### to data
error = 0
for m in meas_list:
actualdiff = m.delta
calcdiff = (
m.soundpointB.dist(point, dims=dims)
- m.soundpointA.dist(point, dims=dims)
)

error += (actualdiff - calcdiff) ** 2

return(error)
soundpointB.dist #---> is to calculate the distance between sensors

我们的传感器位置是

b = [-2, 2,0]
c = [2,-2,0]
d = [2,2,0]
e = [0,0,2]

我们模拟了x、y中-50到50以及z中0到-20范围内的随机源模拟将产生从源到每个传感器的时间差。

所以我们有成本函数来计算均方误差然后我们使用scipy最小化来找出的最佳解决方案

startpoint = np.array([0,0,0])
dims = 3
result = minimize(
fun=costfunction,
x0=startpoint,
args=(meas_list, dims),
method='BFGS',
options={
'gtol': 1e-06,
'return_all':True,
'norm':inf},
jac='2-point')

由于大多数计算都很好,实际位置和时差计算位置之间的%误差为+-10%

然而,对于某些位置,如[-30.0,0.5,-6.0],时差计算返回[-325.07,5.49,-64.73]

当我们检查scipy最小化的所有结果时。它似乎已经找到了位置,但它超调了。

有人知道如何让它变得更好吗?或者有什么需要纠正的地方?

BFGS除了本地最小值外,不会保证任何东西。如果你知道你的传感器总是在-50到50和-2到2之间,那么我建议:

  • 作为第一步,尝试有界局部最小化-使用L-BFGS-B、SLSQP等…并给变量这些边界
  • 如果以上还不够令人满意,那就拿出大炮,尝试全局优化算法,如SHGO、差分进化、对偶退火。它们都在SciPy中可用,可能会更慢,但你会对自己的结果更有信心

相关内容

  • 没有找到相关文章