我对python和曲线拟合很陌生,目前我试图用高斯
来拟合下图我跟随this tutorial,我的代码看起来像这样
import numpy as np
import matplotlib.pyplot as plt
from pylab import genfromtxt
from matplotlib import pyplot
from numpy import sqrt, pi, exp, linspace,loadtxt
from lmfit import Model
def gaussian(x,amp,cen,wid):
"1-d gaussian: gaussian(x,amp,cen,wid)"
return (amp/(sqrt(2*pi)*wid))*exp(-(x-cen)**2/(2*wid**2))
filelist=[]
time=[0.00,-1.33,-2.67,-4.00,-5.33,-6.67,1.13,2.67,4.00,5.33,6.67]
index=0
offset=0
filelist.append('0.asc')
for i in range(1,6):
filelist.append("-%s00.asc" %(i))
for i in range(1,6):
filelist.append("+%s00.asc" %(i))
sfgpeaks=[]
for fname in filelist:
data=np.genfromtxt(fname,delimiter=',',unpack=True,skip_footer=20)
SFGX=data[0,500:530]
SFGY=data[1,500:530]
SFGpeakY=np.max(SFGY)
sfgpeaks.append(SFGpeakY)
gmodel = Model(gaussian)
result = gmodel.fit(SFGpeakY, x=time[index], amp=5,cen=5,wid=3)
plt.plot(time[index],sfgpeaks[index],'ro')
plt.plot(time[index],result.init_fit, 'k--',label="Gaussian Fit")
plt.xticks(time)
index=index+1
print(pump2SHGX)
pyplot.title("Time Delay-SFG peak")
plt.xlabel("Timedelay[ps]")
plt.ylabel("Counts[arb.unit]")
plt.savefig("796and804nmtimesfg")
plt.legend(bbox_to_anchor=(1.0,0.5))
plt.show()
但是,当我尝试将我拥有的数据(时间延迟和上图中的Y值)添加到高斯参数中时,我收到错误。 我得到的错误就是这个
TypeError:输入不正确:N = 3不得超过M = 1
这个错误是因为我试图将数组中的值插入参数??
非常感谢任何帮助。
答案 0 :(得分:1)
你有
result = gmodel.fit(SFGpeakY, x=time[index], amp=5,cen=5,wid=3)
将1个值作为x
传递,将1个值作为数据传递。然后在该点评估该模型。错误信息是抱怨您有3个变量和1个值。
您可能希望将SFGY
设置为x
,
SFGX
适合
result = gmodel.fit(SFGY, x=SFGX, amp=5,cen=5,wid=3)
虽然我不清楚你附上的情节中使用了什么数据。
另外:您可能希望根据数据为amp
,cen
和wid
提供初始值。您的SFGpeakY
可能是amp
的一个不错的猜测,而SFGX.mean()
和SFGX.std()
可能是不错的猜测或cen
和wid
。
另外:您将result.init_fit
标记为“Gaussian Fit”。 result.init_fit
将是使用参数的初始值评估的模型。精确参数的最佳拟合将在result.best_fit
。