0

我在Scipy Optimize上,使用fmin_cobyla函數。我掙扎着寫約束函數是:FMIN_COBYLA約束函數(scipy optimize)

  1. 確保所有項目相加爲1
  2. 確保所有項目> = 0

沒有人有見解?例如,對於fmin_slsqp,我有一個函數:

def w_constraint(w, v, x0, x1): 
    return np.sum(w) - 1 

以及函數中的界限。

但這些對cobyla無效。

+1

「所有項目總計爲1」是一個等式約束。 ['fmin_cobyla'](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_cobyla.html)不處理平等約束。 –

+0

謝謝@WarrenWeckesser,你能幫我確定它們都大於0嗎? –

回答

1

將您的平等形式化爲不等式對。含義:

  • x == y變爲:
    • x >= y
    • x <= y = -x >= -y

當然,這可能引入數值麻煩(傷害許多種解算器),但我看到這在COBYLA接口的多個實現中(使用等式約束支持實現像這樣)。

NLopt文檔的註釋:

(底層COBYLA代碼僅支持不等式約束等式約束被自動轉換爲對不等式約束,其在該算法的情況下,似乎不引起。問題)。

+0

謝謝@sascha;我對scipy很陌生,你會寫我在約束函數中必須返回的內容嗎? –

+0

@GuilhermeNazarethdeSouza只需檢查文檔。他們並沒有那麼糟糕。甚至包括例子。 (並永遠記住:「這不起作用」不是一個有用的錯誤信息!) – sascha