这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
def gaussian(x, amp, cen, wid):
"""1-d gaussian: gaussian(x, amp, cen, wid)"""
return (amp / (np.sqrt(2*np.pi*wid)) * np.exp(-(x-cen)**2 / (2*wid**2)))
xFull = []
yFull = []
fileTypex = np.dtype([('xFull', np.float)])
fileTypey = np.dtype([('yFull', np.float)])
fDatax = "xValue.dat"
fDatay = "yValue.dat"
xFull = np.loadtxt(fDatax, dtype=fileTypex)
yFull = np.loadtxt(fDatay, dtype=fileTypey)
TailCoreLim1 = 40
TailCoreLim2 = 100
xCore = xFull[TailCoreLim1:TailCoreLim2]["xFull"]
yCore = yFull[TailCoreLim1:TailCoreLim2]["yFull"]
fileTypeCore = np.dtype([('Par', np.float)])
CoreFile = "CorePopt.dat"
CoreVal = np.loadtxt(CoreFile, dtype=fileTypeCore)
CoreI = CoreVal[0:1]["Par"]
CoreSig = CoreVal[1:2]["Par"]
gmodel = Model(gaussian)
result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)
plt.plot(xCore, yCore, 'bo')
plt.plot(xCore, result.best_fit, 'r-')
print 'CORE REPORT:'
print 'I1 = ', CoreI
print 'Sigma1 = ', CoreSig
print(result.fit_report())
xTailsx = xFull[0:(TailCoreLim1)]["xFull"]
yTailsx = yFull[0:(TailCoreLim1)]["yFull"]
fileTypeTail = np.dtype([('Par', np.float)])
TailFile = "TailPopt.dat"
TailVal = np.loadtxt(TailFile, dtype=fileTypeTail)
TailI = TailVal[0:1]["Par"]
TailSig = TailVal[1:2]["Par"]
gmodel = Model(gaussian)
result = gmodel.fit(yTailsx, x=xTailsx, amp=1.12567603, cen=0, wid=3.01133102)
plt.plot(xTailsx, yTailsx, 'bo')
plt.plot(xTailsx, result.best_fit, 'r-')
xTaildx = xFull[(TailCoreLim2):140]["xFull"]
yTaildx = yFull[(TailCoreLim2):140]["yFull"]
gmodel = Model(gaussian)
result = gmodel.fit(yTaildx, x=xTaildx, amp=1.12567603, cen=0, wid=3.01133102)
plt.plot(xTaildx, yTaildx, 'bo')
plt.plot(xTaildx, result.best_fit, 'r-')
print 'TAIL REPORT:'
print 'I2 = ', TailI
print 'Sigma2 = ', TailSig
print(result.fit_report())
plt.show()
运行它时,它返回以下错误: ValueError:输入包含nan值,并参考以下行:
result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)
此外,如果在高斯函数的定义中,我更改了该值,那么它将以这种方式返回:
return (amp / (np.sqrt(2*np.pi) * wid)) * np.exp(-(x-cen)**2 / (2*wid**2))
然后我尝试运行该脚本,该脚本可以正常运行。
谁能解释我的问题在哪里?谢谢!
答案 0 :(得分:0)
您的示例中包含许多多余和不必要的代码,这使其很难遵循。但是,从本质上讲,您正在做(或可以轻松地减少代码以使自己在做):
xFull = np.loadtxt("xValue.dat", dtype=np.float)
yFull = np.loadtxt("yValue.dat", dtype=np.float)
xCore = xFull[40:100]
yCore = yFull[40:100]
gmodel = Model(gaussian)
result = gmodel.fit(yCore, x=xCore, amp=1.09054634, cen=0, wid=2.47388884)
NaN可能由于wid
的某个很小的值(接近零)而出现,尽管我认为这不太可能-我不记得曾经见过这种情况。
或者NaN可能来自您的数据-我已经看过很多次了,您的代码看起来非常专注于处理数据。
因此,请首先确认您的数据xCore
和yCore
不包含NaN。在处理数据时,可以绘制数据并验证其是否类似于高斯模型,并且amp
,cen
和wid
的初始值不会偏离。< / p>
如果一切正常,并且仍然无法满足NaN ValueError的要求,请在gaussian()
函数中打印出值,以尝试了解导致NaN的参数值。