WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

fmincost ändert Iterationspunkte nicht

 

PreOptimierer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.08.2014, 06:57     Titel: fmincost ändert Iterationspunkte nicht
  Antworten mit Zitat      
Hallo, ich sitze vor einem Optimierungsproblem, für welches ich fmincost nehmen wollte.
Bin nicht ganz sicher, ob die Funktion die richtige ist:

Ich habe ein Finite Elemente Modell, dessen Materialdaten ich in jedem Durchlauf ändere und mit einem Sollergebnis (Kraft - Verschiebungs-Plot) vergleiche.
Das Vergleichen ist meine zu optimierende Funktion, hierbei wird im Endeffekt die Summe der Abstandsquadrate von Ziel- und Istplot bestimmt.
Ich habe dies jedoch genau genommen als Integral |soll - ist| dx bestimmt und das Integral numerisch durch die Obersumme bestimmt. (Sollte aber keinen Unterschied machen).

Nun hatte ich für den fmincost solver folgende Randbedingungen definiert:

Die Matrix A und der Vektor b (aus A*x <= b) lauten:
A

C



Diese Größen stammen aus folgender Überlegung:
Ich arbeite mit 14 Variablen, wobei 7 davon Spannungen sind die anderen 7 dazugehörige Dehnungen (kann beides frei verändert werden).
Zwangsbedingungen ist, dass die Spannungen und Dehnungen in aufsteigender Reihenfolge vorliegen d.h.
x1 < x2 < ... < x7 (Spannungen)
-> x1 - x2 < 0 usw

x8 < x9 < ... < x14 (Dehnungen)
-> x8 - x9 < 0 usw

Ferner soll x1 größer sein als die Spannung am Ende des linearen Materialbereiches d.h.
const <= x1

und es muss gelten 0 < x d.h. -x < 0

Dies steckt alles in den Matrizen und das sind auch alle Randbedingungen die ich habe.

Wenn ich jedoch nun fconmin anwende ändert diese den Vektor x nicht bei jeder Iteration sondern setzt immer die selben Werte ein (GANZ selten scheinen MINIMALST veränderte Werte eingesetzt zu werden, aber das zeigt sich in der 34234 Nachkommastelle).
Die Vermutung liegt nahe, dass ich die Constraints derart gesetzt habe, dass diese keine Iteration zulassen (ala x1 = x1), aber mir scheint dem nicht so zu sein.

Optimiere ich mittels fmincost mit der selben Objectivefunktion und dem selben Startvektor x0 so funktioniert das ganze (dauert aber leider ewig).
Würde gerne fconmin probieren, aber wieso funktioniert das nicht?

Sorry für die Wall of Text, vielen Dank für jede Hilfe!


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.08.2014, 08:35     Titel:
  Antworten mit Zitat      
Hallo,

stelle doch bitte den Code und die Daten als .mat-Datei zur Verfügung, dann kann man sich das deutlich leichter ansehen.

Mit fmincost und fconmin meinst du fmincon?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
PreOptimierer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2014, 01:24     Titel:
  Antworten mit Zitat      
Hi,
danke für deine Nachricht.

Ich meinte immer fmincon, sorry, war schon spät^^

Mein Code ist angehängt, jedoch trivial, ich habe fmincon dann auf der Kommandozeile aufgerufen (also nicht in irgendeinem separaten Skript oder so) mit den Werten für A und b.

A und b kann man oben entnehmen, diese wurden mittels des angehängten Skripts createConstrants erzeugt.


Nochmal das Problem:
A und b beschreiben meine Randbedingungen und ich sehe nicht, dass die irgendeine der Variablen fixieren. (Es sollten sich schlicht Ordnungen gemäß x1 < x2 < ... < xn ergeben, trotzdem kann man die Variablen ja in gewissem Maße variieren ohne die Ordnung zu verletzen)
Dennoch verändert fmincon die Variablen nicht und in jedem Iterationsschritt werden die selben Werte verwendet (bis auf sehr seltene Ausnahmen, aber dann sind die Abweichungen ebenso MINIMALST (d.h. nur in der x-ten Nachkommstelle zu erkennen, völlig unerheblich))

PythonTest.m
 Beschreibung:
