我将我的数据拟合到最小平方拟合。我给出了拟合的约束,如下所示。 ' 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)
答案 0 :(得分:1)
等式约束意味着约束函数结果为零,而不等式意味着它是非负的。
让我们来看看你的一个约束:
{'type': 'ineq', 'fun': lambda p: p[3]-1}
非负面意味着p[3] - 1
必须大于或等于零。所以p[3] - 1 >= 0
或p[3] >= 1
。您没有指定contstraint小于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]}