Question

import numpy 
from numpy import asarray

Initial = numpy.asarray [2.0, 4.0, 5.0, 3.0, 5.0, 6.0]       # Initial values to start with


bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000), (1.0, 5000), (2, 1000000)] 

# actual passed bounds

b1 = lambda x: numpy.asarray([1.4*x[0] - x[0]])  
b2 = lambda x: numpy.asarray([1.4*x[1] - x[1]])  
b3 = lambda x: numpy.asarray([x[2] - x[3]])     
constraints = numpy.asarray([b1, b2, b3])

opt= optimize.fmin_slsqp(func,Initial,ieqcons=constraints,bounds=bounds, full_output=True,iter=200,iprint=2, acc=0.01)

Problème: Je veux passer des contraintes d'inégalité. Considérez que j'ai 6 paramètres

[ a, b, c, d, e, f]

dans les valeurs Initial et mes contraintes sont:

a<=e<=1.4*a   ('e' varies from a to 1.4*a)
b<=f<=1.4*b   ('f' varies from b to 1.4*b)
c>d           ('c' must always be greater than d)

Mais cela ne fonctionne pas correctement. Je ne sais pas ce que l'erreur est. Y at-il une meilleure façon de passer mes contraintes en fonction? S'il vous plaît aidez-moi.

Était-ce utile?

La solution

D'après le commentaire de Robert Kern, je l'ai retiré ma réponse précédente. Voici les contraintes que les fonctions continues:

b1 = lambda x: x[4]-x[0] if x[4]<1.2*x[0] else 1.4*x[0]-x[4]
b2 = lambda x: x[5]-x[1] if x[5]<1.2*x[1] else 1.4*x[1]-x[5]
b3 = lambda x: x[2]-x[3]

Note: python 2,5 ou plus est requis pour cette syntaxe 1

.

Pour obtenir la a<=e<=1.4*a de contrainte, notez que 1.2*a est le point à mi-chemin entre a et 1.4*a.

Ci-dessous ce point, à savoir, tout e<1.2*a, nous utilisons la e-a fonction continue. Ainsi, la fonction globale de contrainte est négative lorsque e<a, la manipulation du bas hors des limites du terrain condition, zéro à la limite inférieure e==a, puis positif pour e>a jusqu'à la mi-course.

Au-dessus du point à mi-chemin, c'est tout e>1.2*a, nous utilisons plutôt la 1.4*a-e fonction continue. Cela signifie que la fonction globale de contrainte est négatif lorsque e>1.4*a, la manipulation de la condition hors limites supérieure à zéro sur la limite supérieure de e==1.4*a, puis positif lorsque e<1.4*a, jusqu'à la mi-course.

A mi-parcours, où e==1.2*a, les deux fonctions ont la même valeur. Cela signifie que la fonction globale est continue.

Référence:. documentation ieqcons

1 - Voici pré-Python 2.5 Syntaxe: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top