2017-04-05 236 views
0

我想将高斯数据拟合成特定的三项高斯(其中一项中的幅度等于下一项的标准偏差的两倍)。这里是我的尝试:对高斯数据的三项高斯拟合(p​​ython)

import numpy as np 

#from scipy.optimize import curve_fit 
import scipy.optimize as optimize 

import matplotlib.pyplot as plt 

#r=np.linspace(0.0e-15,4e-15, 100) 

data = np.loadtxt('V_lambda_n.dat') 
r = data[:, 0] 
V = data[:, 1] 

def func(x, ps1, ps2, ps3, ps4): 
    return ps1*np.exp(-(x/ps2)**2) + ps2*np.exp(-(x/ps3)**2) + ps3*np.exp(-(x/ps4)**2) 

popt, pcov = optimize.curve_fit(func, r, V, maxfev=10000) 

#params = optimize.curve_fit(func, ps1, ps2, ps3, ps4) 

#[ps1, ps2, ps2, ps4] = params[0] 

p1=plt.plot(r, V, 'bo', label='data') 
p2=plt.plot(r, func(r, *popt), 'r-', label='fit') 

plt.xticks(np.linspace(0, 4, 9, endpoint=True)) 
plt.yticks(np.linspace(-50, 150, 9, endpoint=True)) 
plt.show() 

下面是结果:

enter image description here

我怎么可能会修复此代码,以提高适合?由于

+0

......... popt,pcov = optimize.curve_fit(partial(func,x,ps1,ps2,ps3,ps4),r,V,maxfev = 10000)....? –

+0

嗨@AriGold,当我尝试我得到的错误“名称错误:名称'部分'未定义” – Otto

+0

from functools import partial –

回答

0

随着从SciPy的用户论坛朋友的帮助下,我尝试作为初始猜测如下:

P0 = [V.max(),std_dev,V.max(),2]

这个合适得多了。新飞度是如图所示

enter image description here

我希望配合可以得到比这更好的。