Нелинейный метод наименьших квадратов Подгонка двух независимых переменных с помощью lmfit

Я делаю физический эксперимент с участием 6 детекторов. для каждого детектора у меня есть положение и время, когда он был поражен (x, y, t). Конечная цель моего эксперимента — найти два угла θ, φ.

Если сработали 3 детектора, я могу вычислить углы аналитически. если более 3 попаданий, то я должен сначала взять первые 3 сигнала, вычислить θ_0 , φ_0 аналитически, а затем использовать их в качестве начальных значений для выполнения нелинейного метода наименьших квадратов и минимизировать следующую функцию:

Я пытаюсь сделать это с помощью lmfit минимизировать.() У меня есть три массива: x, y, t, содержащие положения и время детектора, чтобы установить их в качестве параметров. и начальные значения для углов. Но я знаю только, как выполнить минимизацию для одной переменной. Не могли бы вы предложить способ минимизировать как θ, так и φ?

вот что я пробовал до сих пор, весь код слишком велик, но я надеюсь, что эти части помогут:

    #define function to be minimized
    
    def func(params ,x,y,t):
        res = 0
        th = params['theta']
        ph = params['phi']
        
        for i in range(6):
            
            res += ((-x[i]*np.sin(th)*np.cos(ph) - \
                     y[i] *np.sin(th)*np.sin(ph)- c*t[i])**2) \
                     / ( np.sin(th)**2 * sigma_pos**2 + c**2 * sigma_t**2)
            
        return res

 # least squares fitting 
               
 params = Parameters()
            
 params.add('theta', value = theta , vary = True, min = 0, max = 90  )
 params.add('phi', value = phi , vary = True, min = -180, max = 180 )
                    
                
                
 minner = Minimizer(func, params, fcn_args=(x,y,t))
 result = minner.minimize()
                

 # write error report
 report_fit(result)

я получаю следующее сообщение об ошибке:


person Konstantina    schedule 12.09.2020    source источник
comment
Пожалуйста, включите тег соответствующего языка и код, если это возможно. В противном случае вы можете опубликовать это в обмене стеками компьютерных наук.   -  person pygeek    schedule 13.09.2020
comment
да, вы можете использовать несколько независимых переменных с lmfit - вы можете передать любое количество объектов в функцию, которая будет минимизирована. Всегда лучше начинать с примера кода того, что вы пробовали и с чем у вас возникли проблемы. Приведите полный, но минимальный пример кода, а также полный вывод и трассировку. Как оказалось, это не только нужно для помощи от случайных людей на StackOverflow, но и очень хороший способ найти ошибки в ваших собственных сценариях.   -  person M Newville    schedule 13.09.2020


Ответы (1)


Сообщение, которое вы получаете:

TypeError: Improper input: N=2 must not exceed M=1

говорит (правда, очень загадочно), что вы пытаетесь уточнить 2 переменные (N), но возвращаете только 1 значение (M).

И это потому, что вы сами выполняете цикл над своим остатком. Попробуйте вернуть массив для минимизации по методу наименьших квадратов. То есть вернуть массив для метода, чтобы возвести его в квадрат и суммировать. Оказывается, должно быть проще:

def func(params ,x,y,t):
    th = params['theta']
    ph = params['phi']     
    demon = np.sqrt(np.sin(th)**2 * sigma_pos**2 + c**2 * sigma_t**2))
    return (-x*np.sin(th)*np.cos(ph) - y*np.sin(th)*np.sin(ph)- c*t)**2) / denom

хорошо, вы можете проверить, что sigma_pos, sigma_t и c определены и что demon не может быть 0.

person M Newville    schedule 13.09.2020