Python scipy.optimize.minimize函数中方形拟合约束中的错误
我正在将数据拟合到最小平方拟合。我给出了装配的约束条件,如下所示。”“实验规范”没有定义,但它包含我的数据,将我的数据调用到代码中并不是问题,所以我没有把它放在我的问题中。但在我的约束中,我想问的一件事是,p[3],p[4],p[5],p[6]和p[7]小于1。但是当我调用p[3]、p[4]、p[5]、p[6]和p[7]的优化参数时,它们都大于1。我做错什么了吗Python scipy.optimize.minimize函数中方形拟合约束中的错误,python,python-3.x,scipy,least-squares,Python,Python 3.x,Scipy,Least Squares,我正在将数据拟合到最小平方拟合。我给出了装配的约束条件,如下所示。”“实验规范”没有定义,但它包含我的数据,将我的数据调用到代码中并不是问题,所以我没有把它放在我的问题中。但在我的约束中,我想问的一件事是,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_spectru
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>=0
或p[3]>=1
。您没有指定contstraint小于1,而是大于1!你想要的是:
{'type': 'ineq', 'fun': lambda p: 1-p[3]}
请注意,您还可以将多个contstraint分组在一起,以获得更简单的代码:
{'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]}
发布一个完全有效的代码示例是一种良好的礼仪。这使得乐于助人的人更容易发现错误并测试解决方案。