如何解决Lmfit中的NaN值错误

时间:2018-07-27 12:04:02

标签: python lmfit

我正在尝试使用Lmfit库拟合一组数据。

下面是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
from lmfit import Parameters

def DGauss3Par(x,I1,sigma1,sigma2):
    I2 = 2.63 - I1
    return (I1/np.sqrt(2*np.pi*sigma1))*np.exp(-(x*x)/(2*sigma1*sigma1)) + (I2/np.sqrt(2*np.pi*sigma2))*np.exp(-(x*x)/(2*sigma2*sigma2))

#TAKE DATA
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)

xGauss = xFull[:]["xFull"]
yGauss = yFull[:]["yFull"]

#MODEL'S DEFINITION
gmodel = Model(DGauss3Par)
params = Parameters()
params.add('I1', value=1.66)
params.add('sigma1', value=1.04)
params.add('sigma2', value=1.2)
result3 = gmodel.fit(yGauss, x=xGauss, params=params)

#PLOTS
plt.plot(xGauss, result3.best_fit, 'y-')
plt.show()

运行它时,出现此错误:

File "Overlap.py", line 133, in <module>
    result3 = gmodel.fit(yGauss, x=xGauss, params=params)
ValueError: The input contains nan values

这些是xGauss中包含的数据值:

[-3.88 -3.28 -3.13 -3.08 -3.03 -2.98 -2.93 -2.88 -2.83 -2.78 -2.73 -2.68
 -2.63 -2.58 -2.53 -2.48 -2.43 -2.38 -2.33 -2.28 -2.23 -2.18 -2.13 -2.08
 -2.03 -1.98 -1.93 -1.88 -1.83 -1.78 -1.73 -1.68 -1.63 -1.58 -1.53 -1.48
 -1.43 -1.38 -1.33 -1.28 -1.23 -1.18 -1.13 -1.08 -1.03 -0.98 -0.93 -0.88
 -0.83 -0.78 -0.73 -0.68 -0.63 -0.58 -0.53 -0.48 -0.43 -0.38 -0.33 -0.28
 -0.23 -0.18 -0.13 -0.08 -0.03  0.03  0.08  0.13  0.18  0.23  0.28  0.33
  0.38  0.43  0.48  0.53  0.58  0.63  0.68  0.73  0.78  0.83  0.88  0.93
  0.98  1.03  1.08  1.13  1.18  1.23  1.28  1.33  1.38  1.43  1.48  1.53
  1.58  1.63  1.68  1.73  1.78  1.83  1.88  1.93  1.98  2.03  2.08  2.13
  2.18  2.23  2.28  2.33  2.38  2.43  2.48  2.53  2.58  2.63  2.68  2.73
  2.78  2.83  2.88  2.93  2.98  3.03  3.08  3.13  3.28  3.88]

这些是yGauss中的:

[0.00173977 0.00986279 0.01529543 0.0242624  0.0287456  0.03238484
 0.03285927 0.03945234 0.04615091 0.05701618 0.0637672  0.07194268
 0.07763934 0.08565687 0.09615262 0.1043281  0.11350606 0.1199406
 0.1260062  0.14093328 0.15079665 0.16651464 0.18065023 0.1938894
 0.2047541  0.21794024 0.22806706 0.23793043 0.25164404 0.2635118
 0.28075974 0.29568682 0.30871501 0.3311846  0.34648062 0.36984661
 0.38540666 0.40618835 0.4283945  0.45002014 0.48303911 0.50746062
 0.53167057 0.5548792  0.57835128 0.60256181 0.62566436 0.65704847
 0.68289386 0.71332794 0.73258027 0.769608   0.78769989 0.81407275
 0.83358852 0.85210239 0.87109068 0.89456217 0.91618782 0.93760247
 0.95680234 0.96919757 0.9783219  0.98486193 0.9931429  0.9931429
 0.98486193 0.9783219  0.96919757 0.95680234 0.93760247 0.91618782
 0.89456217 0.87109068 0.85210239 0.83358852 0.81407275 0.78769989
 0.769608   0.73258027 0.71332794 0.68289386 0.65704847 0.62566436
 0.60256181 0.57835128 0.5548792  0.53167057 0.50746062 0.48303911
 0.45002014 0.4283945  0.40618835 0.38540666 0.36984661 0.34648062
 0.3311846  0.30871501 0.29568682 0.28075974 0.2635118  0.25164404
 0.23793043 0.22806706 0.21794024 0.2047541  0.1938894  0.18065023
 0.16651464 0.15079665 0.14093328 0.1260062  0.1199406  0.11350606
 0.1043281  0.09615262 0.08565687 0.07763934 0.07194268 0.0637672
 0.05701618 0.04615091 0.03945234 0.03285927 0.03238484 0.0287456
 0.0242624  0.01529543 0.00986279 0.00173977]

我还尝试打印函数返回的值:

params = Parameters()
params.add('I1', value=1.66)
params.add('sigma1', value=1.04)
params.add('sigma2', value=1.2)
func = DGauss3Par(xGauss,I1,sigma1,sigma2)
print func

我得到了:

[0.04835225 0.06938855 0.07735839 0.08040181 0.08366964 0.08718237
 0.09096169 0.09503048 0.0994128  0.10413374 0.10921938 0.11469669
 0.12059333 0.12693754 0.13375795 0.14108333 0.14894236 0.15736337
 0.16637406 0.17600115 0.18627003 0.19720444 0.20882607 0.22115413
 0.23420498 0.24799173 0.26252377 0.27780639 0.29384037 0.3106216
 0.32814069 0.34638266 0.3653266  0.38494543 0.40520569 0.42606735
 0.44748374 0.46940149 0.49176057 0.51449442 0.5375301  0.56078857
 0.58418507 0.60762948 0.63102687 0.65427809 0.6772804  0.69992818
 0.72211377 0.74372824 0.76466232 0.78480729 0.80405595 0.82230355
 0.83944875 0.85539458 0.87004937 0.88332762 0.89515085 0.90544838
 0.91415806 0.92122688 0.92661155 0.93027889 0.93220625 0.93220625
 0.93027889 0.92661155 0.92122688 0.91415806 0.90544838 0.89515085
 0.88332762 0.87004937 0.85539458 0.83944875 0.82230355 0.80405595
 0.78480729 0.76466232 0.74372824 0.72211377 0.69992818 0.6772804
 0.65427809 0.63102687 0.60762948 0.58418507 0.56078857 0.5375301
 0.51449442 0.49176057 0.46940149 0.44748374 0.42606735 0.40520569
 0.38494543 0.3653266  0.34638266 0.32814069 0.3106216  0.29384037
 0.27780639 0.26252377 0.24799173 0.23420498 0.22115413 0.20882607
 0.19720444 0.18627003 0.17600115 0.16637406 0.15736337 0.14894236
 0.14108333 0.13375795 0.12693754 0.12059333 0.11469669 0.10921938
 0.10413374 0.0994128  0.09503048 0.09096169 0.08718237 0.08366964
 0.08040181 0.07735839 0.06938855 0.04835225]

似乎没有NaN值,所以我不明白它是出于什么原因返回该错误的。 有人可以帮我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如果您将打印功能添加到拟合功能中,然后打印出sigma1sigma2,您会发现

    在错误发生之前,已经对
  • DGauss3Par进行了几次评估。
  • 发生错误时,两个sigma变量的值为负。

采用负值的平方根当然会导致NaN

您应该为minsigma1参数添加一个约束sigma2或与之类似,以防止出现这种情况。将min=0.0用作params.add(...)的附加参数将很适合。

请注意,对于某些分析,为拟合参数设置明确的界限可能会使这些分析无效。在大多数情况下,您会没事的,但在某些情况下,您需要检查是否应让拟合参数从负无穷大变化到正无穷大,或者允许有界。