如何在scipy.minimize上传递常量参数约束以及对范围实现的质疑

时间:2018-11-26 00:36:26

标签: python parameters scipy constants

所以我的问题是,我想运行scipy.minimize,该函数接受3个参数的列表,但将列表中的一个参数保持不变,并在有该约束的情况下找到函数的最小化。可以理解,这可以使用scipy.minimize中的args或constraint选项来完成,但是例如,如果我想保持列表中的第一个参数不变,我不知道应该如何使用它。 这是一些代码:

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)范围之外。有人知道吗在参数范围内,其实现是否存在任何实际问题?

0 个答案:

没有答案