باستخدام Lambda للحصول على وظيفة قيد
سؤال
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]
ملاحظة: مطلوب بيثون 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 - فيما يلي بناء جملة Py-Python 2.5: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]