fmin_cobyla
行列制約についてどのように説明すればよいAx-b >= 0
ですか? それはベクトル制約として取りません:
cons = lambda x: dot(A,x)-b
ありがとう。
fmin_cobyla
行列制約についてどのように説明すればよいAx-b >= 0
ですか? それはベクトル制約として取りません:
cons = lambda x: dot(A,x)-b
ありがとう。
制約はスカラー値を返す必要があるため、次のようにスカラー制約を動的に定義できます。
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に感謝します。
実際、ドキュメントにはConstraint functions;
、それぞれが単一の値のみを返す関数のリストを期待していると書かれています。
したがって、すべてを1つで実行したい場合は、のプレーンなpythonコードを変更するだけで、fmin_cobyla
関数の周りにラッピング関数が定義されていることがわかります。そのため、簡単です...そしてpythonコードは非常に短いです。とにかく、周りの小さなラッパーscipy.optimize._cobyal.minimize
。
ちなみに、最適化する関数が制約のように線形(または2次)である場合、おそらくはるかに優れたソルバーがあります。