Python 时差计算,scipy最小化过冲
我试图用时差法在坐标系中找到声源的位置 我们有一个costfunction,如下所示:Python 时差计算,scipy最小化过冲,python,optimization,scipy,calculation,Python,Optimization,Scipy,Calculation,我试图用时差法在坐标系中找到声源的位置 我们有一个costfunction,如下所示: 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 i
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)
我们的传感器位置是
b = [-2, 2,0]
c = [2,-2,0]
d = [2,2,0]
e = [0,0,2]
我们在x、y和z的范围内模拟了-50到50以及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中提供,可能速度较慢,但您会对结果更有信心
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')