El uso de lambda para una función de restricción
Pregunta
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: Quiero pasar de restricciones de desigualdad. Considero que tengo 6 parámetros
[ a, b, c, d, e, f]
en los valores Initial
, y mis limitaciones son:
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)
Sin embargo, esto no está funcionando correctamente. No sé lo que es el error. ¿Hay alguna forma mejor de pasar mis limitaciones como una función? Por favor, ayúdame.
Solución
Con base en el comentario de Robert Kern, he eliminado mi respuesta anterior. Aquí están las limitaciones como funciones continuas:
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 superior se requiere para esta sintaxis 1
. Para obtener el a<=e<=1.4*a
limitación, tenga en cuenta que 1.2*a
es el punto medio entre a
y 1.4*a
.
Por debajo de este punto, es decir, todos los e<1.2*a
, se utiliza el e-a
función continua. Así, la función general de restricción es negativo cuando e<a
, el manejo de la condición inferior fuera de límites, cero en la e==a
límite inferior, y luego positivo para e>a
hasta el punto a mitad de camino.
Por encima del punto medio, es decir, todos los e>1.2*a
, se utiliza en su lugar el 1.4*a-e
función continua. Esto significa que la función general de restricción es es negativo cuando e>1.4*a
, el manejo de la condición de salida de límites superior, cero en la e==1.4*a
límite superior, y luego positivo cuando e<1.4*a
, hasta el punto a mitad de camino.
A mitad de camino, donde e==1.2*a
, ambas funciones tienen el mismo valor. Esto significa que la función general es continua.
Referencia:. documentación para ieqcons
1 - Aquí está pre-Python 2.5 Sintaxis: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]