Так что моя проблема в том, что я хочу запустить scipy.minimize для функции, которая принимает список из 3 аргументов, но сохраняет один из параметров в списке постоянным и находит минимизацию моей функции с этим ограничением.Понимаю, это можно сделать с помощью параметра args или constraint в scipy.minimize, но я не понимаю, как я должен его использовать, если, например, я хочу сохранить первый параметр в списке постоянным.Вот фрагмент кода:
def package(self):
if self.choose<=2:
boun=[(0.001,4),(0.001,4),(0.001,0.999)]
self.minimised_f=scipy.optimize.differential_evolution(self.nll,boun,polish=True)
print(self.minimised_f)
self.min_param=self.minimised_f.x
print(self.minimised_f.fun)
print(self.min_param)
def nll(self,parameters):
self.mean_life_1=parameters[0]
self.mean_life_2=parameters[1]
self.F=parameters[2]
nll=0.0
for i in range(0,len(self.values)):
if self.choose==1 or self.choose==3 and self.fun_t(self.t_values[i])>0:
l=-math.log(self.fun_t(self.t_values[i]))
elif self.choose==2 or self.choose==4 and self.fun_t_the(self.t_values[i],self.theta_values[i])>0 :
l=-math.log(self.fun_t_the(self.t_values[i],self.theta_values[i]))
else:
l=0
nll+=l
return nll
def fun_t(self,t):
p1=1.0/self.mean_life_1*math.exp(-t/self.mean_life_1)
p2=1.0/self.mean_life_2*math.exp(-t/self.mean_life_2)
f=self.F*p1+(1-self.F)*p2
return f
def fun_t_the(self,t,theta):
p1=1.0/(3.0*math.pi*self.mean_life_1)*(1.0+(math.cos(theta))**2)*math.exp(-t/self.mean_life_1)
p2=1.0/(math.pi*self.mean_life_2)*(math.sin(theta))**2*math.exp(-t/self.mean_life_2)
f=self.F*p1+(1-self.F)*p2
return f
Кроме того, метод scipy.optimize.differential_evolution, по-видимому, не подчиняется условиям границ, которые я установил для параметров. Если я удаляю условия в функции nllгде я требую, чтобы функция была выше нуля, я получаю ошибку, когда она пытается вычислить лог отрицательного числа. Я думаю, что она не подчиняется границам, потому что единственный способ для fun_t стать отрицательным, это если Fнаходится за пределами диапазона (0,1). Кто-нибудь знает, есть ли какие-либо реальные проблемы с его реализацией за пределами параметров?