0

私はscipy.optimize.minimize関数を使用して、制約付き最適化問題を解決するために、5つのパラメータ(params)を使用しています。私のスクリプトをPythonでデバッグすると、最適なパラメータは5- ナノ要素のベクトルを返しました。何か案は?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)にデバッグポイントを設定します。見えないエラーが表示された場合はお知らせください。

+0

誤植を修正した後、私は 'nan'を取得しません。私は '[-0.67014471 1.64436994 -0.91324285 -0.43218748 1.34249085]'を得ました。無制限の解決策に非常に似ています... – xnx

答えて

0

問題は単純なタイプミスかもしれないと思います。行内

pwithout,cov,infodict,mesg,ier=scimin.leastsq(resiguess,full_output=True) 

leastsq(resi, guess, ...)ではありませんか?

関連する問題