我正在尝试分配一个发行版。我使用的模型是:
def quasiParabolic(x, n, sigma):
fact1 = (1/(2*np.pi*sigma))
fact2 =((n+1)/n)
fact = fact1*fact2
pot1 = 1-(1/n)
pot2 = ((x**2)/(2*(sigma**2)))
pot = (pot1*pot2)**n
return fact*pot
使用的代码是:
#DATA NORMALIZATION
areaData = simps(integr, colPosmm)
y_ = integr/areaData
area2 = simps(y_, colPosmm)
print 'Integral normalized data B2',area2
print ''
#LMFIT
gmodel = Model(quasiParabolic)
params = Parameters()
params.add('n', value=2, min=0)
params.add('sigma', value=1, min=0)
# FIT
result3Q = gmodel.fit(y_, x=colPosmm, params=params)
#SAVE PARAMETERS
for param in result3L.params.values():
if param.name == 'n':
nval = param.value
if param.name == 'sigma':
sigmaval = param.value
#PARAMETERS REPORT
print '\033[4mQUASIPARAMETRIC MODEL B1 \033[0m'
print(result3Q.fit_report())
print ''
#PLOT FIT
plt.figure(1)
plt.plot(colPosmm, result3Q.best_fit, 'c-', label="Lmfit Quasiparabolic" )
plt.legend()
plt.figure(3)
plt.plot(colPosmm, result3Q.best_fit, 'c-', label="Lmfit Quasiparabolic" )
plt.legend()
当我运行脚本时,它会向我返回此错误:
ValueError: The input contains nan values
我尝试检查nan
的值,它们在变量pot
(在函数的定义中定义)中。
我还打印了y_和colPosmm以确保没有nan值,所以是。
我也尝试用2代替罐式中的指数n
(只是做一个测试),在这种情况下脚本可以工作。
有人可以帮助我吗?谢谢!
答案 0 :(得分:1)
对于您的数据,我想您正在遇到一种情况
scipy
其中pot = (pot1*pot2)**n
为负(对于某些值)。
由于您允许拟合pot1*pot2
,因此它将是双精度实数,而不仅仅是整数。当然,
n
是 x ** n
和非整数NaN
的{{1}}。
因此,我认为您要么要防止x < 0
为负值,要么将n
固定为某个整数值。