scipy.optimize.minimize 函数中平方拟合约束错误
error in constraint of square fitting in scipy.optimize.minimize function
我正在用最小二乘法拟合我的数据。我给出了拟合的约束,如下所示。 '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)
Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative.
让我们看看您的限制条件之一:
{'type': 'ineq', 'fun': lambda p: p[3]-1}
非负意味着 p[3] - 1
必须大于或等于零。所以 p[3] - 1 >= 0
或 p[3] >= 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]}
我正在用最小二乘法拟合我的数据。我给出了拟合的约束,如下所示。 '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)
Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative.
让我们看看您的限制条件之一:
{'type': 'ineq', 'fun': lambda p: p[3]-1}
非负意味着 p[3] - 1
必须大于或等于零。所以 p[3] - 1 >= 0
或 p[3] >= 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]}