scipy.optimize.最小化函数中平方拟合约束中的错误



我正在将我的数据拟合到最小平方拟合。我给出了拟合的约束,如下所示。"Experiment_norm"没有定义,但它包含我的数据,将我的数据调用代码不是问题,所以我没有把它放在我的问题中。但是在我的约束中,我想问的一件事是说p[3],p[4],p[5],p[6]和p[7]小于1。但是当我调用 p[3]、p[4]、p[5]、p[6] 和 p[7] 的优化参数时,它们大于 1。我做错了什么吗?

def myerr(p, xdata, ydata):  
return sum((ydata - calculate_spectrum(p,xdata))**2)
con = ({'type': 'eq', 'fun': lambda p: p[11]+p[12]+p[13]-1}, {'type': 'ineq', 'fun': lambda p: p[11]}, {'type': 'ineq', 'fun': lambda p: p[12]},{'type': 'ineq', 'fun': lambda p: p[13]},{'type': 'ineq', 'fun': lambda p: p[3]-1},{'type': 'ineq', 'fun': lambda p: p[4]-1},{'type': 'ineq', 'fun': lambda p: p[5]-1},{'type': 'ineq', 'fun': lambda p: p[6]-1},{'type': 'ineq', 'fun': lambda p: p[7]-1})
p0 = [m,z,3000,0.3,0.3,0.1,0.2,0.3,0.4,0.4,0.4,0.2,0.5,0.6]
p_opt = scipy.optimize.minimize(myerr, p0, args=(mz,experiment_norm), constraints = con)

从文档中:

等式约束意味着

约束函数结果为零,而不等式意味着它是非负的

让我们看一下您的一个约束:

{'type': 'ineq', 'fun': lambda p: p[3]-1}

非负数表示p[3] - 1必须大于或等于零。所以p[3] - 1 >= 0p[3] >= 1.您没有指定约束小于 1,而是大于 1!你想要的是这个:

{'type': 'ineq', 'fun': lambda p: 1-p[3]}

请注意,您还可以将多个约束组合在一起以获得更简单的代码:

{'type': 'ineq', 'fun': lambda p: [1-p[3], 1-p[4], 1-p[5], 1-p[6], 1-p[7]]}

或者如果p是一个 numpy 数组:

{'type': 'ineq', 'fun': lambda p: 1-p[3:8]}

最新更新