0
在下面的問題中,我使用scipy.optimize.minimize
函數來解決具有5個參數的約束優化問題,名爲params
。當我在Python中調試我的腳本時,最佳參數返回了一個向量元素。有任何想法嗎?scipy.optimize.minimize在python中進行約束優化
from scipy.optimize import minimize
xdata = np.arange(0, 17.5, 0.125)*0.1
xdata= xdata[60:85]
ydata = 1.0/xdata
plt.plot(xdata, ydata , 'ro', label='data')
plt.show()
def getvar(xobs, params) :
yobs = np.asarray([0.0]*len(xobs))
for i in range(len(xobs)):
yobs[i] = params[0] + params[1] *(params[2]*( math.log(xobs[i]) - params[3]) + math.sqrt((math.log(xobs[i]) - params[3] )**2 + params[4]**2) )
return yobs
def resi(params):
return getvar(xdata, params) - ydata
def sum_resi(params) :
return sum(resi(params)**2)
#Unconstrained
guess = np.asarray([1.0,1.0,1.0,1.0,1.0])
pwithout,cov,infodict,mesg,ier=scimin.leastsq(resiguess,full_output=True)
ylsq = getvar(xdata, pwithout)
plt.plot(xdata, ylsq, 'b--', label='fitted plot')
plt.show()
#Constrained: Use the guess from the unconstrained problem
cons = ({'type': 'ineq','fun' : lambda params: np.array([params[0] + params[1]*params[4]* math.sqrt(1 - params[2]**2) ] )})
bnds = ((None, None), (0, None), (-1,1),(None, None),(0, None))
pwith=scimin.minimize(sum_resi,pwithout, method='SLSQP', bounds=bnds,
constraints=cons, options={'disp': True})
ylsqconst = getvar(xdata, pwith.x)
plt.plot(xdata, ylsqconst, 'g--', label='fitted plot')
plt.show()
注
你可以在每次迭代中,所有的參數滿足條件見。在i)定義約束的線上設置調試點:cons = ({'type': 'ineq','fun'
...和ii)返回殘差總和的線:return sum(resi(params)**2)
。請讓我知道你是否可以看到我看不到的錯誤。
確定拼寫錯誤和缺少進口後,我不會'nan's。我得到了'[-0.67014471 1.64436994 -0.91324285 -0.43218748 1.34249085]',這與無約束的解決方案非常相似... – xnx