2012-09-18 27 views
4

我想將洛倫茲峯擬合成一組數據x和y,數據很好。像OriginLab其他程序適合它完美,但我想用python自動化配件,所以我有下面的代碼是基於http://mesa.ac.nz/?page_id=1800scipy.optimize.leastsq返回最佳猜測參數不是新的最佳擬合

我遇到的問題是,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是返回的「最佳擬合」從leastsq參數,但他們都是一樣的。

這就是返回由full_output = 1(長數字陣列已經縮短,但仍representitive)

[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) 

任何人都可以看到最新錯了嗎?

+0

「full_output = 1」中返回的信息說什麼?可能有一個提示... – seberg

+0

更新添加,並拿出我檢查的代碼冗餘的問題 –

回答

5

在與數據是單精度問題快速谷歌搜索提示(其他程序幾乎可以肯定上溯造型爲雙精度過,雖然這明確地是SciPy的問題爲好,又見這bug report)。如果你看看你的full_output=1結果,你會發現Jacobian在任何地方都近似爲零。 因此,明確給雅可比行可能會有所幫助(儘管即使這樣你也可能想要向上傾斜,因爲用單精度獲得的相對誤差的最小精度非常有限)。

解決方案:最容易和數值最佳的解決方案(當然給真正的雅可比也有獎金)是隻投你xy數據爲雙精度(x = x.astype(np.float64)將例如做)。

我不會建議這樣做,但您也可以通過手動設置epsfcn關鍵字參數(也可能是容差關鍵字參數)來解決問題,例如epsfcn=np.finfo(np.float32).eps。這似乎是以某種方式解決了這個問題,但是(因爲大多數計算都是用標量,而標量不會在你的計算中強制推算),所以計算在float32中完成,並且精度損失似乎相當大,至少在沒有提供Dfunc。

+0

優秀,這對我來說工作非常好! – astromax