Я хочу подогнать лоренцев пик к набору данных x и y, данные в порядке. Другие программы, такие как OriginLab, идеально подходят для этого, но я хотел автоматизировать настройку с помощью Python, поэтому у меня есть приведенный ниже код, основанный на http://mesa.ac.nz/?page_id=1800
Проблема, с которой я сталкиваюсь, заключается в том, что scipy.optimize.leastsq возвращает как наилучшее соответствие тем же начальным параметрам предположения, которые я ему передал, по сути ничего не делая. Вот код.
#x, y are the arrays with the x,y axes respectively
#defining funcitons
def lorentzian(x,p):
return p[2]*(p[0]**2)/(( x - (p[1]) )**2 + p[0]**2)
def residuals(p,y,x):
err = y - lorentzian(x,p)
return err
p = [0.055, wv[midIdx], y[midIdx-minIdx]]
pbest = leastsq(residuals, p, args=(y, x), full_output=1)
best_parameters = pbest[0]
print p
print pbest
p — начальные предположения, а best_parameters — возвращаемые параметры «наилучшего соответствия» из наименьшего квадрата, но они всегда одинаковы.
это то, что возвращает full_output=1 (длинные числовые массивы были сокращены, но по-прежнему репрезентативны)
[0.055, 855.50732, 1327.0]
(array([ 5.50000000e-02, 8.55507324e+02, 1.32700000e+03]),
None, {'qtf':array([ 62.05192947, 69.98033905, 57.90628052]),
'nfev': 4,
'fjac': array([[-0., 0., 0., 0., 0., 0., 0.,],
[ 0., -0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.],
[ 0., 0., -0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0.]]),
'fvec': array([ 62.05192947, 69.98033905,
53.41218567, 45.49879837, 49.58242035, 36.66483688,
34.74443436, 50.82238007, 34.89669037]),
'ipvt': array([1, 2, 3])},
'The cosine of the angle between func(x) and any column of the\n Jacobian
is at most 0.000000 in absolute value', 4)
кто-нибудь может увидеть, что не так?
full_output=1
? Может есть намек... - person seberg   schedule 18.09.2012