web-dev-qa-db-fra.com

scipy minimiser avec des contraintes

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

21
wa4557

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)
29
askewchan