制約関数のためのラムダを使用します
質問
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)
しかし、これは正しく動作していません。私はミスがあるかわかりません。 関数としての私の制約を渡すために任意のより良い方法はありますか? 私を助けてくださいます。
解決
ロバート・カーンからのコメントに基づいて、私は私の前の回答を削除しました。ここでは連続関数などの制約があります:
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*a
とa
間の中間点であることに注意して、制約1.4*a
を取得する。
この点以下に、それは、すべてのe<1.2*a
あり、我々は連続関数e-a
を使用しています。したがって、全体的な制約関数は場合e<a
、低い範囲外の状態を扱う、下方境界e==a
上のゼロ、及び中間点までe>a
ための正の負である。
は、中間点の上に、つまり、すべての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]]
所属していません StackOverflow