2017-06-12 24 views
2

Pythonでは、SciPyを使用して、関数の最大値を見つける必要がありますQ*((1+y)*2-3*Q-0.1)-y**2制限(1-z)*(Q*((1+y)*2-3*Q-0.1))-y**2=0を指定します。 zのために私はいくつかの値がzの値与えられた機能を最大限に引数を見つけるために、入力したいと思います。Pythonの制限付き最適化

私はSciPy最適化機能を使用するために多くの方法を試しましたが、これを行う方法を理解できません。私はWolframAlphaを使用して成功しましたが、これは私にこの問題をフォローアップする質問への答えを私に提供しません。

試み:

from scipy.optimize import minimize 

def equilibrium(z): 
    #Objective function 
    min_prof = lambda(Q,y): -1*(Q*((1+y)*2-3*Q-0.1)-y**2) 

    #initial guess 
    x0 = (0.6,0.9) 

    #Restriction function 
    cons = ({'type': 'eq', 'fun': lambda (Q,y): (1-z)*(Q*((1+y)*2-3*Q-0.1))-y**2}) 

    #y between 0 and 1, Q between 0 and 4 
    bnds = ((0,4),(0,1)) 

    res = minimize(min_prof,x0, method='SLSQP', bounds=bnds ,constraints=cons) 

    return res.x 

from numpy import arange 

range_z = arange(0,1,0.001) 

print equilibrium(range_z) 

エラー:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-20-527013574373> in <module>() 
    21 range_z = arange(0,1,0.01) 
    22 
---> 23 print equilibrium(range_z) 

<ipython-input-20-527013574373> in equilibrium(z) 
    14  bnds = ((0,4),(0,1)) 
    15 
---> 16  res = minimize(min_prof,x0, method='SLSQP', bounds=bnds ,constraints=cons) 
    17 
    18  return res.x 

/Users/Joost/anaconda/lib/python2.7/site-packages/scipy/optimize/_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 
    456  elif meth == 'slsqp': 
    457   return _minimize_slsqp(fun, x0, args, jac, bounds, 
--> 458        constraints, callback=callback, **options) 
    459  elif meth == 'dogleg': 
    460   return _minimize_dogleg(fun, x0, args, jac, hess, 

/Users/Joost/anaconda/lib/python2.7/site-packages/scipy/optimize/slsqp.pyc in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, **unknown_options) 
    324    + 2*meq + n1 + ((n+1)*n)//2 + 2*m + 3*n + 3*n1 + 1 
    325  len_jw = mineq 
--> 326  w = zeros(len_w) 
    327  jw = zeros(len_jw) 
    328 

ValueError: negative dimensions are not allowed 
+0

上記のリンクは制約付き最適化の例です。あなたの問題を解決して問題に挑戦しようとするなら、あなたのコードの試みと実行している特定のエラーを共有してください。私は私の問題を言い換え – CoryKramer

+0

@CoryKramerは、私は今、私はこれらの最適はz' 'の値にどのように反応するか勉強したいと思い、(0.3)' z'ための特定の値を持つために今すぐ解決策を得ます。 –

答えて

0

あなたは、一度に1つのzのためのあなたの機能を評価する必要があります。次のように仕事あなたのコードを作るために最小限の変更である:あなたの現在のコードで

print [equilibrium(z) for z in z_range] 

制約を記述する関数は、エラーメッセージにつながる、代わりにスカラーのベクトルを返します。代わりに、数値的にあなたがあなたの問題が解ける解析的であることに注意してくださいかもしれない最適化の

a = 0.1 
Q = (6-3*a+3**.5 *(4-4*a+a**2-4*z+4*a*z-a**2 *z)**.5)/(6*(2+z)) 
y = Q*(1-z)+(Q*(-1+z)*(-2+a+Q*(2+z)))**.5 

あなたはこれをテストし、それは(数値精度アップに)同じ結果を与えることを自分自身を納得させることができ、その後数値最適化。 (私はz = 0.745をテストしました - 一般的に正しい最大値を選択するには2次微分をチェックする必要がありますが、これが可能です)

関連する問題