Ограничения по подгонке параметров в iminuit? - PullRequest
0 голосов
/ 28 марта 2019

Я пытался вписать некоторые параметры в кривую, но мне нужно наложить ограничение на одну из констант, и я не знаю, как заставить мой код признать ограничения и соответствовать значению с правильным значением.Я попытаюсь написать простой пример кода, чтобы показать мою проблему:

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).Я пробовал, например: </p>

if cf<=np.log(mpi**2):
    chif+=((fpi-f(mpi,cf))/error)**2

else:
    pass

, но это не сработало.Есть ли в этом случае, чтобы поставить это ограничение в коде?

1 Ответ

0 голосов
/ 01 апреля 2019

Для этого типа ограничений всегда есть простое решение для преобразования параметров.В этом случае вы можете определить:

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 и его ошибку, вы делаете стандартное распространение ошибки.

...