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.