scipy optimize.minimize

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JesusIsMyLord
User
Beiträge: 12
Registriert: Mittwoch 24. Oktober 2018, 16:17

Hallo zusammen,

ich bin mal wieder auf meine absolute Unfähigkeit und Unverständnis gestoßen und benötige Hilfe!

Es handelt sich um das minimieren von Funktionen....
Hier ein erstes Beispiel:

Code: Alles auswählen

def funktion(parameter):
    x, y, z = parameter
    return x + y**2 + z**3

start_werte = [3, 2, 1]

ergebnis = optimize.minimize(funktion, start_werte)
print(ergebnis)
Dies funktioniert sehr gut, allerdings verstehe ich nicht, wie ich nur auf den Lösungsarray (in der Doku als x bezeichnet) komme...hab schon verschiedenes versucht mit "optimize.x" usw. Die Dokus haben mir auch nicht geholfen:
https://docs.scipy.org/doc/scipy-0.19.1 ... imize.html

https://docs.scipy.org/doc/scipy-0.14.0 ... esult.html

Kann mir da jemand die Lösung nennen?

Weiterhin verstehe ich ehrlich gesagt nicht, wie das genau mit den Minimieren geht.....Theoretisch wäre ja das kleinste Ergebnis für oben, wenn alle Parameter 0 sind und nicht irgendwas anderes....Also was genau geht da vor sich? Ich verstehe es leider nicht!
Soweit zum Verständis...Klärt mich bitte auf....

Nun zum eigentlichen Problem:

Ich habe eine sehr komplizierte Funktion, für welche ich Werte minimieren möchte, dies allerdings nicht hinbekomme....Vielleicht ist scipy.minimize auch der falsche Ansatz...
Mein Problem ist stark vereinfacht (und in diesem Fall unsinnig) hier im Code zu sehen:

Code: Alles auswählen

meine_Liste = [2, 16, 17, 19, 15, 97, 23, 45, 34, 65]
mein_Wert = 5

def meine_Funktion(Wert, Liste):
    
    x=np.array(Liste) # im richtigen Programm beeinflusst Wert auch die Liste
    a = min(x) # Auslesen des Maximums/Minimums
    b = max(x)

    a1 = a + 4*Wert
    b1 = b - 6*Wert 

    c = a + b

    return a1, b1, c

Berta = meine_Funktion(mein_Wert, meine_Liste)
print (Berta)

Gustav = optimize.minimize(meine_Funktion(mein_Wert, meine_Liste), mein_Wert)
print(Gustav)
Ich beschreibe die Teile, die in meinem Programm relevant sind:
Ich habe eine Liste an Messwerten, welche ich meiner Funktion übergebe....Diese rechnet damit rum und gibt mir für die Weiterverarbeitung einen relevanten Wert (in diesem unsinnigen Beispiel c) heraus.....Dieser Wert soll aber "optimiert" sein....Diese Optimierung hängt von 2 anderen Werten ab (a1 und a2), welche ich minimieren möchte. Mit Minimieren meine ich, dass Sie beide möglichst klein sein sollen, aber nahe beieinander....., im echten Programm liegen sie ganzzahligen Bereich, zwischen 0 und vermutlich 20....Beide sollen möglichst klein, aber ähnlich groß sein (also nicht einer 18 und der andere 0.....da wären mir beide bei 8 lieber).....Die Minimierung hängt nur von einem Wert ab (hier mein_Wert), welchem ich einen Startwert (hier 5) vorgebe....

Respekt, wenn ihr noch dabei seid und danke für eure Hilfe und Tipps....

Zusammenfassung:
1. Funktion bekommt Liste und soll einen Wert errechen (c)
2. Dieser Wert soll aber nur für optimierte Parameter (a1 und b1) ausgegeben werden (Ja ich weiß, im Beispiel haben diese keinen Einfluss auf das Ergebnis, mir geht es aber um das Prinzip)
3. Die einzige Stellschraube/Variable ist "mein_Wert"

Hat jemand mein Problem verstanden und kann mir helfen? :roll:
Ich weiß ich drücke mich sehr umständlich aus und ohne das konkrete Problem vor Augen zu haben ist es etwas schwer, aber ich wollte euch nicht ca. 400 Zeilen unverständlichen Code vor den Latz knallen, vielleicht kann ich das Thema morgen nochmal besser verdeutlichen, mit einem anderen Code....Dieser hier ist natürlich unsinnig, zeigt aber mein Problem auf grundsätzliche Weise.....
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei Deiner Optimierung kann x beliebig klein werden, und der Funktionswert geht gegen -∞, solche offenen Probleme kann ein Optimierer nicht lösen.
Das Ergbnis steht bei Dir in `ergebnis`, du mußt also `ergebnis.x` schreiben.

Dein eigentliches Problem verstehe ich nicht, kannst Du konkret Schreiben, was Du optimieren möchtest? Optimum heißt, einen Kompromiss zwischen möglichst klein und möglichst nah beieinander zu finden. Ist jetzt 5 und 6 besser als 2 und 7, die Zahlen sind zwar näher zusammen, aber im Mittel größer. Aus diesem Grund muß man die Funktion, deren Minimum finden will, umschreiben, zu einer sogenannten Merit-Funktion, die die einzelnen Bedingungen gegeneinander gewichtet, z.B. c^2 + 2*a^2 + 2*b^2 + 10*(a-b)^2. Mit Hilfe der Vorfaktoren kann man dann einstellen, was einem wichtiger ist, ein kleines c, ein kleines a oder eine kleine Differenz.
Antworten