web-dev-qa-db-ja.com

scipyは制約付きで最小化します

この質問はscipy.optimizeのマニュアルで処理する必要があることは知っていますが、十分に理解していません。たぶんあなたは助けることができます

関数があります(これは単なる例であり、実際の関数ではありませんが、このレベルで理解する必要があります)。

編集(より良い例):

私は行列を持っているとしましょう

arr = array([[0.8, 0.2],[-0.1, 0.14]])

ターゲット機能付き

def matr_t(t):
    return array([[t[0], 0],[t[2]+complex(0,1)*t[3], t[1]]]

def target(t):
    arr2 = matr_t(t)
    ret = 0
    for i, v1 in enumerate(arr):
          for j, v2 in enumerate(v1):
               ret += abs(arr[i][j]-arr2[i][j])**2
    return ret

ここで、t [i]が実数であり、t[0]+t[1]=1

21
wa4557

この制約

t[0] + t[1] = 1

平等(type='eq')制約。ゼロに等しくなければならない関数を作成します。

def con(t):
    return t[0] + t[1] - 1

次に、制約のdict(複数の場合は辞書のリスト)を作成します。

cons = {'type':'eq', 'fun': con}

試したことはありませんが、tをリアルに保つには、次のように使用できます。

con_real(t):
    return np.sum(np.iscomplex(t))

consに両方の制約を含めるようにします。

cons = [{'type':'eq', 'fun': con},
        {'type':'eq', 'fun': con_real}]

次に、consminimizeにフィードします:

scipy.optimize.minimize(func, x0, constraints=cons)
29
askewchan