Domanda

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)

Problema: Voglio passare a vincoli di disuguaglianza. Si consideri che ho 6 parametri

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

nei valori Initial, ed i miei vincoli sono:

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)

Ma questo non funziona correttamente. Non so che cosa l'errore è. C'è un modo migliore per passare i miei vincoli in funzione? Ti prego, aiutami.

È stato utile?

Soluzione

Sulla base del commento da Robert Kern, ho rimosso la mia risposta precedente. Qui ci sono i vincoli come funzioni continue:

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]

Nota: Python 2.5 o superiore è necessario per questa sintassi 1

.

Per ottenere il a<=e<=1.4*a vincolo, si noti che 1.2*a è il punto a metà strada tra a e 1.4*a.

Sotto questo punto, vale a dire, tutto e<1.2*a, usiamo la funzione e-a continua. Così la funzione complessiva vincolo è negativo quando e<a, maneggiare la condizione inferiore fuori dal campo, zero sulla e==a limite inferiore, e quindi positivo per e>a fino a metà della corsa.

Al di sopra del punto a metà strada, cioè, tutto e>1.2*a, usiamo invece la funzione 1.4*a-e continua. Ciò significa che la funzione complessiva vincolo è negativa quando e>1.4*a, manipolazione condizione superiore fuori dal campo, zero sulla e==1.4*a limite superiore, e quindi positivo quando e<1.4*a, fino a metà della corsa.

Al giro di boa, dove e==1.2*a, entrambe le funzioni hanno lo stesso valore. Ciò significa che la funzione generale è continua.

Riferimento:. documentazione per ieqcons

1 - Ecco pre-Python 2.5 sintassi: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top