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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top