Frage

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)

Problem: Ich möchte Ungleichungsrestriktionen passieren. Man bedenke, dass ich 6 Parameter

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

in den Initial Werte und meine Zwänge sind:

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)

Aber das funktioniert nicht richtig. Ich weiß nicht, was der Fehler ist. Gibt es einen besseren Weg, um meine Zwänge als eine Funktion zu übergeben? Bitte helfen Sie mir.

War es hilfreich?

Lösung

Auf der Grundlage der Kommentar von Robert Kern, ich habe meine vorherige Antwort entfernt. Hier sind die Einschränkungen als stetige Funktionen:

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]

Hinweis: Python 2.5 oder höher ist für diese Syntax erforderlich 1

.

die Einschränkung a<=e<=1.4*a zu erhalten, beachten Sie, dass 1.2*a ist die Halbzeit zwischen a und 1.4*a.

Unter diesem Punkt, das heißt, alle e<1.2*a, verwenden wir die kontinuierliche Funktion e-a. Somit ist die Gesamteinflußfunktion ist negativ, wenn e<a, die Handhabung des unteren außerhalb der Grenzen Zustand Null auf der unteren Begrenzungs e==a und dann positiv für e>a bis zur Hälfte auf.

Vor der Hälfte, das heißt, alle e>1.2*a, verwenden wir stattdessen die kontinuierliche Funktion 1.4*a-e. Das bedeutet, die gesamte Einschränkungsfunktion ist, ist negativ, wenn e>1.4*a, die Handhabung des oberen out-of-Grenzen Zustand Null auf der oberen Begrenzungs e==1.4*a und dann positiv, wenn e<1.4*a, bis auf den Punkt auf halber Strecke.

Nach der Hälfte, wo e==1.2*a, beide Funktionen den gleichen Wert haben. Dies bedeutet, dass die Gesamtfunktion kontinuierlich ist.

. Referenz: Dokumentation für ieqcons

1 - Hier ist bereits Python 2.5 Syntax: b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]<1.2*x[0]]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top