Dies ist die Objective Function, wobei implizit dies eigentlich das aufgerufene Pythonskript ist. Das Skript berechnet schlicht die Abstandsquadratsumme zwischen Simulationsergebnisplot und Zielplot. (D.h. Returnvalue ist > 0

Download
 Dateiname:  PythonTest.m
 Dateigröße:  852 Bytes
 Heruntergeladen:  599 mal
createConstraints.m
 Beschreibung:
Diese Funktion erstellt die Zwangsbedingungen, die ich auch schon schon erläutert habe. Zwangsbedingungen sind z.B. das die Spannungen in aufsteigender Reihenfolge vorliegen müssen (sonst kann die Simulation schief gehen) und die unterste Spannung grö

Download
 Dateiname:  createConstraints.m
 Dateigröße:  596 Bytes
 Heruntergeladen:  519 mal
createInitialValues.m
 Beschreibung:
Erstellt den Startvektor. Schätzung basiert auf dem üblichen Verlauf einer Spannungsdehnungskurve (konkav) und dem bekannten Initialspannungswert ab welchem plastisches Verhalten vorliegt.

Download
 Dateiname:  createInitialValues.m
 Dateigröße:  365 Bytes
 Heruntergeladen:  529 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2014, 08:48     Titel:
  Antworten mit Zitat      
Hallo,

das sind nun 3 Funktionen, aber wie wird das ganze denn von fmincon aufgerufen?

Ich würde gerne das Problem reproduzieren, aber dazu bräuchte man das vollständige Problem. Wenn ich das richtige sehe, bräuchte ich dazu Abaqus, insofern scheidet diese Möglichkeit wohl ohnehin aus.

Mir scheint, dass du in Pythontest.m die Nebenbedingungen noch einmal aufgenommen hast, indem du die Zielfunktion ggf. auf NaN setzt - das halte ich für keine gute Idee.

Was ist denn die Statusmeldung von fmincon?

Poste bitte auch mal iterativen Output von fmincon.

Eine Möglichkeit: wenn numerische Simulationen in der Zielfunktion gemacht werden, dann können die Fehler darin die Gradienten stark verfälschen. Da hilft es manchmal, die Option 'DiffMinChange' hochzusetzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
PreOptimierer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2014, 02:57     Titel:
  Antworten mit Zitat      
Hi,

habs nun mal sehr lange laufen lassen und nach einer Weile passiert da auch mehr, jedoch iteriert er immer sehr lange um die selben Werte rum, das Ergebnis war auch nicht berauschend (habe es irgendwann abgebrochen), fminsearch ist da deutlich besser.

Die PythonTest.m hatte ich nachträglich nochmal für Nutzung mit fminsearch geändert, hatte das beim Uploaden vergessen.

Ich habe nun wie du es mir rietest DiffMinChange hochgesetzt, jedoch müsste ich das eigentlich für jede variable einzeln bestimmen, da die variablen verschiedene sachen beschreiben und nicht für jede der selbe wert sinnvoll ist.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.08.2014, 09:49     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
habs nun mal sehr lange laufen lassen und nach einer Weile passiert da auch mehr, jedoch iteriert er immer sehr lange um die selben Werte rum, das Ergebnis war auch nicht berauschend (habe es irgendwann abgebrochen), fminsearch ist da deutlich besser.

Das deutet sehr darauf hin, dass aus den zuvor genannten Gründen die Gradientenschätzung keine guten Ergebnisse liefert.

Zitat:
Ich habe nun wie du es mir rietest DiffMinChange hochgesetzt, jedoch müsste ich das eigentlich für jede variable einzeln bestimmen, da die variablen verschiedene sachen beschreiben und nicht für jede der selbe wert sinnvoll ist.

Dann müsstest du das mit der Option 'TypicalX' kombinieren.

Wenn fminsearch an sich gut funktioniert, dann kann es auch noch interessant sein, patternsearch (Global Optimization Toolbox) zu versuchen. Dadurch ist es wahrscheinlicher, dass globale Minima gemieden werden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
PreOptimierer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2014, 17:47     Titel:
  Antworten mit Zitat      
Besten Dank! Werde in der Zukunft noch mehr mit Optimierung zu tun haben, jetzt reicht leider die Zeit nicht mehr aus noch viel herumzuprobieren, daher werde ich fminsearch nehmen ("Never change a running system") mit sinnvollen Startwerten, danke für deine Informationen, hat mich aufjedenfall weitergebracht!
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.