Python 时差计算,scipy最小化过冲

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

我试图用时差法在坐标系中找到声源的位置

我们有一个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 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')