Python >> Tutoriel Python >  >> Python Tag >> SciPy

scipy.optimize.minimize(method=’trust-constr’) ne se termine pas sur la condition xtol

Avez-vous des variables avec des bornes supérieures ? Peut-être que le solveur les implémente sous forme de contraintes comme var < UPPER_BOUND .

(Je mettrais cela en commentaire si j'avais le score de réputation pour le faire)


Il est lié à une conversion interne des bornes des variables en contraintes d'inégalité via le PreparedConstraints classe et le initial_constraints_as_canonical fonction dans la fonction _minimize_trustregion_constr dans minimize(method='trust-constr') .

Le code source, où cela est défini, se trouve dans scipy/scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py

Les lignes de code responsables sont

if bounds is not None:
    if sparse_jacobian is None:
        sparse_jacobian = True
    prepared_constraints.append(PreparedConstraint(bounds, x0,
                                                   sparse_jacobian))

où l'algorithme ajoute des limites variables définies bounds comme PreparedConstraint à la liste des contraintes définies à l'origine déjà préparées en prepared_constraints . Les lignes suivantes

# Concatenate initial constraints to the canonical form.
c_eq0, c_ineq0, J_eq0, J_ineq0 = initial_constraints_as_canonical(
    n_vars, prepared_constraints, sparse_jacobian)

convertir chaque frontière en deux contraintes d'inégalité (x > lb et x < ub ) et renvoie donc des contraintes supplémentaires d'un montant deux fois supérieur au nombre de frontières.

_minimize_trustregion_constr détecte alors ces contraintes d'inégalité et choisit correctement ainsi l'algorithme tr_interior_point

# Choose appropriate method
if canonical.n_ineq == 0:
    method = 'equality_constrained_sqp'
else:
    method = 'tr_interior_point'

Dans ce qui suit, le problème est traité comme un problème contenant à l'origine des contraintes d'inégalité et se termine donc correctement sur le xtol condition ET le barrier_parameter état tel que décrit dans la question.

Merci à l'indice de @Dylan Black, qui gagne la prime pour sa réponse.