この質問は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
この制約
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}]
次に、cons
をminimize
にフィードします:
scipy.optimize.minimize(func, x0, constraints=cons)