سؤال

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top