Pergunta

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: Eu quero passar em restrições de desigualdade. Considere que eu tenho 6 parâmetros

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

nos valores Initial, e as minhas limitações são:

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)

Mas isso não está funcionando corretamente. Eu não sei o que o erro é. Existe alguma maneira melhor para passar minhas limitações como uma função? Por favor me ajude.

Foi útil?

Solução

Com base no comentário de Robert Kern, eu removi a minha resposta anterior. Aqui estão as restrições como funções contínuas:

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: o Python 2.5 ou maior é necessária para esta sintaxe 1

Para obter o a<=e<=1.4*a restrição, nota que 1.2*a é o ponto a meio caminho entre a e 1.4*a.

Abaixo deste ponto, isto é, todos e<1.2*a, usamos o e-a função contínua. Assim, a função global restrição é negativo quando e<a, manusear a diminuir fora dos limites condição, zero no e==a limite inferior, e em seguida positivo para e>a até a metade do caminho.

Acima do ponto médio, isto é, todos e>1.2*a, usamos em vez do 1.4*a-e função contínua. Isto significa que a função global restrição é é negativo quando e>1.4*a, a manipulação da condição superior para fora da quadra, zero no e==1.4*a limite superior, e em seguida positivo quando e<1.4*a, até a metade do caminho.

No ponto no meio do caminho, onde e==1.2*a, ambas as funções têm o mesmo valor. Isto significa que a função global é contínuo.

Referência:. documentação para ieqcons

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top