1

my制約が、行列変数の第1列と第3列の積が1より大きいとします。私はCVXPYでどのように実装できますか?例:MATLABでCVXPYの2つの列の内積に不等式制約を作成するにはどうすればよいですか?

w = Variable(4,3) 

、私の制約は次のようになります。

w(:,1)'*w(:,3)>1 

どのように私はCVXPYでそれを実装することができますか?または、CVXPYでドットプロダクトを実行できますか? numpy.dotはCVXPYではサポートされていません。

答えて

1

2つの変数を掛けることはできません。すべての制約は線形でなければなりません(一般的にDCP)。

禁止操作を実行しようとするとCVXPYがDCPErrorを発生させます。

import cvxpy 
x = cvxpy.Variable() 
y = cvxpy.Variable() 
constraints = [x*y > 1] 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\cvxpy\expressions\expression.py", line 43, in cast_op 
    return binary_op(self, other) 
    File "C:\Python27\lib\site-packages\cvxpy\expressions\expression.py", line 226, in __mul__ 
    raise DCPError("Cannot multiply two non-constants.") 
cvxpy.error.DCPError: Cannot multiply two non-constants. 

少なくとも1つの変数が整数/ブール値である場合、これを避けるために変数slackを使用できます。それ以外の場合は、任意の非線形ソルバを使用できます。 IPOPT。

同じ質問がhereと回答されました。

0

両方の変数が正である場合、セット{x * y > 1}は実際には凸であり、関数x*yは凸でも凹でもありません。これにより、第2の誘導体{-1, 1}ある

(x*y)'' = 
[[0, 1], 
[1, 0]] 

の行列の固有値を見て確認することができます。行列は正定値ではなく、負定値でもありません。

問題が凸になるように変換することがあります。この場合には、これは両辺の対数をとることにより可能である:ログ(x)及び(y)をログの両方が凹面関数であり、不等式が大なり、または - であるため

log(x) + log(y) >= 0 

これは有効な制限であります等しい。この制約は、「統制された凸型プログラミング」ルールに合格します。がんばろう。

0

グラム行列Q := W.T * Wの北東エントリに厳密な不等式制約があります。これは対称で正の半正定値です。したがって、代わりにグラム行列Qを使用して、厳密な不等式制約Q[0,2] > 1を導入してください。北東のエントリが1.76709537e+00 > 1であることを

>>> from cvxpy import * 
>>> Q = Semidef(3) 
>>> objective = Minimize(0) 
>>> constraints = [ Q[0,2] > 1 ] 
>>> prob = Problem(objective,constraints) 
>>> prob.solve() 
0.0 
>>> Q.value 
matrix([[ 2.33101529e+00, 2.57980002e-30, 1.76709537e+00], 
     [ 2.57980002e-30, 2.57740598e-15, -2.00304682e-30], 
     [ 1.76709537e+00, -2.00304682e-30, 2.33101529e+00]]) 

注:

は例えば、ここに半正定値プログラムゼロを目的とした(SDP)です。次のようにグラム行列QからマトリックスWを回復するために、コレスキー分解を使用して、4×3行列を得るためにゼロの行を追加します。

>>> import numpy as np 
>>> L = np.linalg.cholesky(Q.value) 
>>> W = (np.insert(L, 3, np.array([0,0,0]), axis=1)).T 
>>> W 
matrix([[ 1.52676628e+00, 1.68971508e-30, 1.15741053e+00], 
     [ 0.00000000e+00, 5.07681591e-08, -7.79768444e-23], 
     [ 0.00000000e+00, 0.00000000e+00, 9.95698832e-01], 
     [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]) 

我々は確認してみましょう:

>>> W.T * W - Q.value 
matrix([[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
     [ 0.00000000e+00, 0.00000000e+00, 7.00649232e-46], 
     [ 0.00000000e+00, 7.00649232e-46, 0.00000000e+00]]) 
関連する問題