Je sais que cette question devrait être traitée dans le manuel de scipy.optimize, mais je ne la comprends pas assez bien. Vous pouvez peut-être aider
J'ai une fonction (ce n'est qu'un exemple, pas la vraie fonction, mais j'ai besoin de la comprendre à ce niveau):
Modifier (meilleur exemple):
Supposons que j'ai une matrice
arr = array([[0.8, 0.2],[-0.1, 0.14]])
avec une fonction cible
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
maintenant je veux minimiser cette fonction cible en supposant que les t [i] sont des nombres réels, et quelque chose comme t[0]+t[1]=1
Cette contrainte
t[0] + t[1] = 1
serait une égalité (type='eq'
) contrainte, où vous créez une fonction qui doit être égale à zéro:
def con(t):
return t[0] + t[1] - 1
Ensuite, vous faites un dict
de votre contrainte (liste de dict si plusieurs):
cons = {'type':'eq', 'fun': con}
Je ne l'ai jamais essayé, mais je pense que pour garder t
réel, vous pouvez utiliser:
con_real(t):
return np.sum(np.iscomplex(t))
Et faites en sorte que votre cons
inclut les deux contraintes:
cons = [{'type':'eq', 'fun': con},
{'type':'eq', 'fun': con_real}]
Ensuite, vous introduisez cons
dans minimize
en tant que:
scipy.optimize.minimize(func, x0, constraints=cons)