0

fmin_cobyla行列制約についてどのように説明すればよいAx-b >= 0ですか? それはベクトル制約として取りません:

cons = lambda x: dot(A,x)-b

ありがとう。

4

2 に答える 2

4

制約はスカラー値を返す必要があるため、次のようにスカラー制約を動的に定義できます。

constraints = []
for i in range(len(A)):
    def f(x, i = i):
        return np.dot(A[i],x)-b[i]
    constraints.append(f)

たとえば、ドキュメントの例を少し変更すると、

def objective(x):
    return x[0]*x[1]

A = np.array([(1,2),(3,4)])
b = np.array([1,1])
constraints = []
for i in range(len(A)):
    def f(x, i = i):
        return np.dot(A[i],x)-b[i]
    constraints.append(f)

def constr1(x):
    return 1 - (x[0]**2 + x[1]**2)

def constr2(x):
    return x[1]

x = optimize.fmin_cobyla(objective, [0.0, 0.1], constraints+[constr1, constr2],
                         rhoend = 1e-7)
print(x)

収量

[-0.6  0.8]

PS。以前の間違いを指摘してくれた@sebergに感謝します。

于 2012-09-21T16:29:48.763 に答える
1

実際、ドキュメントにはConstraint functions;、それぞれが単一の値のみを返す関数のリストを期待していると書かれています。

したがって、すべてを1つで実行したい場合は、のプレーンなpythonコードを変更するだけで、fmin_cobyla関数の周りにラッピング関数が定義されていることがわかります。そのため、簡単です...そしてpythonコードは非常に短いです。とにかく、周りの小さなラッパーscipy.optimize._cobyal.minimize

ちなみに、最適化する関数が制約のように線形(または2次)である場合、おそらくはるかに優れたソルバーがあります。

于 2012-09-21T17:12:30.477 に答える