2009-10-02 7 views
1
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ètreslambda pour une fonction de contrainte

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

dans les Initial valeurs 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 quelle est l'erreur. Existe-t-il un meilleur moyen de transmettre mes contraintes en tant que fonction? S'il vous plaît aidez-moi.

+0

Je ne sais pas numpy, mais sont a et b négatif? Sinon, je ne peux pas voir comment les valeurs de e et f peuvent satisfaire 1.4 * a <= e <= a et 1.4 * b <= f <= b. – hughdbrown

+0

Il serait utile que vous indiquiez clairement ce que vous faites exactement, ce que vous voulez faire, et ce qui se passe réellement, au lieu de simplement coller un fragment de code. – MAK

+0

@pear, j'ai essayé de répondre à votre question, mais comme le dit hughdbrown, les contraintes dans votre code ci-dessus ne semblent pas fonctionner pour des nombres positifs. Peut-être que les signes sont en arrière sur les deux premiers? –

Répondre

1

Basé sur le commentaire de Robert Kern, j'ai supprimé ma réponse précédente. Voici les contraintes en tant que 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] 

Remarque: Python 2.5 ou supérieur est requis pour cette syntaxe.

Pour obtenir la contrainte a<=e<=1.4*a, notez que 1.2*a est le point à mi-chemin entre a et 1.4*a. En dessous de ce point, c'est-à-dire tous les e<1.2*a, nous utilisons la fonction continue e-a. Ainsi, la fonction de contrainte globale est négative lorsque e<a, en traitant la condition hors limites inférieure, zéro sur la limite inférieure e==a, puis positive pour e>a jusqu'à mi-parcours.

Au-dessus du point à mi-chemin, c'est-à-dire tous e>1.2*a, nous utilisons à la place la fonction continue 1.4*a-e. Cela signifie que la fonction de contrainte globale est négative lorsque e>1.4*a, en traitant la condition hors limites supérieure, zéro sur la limite supérieure e==1.4*a, puis positive lorsque e<1.4*a, jusqu'à mi-parcours.

A mi-chemin, 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 for ieqcons.

- 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]]

+0

Non, cela ne fonctionnera pas. Les fonctions de contrainte doivent être continues autant que possible,> 0 lorsqu'elles sont satisfaites, <0 lorsqu'elles ne le sont pas, et == 0 lorsqu'elles sont précisément sur la limite. –

+0

système Pause, comme Robert dit que la fonction doit être continue. donc j'ai fait lambda x: ([1.4 * x [0] - x [0]]), ie, lambda x: (max-min). Mais qu'est-ce que je fais est correct ou non, je ne sais pas. –

+0

@pear, je ne pense pas que cela puisse être correct, car il n'utilise pas du tout * e * (aka 'x [4]') du tout dans l'expression. Cette expression est équivalente à '1.4 * a - a' qui aura toujours la valeur' 0.4a'. –

Questions connexes