2016-09-30 7 views
2

私は長さ9のnp.array Aを持っています。これは目的関数内の変数です。scipy.optimizeコンパクト制約

A = [ a1, a2, a3, 
     b1, b2, b3, 
     c1, c2, c3], where a1...c3 are real numbers. 
with constraints: a1 > a2, a2 > a3, 
        b1 > b2, b2 > b3, 
        c1 > c2, c2 > c3 

制約を書くための簡単な方法はありますか?現在私は次のコードを持っていますが、配列のサイズが大きくなるにつれ、それらをすべて記述するのは難しいです。それは、機能ごとに二つ以上の入力を除外して

cons = (
     {'type':'ineq', 
     'fun': lambda x : np.array([x[0]-x[1]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[1]-x[2]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[3]-x[4]]) 
     }  
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[4]-x[5]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[6]-x[7]]) 
     }  
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[7]-x[8]]) 
     }  
    ) 

答えて

0

私はあなたが何ができるか(自由とすべてのことisht度)...、scipyのダウンロードではなく、ブールよりも、これらの機能のそれぞれの数値出力が好きな想像します

cons = ({'type':'ineq', 'fun': lambda x: x[i] - x[i+1]} for i in range(len(A)-1)) 

は、私はあなたが1の長さの配列に減算の結果をキャストする必要がある理由はよく分からないので、私はそれを左

...あなたのための関数を作るためにリスト内包を書く..です

1

明らかに、あなたの制約は012の各列は(要素単位で)その右の列以上である必要があります。

次のように、単一、ベクトルoutpur制約を策定することができます

def cons_fun(x): 
    A = x.reshape(3,3) # change "(3,3)" according to the dimensions of A 

    return np.array([A[:,i]-A[:,i+1] for i in range(3-1)]).ravel() # change "3" accordingly 

cons = ({'type':'ineq', 
     'fun' : cons_fun},) 

SLSQPとの私の経験からは、ベクトル出力の制約は、複数のスカラー出力の制約を提供するよりも高速最適化時間になります。

+0

ありがとうございました!これは本当に役に立ちます! – Meng