簡體   English   中英

Scipy最小化約束功能

[英]Scipy minimize constrained function

我正在解決以下優化問題:

在此輸入圖像描述

使用此Python代碼:

from scipy.optimize import minimize
import math

def f(x):
    return math.log(x[0]**2 + 1) + x[1]**4 + x[0]*x[2]

x0 = [0, 0, 0]

cons=({'type': 'ineq',
       'fun': lambda x: x[0]**3 - x[1]**2 - 1},
      {'type': 'ineq',
       'fun': lambda x: x[0]},
      {'type': 'ineq',
       'fun': lambda x: x[2]})

res = minimize(f, x0, constraints=cons)
print res

我收到了一個錯誤

消息:'不平等約束不兼容'

什么可能導致此錯誤?

問題似乎與您最初的猜測有關。 如果我將您的起始值更改為

x0 = [1.0, 1.0, 1.0]

然后你的代碼將執行正常(至少在我的機器上)

win32上的Python 3.5.1(v3.5.1:37a07cee5969,2015年12月6日,01:54:25)[MSC v.1900 64位(AMD64)]

 message: 'Optimization terminated successfully.'
    njev: 10
     jac: array([ 1.,  0.,  1.,  0.])
     fun: 0.6931471805582502
     nit: 10
  status: 0
       x: array([  1.00000000e+00,  -1.39724765e-06,   1.07686548e-14])
 success: True
    nfev: 51

Scipy的優化模塊有很多選項。 請參閱文檔本教程 由於您未在此處指定方法,因此將使用Sequential Least SQuares Programming( SLSQP )。 或者,您可以使用Trust-Region約束算法( trust-const )。

對於這個問題,我發現trust-const對於起始值似乎比SLSQP更穩健,處理從[-2,-2,-2][10,10,10] ,盡管負初始值導致增加迭代,正如您所期望的那樣。 低於-2負值超過了最大迭代次數,盡管我懷疑如果你增加了最大迭代次數可能仍會收斂,雖然為x1x3指定負值是有點傻,當然,我只是去了解它是如何理解的強大的是一系列起始值。

SLSQPtrust-const的規范在概念上是相同的,但語法略有不同(特別注意使用NonlinearConstraint )。

from scipy.optimize import minimize, NonlinearConstraint, SR1

def f(x):
    return math.log(x[0]**2 + 1) + x[1]**4 + x[0]*x[2]

constr_func = lambda x: np.array( [ x[0]**3 - x[1]**2 - 1,
                                    x[0],
                                    x[2] ] )

x0=[0.,0.,0.]

nonlin_con = NonlinearConstraint( constr_func, 0., np.inf )

res = minimize( f, x0, method='trust-constr',
                jac='2-point', hess=SR1(),
                constraints = nonlin_con )

以下是結果,為簡潔而編輯:

    fun: 0.6931502233468916
message: '`gtol` termination condition is satisfied.'
      x: array([1.00000063e+00, 8.21427026e-09, 2.40956900e-06])

請注意,函數值和x值與@ CoryKramer的答案相同。 x數組乍一看可能看起來不同,但兩個答案都是[1, 0, 0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM