输入不正确:N = 3不得超过M = 1(尝试拟合高斯函数时出错)

时间:2018-02-06 07:50:47

标签: python curve-fitting

我对python和曲线拟合很陌生,目前我试图用高斯

来拟合下图

enter image description here

我跟随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

这个错误是因为我试图将数组中的值插入参数??

非常感谢任何帮助。

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)

虽然我不清楚你附上的情节中使用了什么数据。

另外:您可能希望根据数据为ampcenwid提供初始值。您的SFGpeakY可能是amp的一个不错的猜测,而SFGX.mean()SFGX.std()可能是不错的猜测或cenwid

另外:您将result.init_fit标记为“Gaussian Fit”。 result.init_fit将是使用参数的初始值评估的模型。精确参数的最佳拟合将在result.best_fit