Я делаю физический эксперимент с участием 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)
lmfit
- вы можете передать любое количество объектов в функцию, которая будет минимизирована. Всегда лучше начинать с примера кода того, что вы пробовали и с чем у вас возникли проблемы. Приведите полный, но минимальный пример кода, а также полный вывод и трассировку. Как оказалось, это не только нужно для помощи от случайных людей на StackOverflow, но и очень хороший способ найти ошибки в ваших собственных сценариях. - person M Newville   schedule 13.09.2020