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)

問題: 不等式制約を渡したい。私は6つのパラメータを持っていると考えてください

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

値でInitial、私の制約は次のとおりです。

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)

しかし、これは正しく機能していません。何が間違いなのかわからない。制約を関数として渡すより良い方法はありますか? 私を助けてください。

4

1 に答える 1

1

Robert Kern からのコメントに基づいて、以前の回答を削除しました。連続関数としての制約は次のとおりです。

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]

注: この構文には Python 2.5 以降が必要です。1

制約を取得するには、 がとの中間点であるa<=e<=1.4*aことに注意してください。1.2*aa1.4*a

この点、つまり alle<1.2*aの下では、continuous 関数 を使用しますe-a。したがって、全体の制約関数は、 の場合は負e<aであり、下限の範囲外の条件を処理し、下限の境界ではゼロになり、中間点までe==aは正になります。e>a

中間点、つまり all の上では、e>1.2*a代わりに連続関数 を使用します1.4*a-e。これは、全体的な制約関数が の場合は負e>1.4*aであり、上限の範囲外の条件を処理し、上限の境界でゼロになり、 の場合は中間点までe==1.4*a正になることを意味します。e<1.4*a

中間点ではe==1.2*a、両方の関数が同じ値を持ちます。これは、全体の機能が連続していることを意味します。

参照:のドキュメントieqcons

1 - Python 2.5 より前の構文は次のとおりです。b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]

于 2009-10-02T20:10:46.153 に答える