我一直在尝试将一些参数拟合到曲线上,但是我需要在一个常数上施加约束,而且我不知道如何使我的代码承认约束并使用正确的值拟合值。我将尝试编写一个简单的示例代码来显示我的问题:
def chi(paras):
mpi=paras[0:32]
cf=paras[32]
chif=0
for i in range(32):
chif+=((fpi-f(mpi,cf))/error)**2
return chif
m=Minuit.from_array_func(chi,parin,parstep,name=parname,errordef=1)
fmin,param=m.migrad(ncall=10000)
print(m.values)
例如,我想要cf <= np.log(mpi ** 2)。例如,我尝试过:
if cf<=np.log(mpi**2):
chif+=((fpi-f(mpi,cf))/error)**2
else:
pass
但没有成功。反正有什么限制要在代码中放置?
答案 0 :(得分:0)
对于这种类型的约束,总有简单的参数转换解决方案。 在这种情况下,您可以定义:
def chi( paras ):
mpi = paras[ 0 : 32 ]
s = paras[ 32 ]
a = np.log( np.sum( np.array( mpi )**2 ) )
cf = a - np.exp( -s )
chif = 0
for i in range( 32 ):
chif += ( ( fpi - f( mpi, cf ) ) / error )**2
return chif
允许参数s
从-np.inf
到np.inf
,而内部cf
可以从-np.inf
到a = np.log( sum ( mpi**2 ) )
。要获取cf
及其错误,请进行标准错误传播。