Verfasst am: 08.10.2013, 19:03
Titel: Optimization Toolbox mit Ansys
Hallo
vorneweg, ich hab schon das Forum durchsucht und viele andere Quellen durchgelesen, aber keine brauchbare Antwort dazu gefunden.
Ich würde gerne mit der Toolbox eine Optimierung durchführen, die auf eine Ansys Simulation zugreift. Die nötigen Parameter hab ich mittlerweile aus Ansys in Matlab mit einem Skript auslesen können. Nur wie geht es jetzt weiter?
In der Optimization Toolbox muss eine Objective function in Form einer function handle definiert werden. Das Problem ist, dass die Funktion unbekannt ist, da sie ja erst simuliert wird.... Was ich habe sind nur die Variablen (Geometrieparameter, Materialparameter usw.) mit denen Matlab spielen soll um die Zielgröße zu optimieren. Geht das überhaupt? Wie muss denn dann meine objective function aussehen?
Aussehen der Objective Function:
Input: ein Vektor x, der deine Variablen enthält.
Output: der Zielfunktionswert
Ohne Ansys zu kennen muss deine Zielfunktion also wohl folgendes machen:
- aus x die einzelnen Variablen extrahieren
- mit diesen Variablen die Ansys-Simulation durchführen
- aus den Ergebnissen den Zielfunktionswert berechnen.
Danke erstmal, aber so ganz habe ich das Aussehen der objective function noch nicht verstanden.
Machen wir es mal konkreter:
sagen wir ich habe 7 variable Größen für die Optimierung p1-p7. Sieht das dann so aus?
hallo,
danke soweit, ich hab es zum laufen gebracht.
allerdings gibt es noch probleme.
mit fminsearch funktioniert es, er verändert die startwerte und minimiert den zfwert. aber mit fminsearch kann man keine constraints einfügen. also hab ich es mit fminmax und mit fmincon probiert. dort gibt es aber immer das problem, dass er die startwerte nicht ändert. er startet den optimiervorgang, aber verändert nichts.
die startwerte werden angetastet, was ich in der textdatei an der formatierung sehe:
Zitat:
5.000000e+03
5000
5000
5000
5000
5000
aber eben nicht verändert...
Nach einer Weile stoppt er dann mit der Fehlermeldung
Zitat:
fminimax stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are
satisfied to within the default value of the constraint tolerance.
bzw. bei fmincon
Zitat:
Optimization completed because at the initial point, the objective function is non-decreasing
in feasible directions to within the default value of the function tolerance, and
constraints are satisfied to within the default value of the constraint tolerance.
das ist aus der Ferne schwer zu diagnostizieren.
Wenn, dann würde ich fminsearch und fmincon vergleichen, bzw. erst mal fminunc verwenden um es mit fminsearch abzugleichen.
Nutzt Ansys die volle Genauigkeit der Parameter bzw. kommen auch wirklich unterschiedliche Ergebnisse heraus, wenn du z.B. 5000 und 5000.0001 als Wert verwendest?
Falls eines von beiden nicht der Fall ist, ist die Zielfunktion damit nicht differenzierbar und man muss sehr dabei aufpassen, ob dann der Einsatz eines gradientenbasierten Verfahrens sinnvoll ist.
Falls du die Global Optimization Toolbox hast, wäre meine Empfehlung, mal patternsearch zu versuchen.
ist da überhaupt eine 1 am ende? für mich bleibt der wert da immer bei 5000.
mit fminsearch wird der startvektor aufjedenfall geändert. das erzeugt dann auch bedeutende änderung am zielfunktionswert. und so findet fminsearch den weg zum ziel.
das ist bei fmincon oder fminmax leider nicht so.
fminunc verändert meinen startvektor auch. erst nur sehr geringfügig
Zitat:
5.000610e+03 <-- die änderung reicht übrigens für eine änderung des zfwerts!
5000
5000
5000
5000
5000
und gibt zwischendurch immer mal Warnungen aus:
Warning: Gradient must be provided for trust-region algorithm; using line-search algorithm instead. die änderungen wird nicht größer. nach einer weile beendet es sich dann mit der Meldung:
Zitat:
Initial point is a local minimum.
Optimization completed because the size of the gradient at the initial point
is less than the default value of the function tolerance.
patternsearch kann ich benutzen, er verändert die startwerte nach einer weile auch sehr großzügig. nur hab ich das gefühl, dass er zu grob vorgeht und irgendwann nur zwischen festgefahrenen werten hin und her tauscht, z.b.
Zitat:
9225
9225
13725
13725
13725
13725
dann tauscht er nur die werte untereinander aus und kommt irgendwie nicht weiter.
fminsearch hat mir da am besten gefallen. die frage ist: wenn fminsearch geht, müsste dann nicht auch fmincon oder fminmax gehn?
fminsearch und fmincon haben komplett verschiedene Ansätze. Das eine ist ableitungsfrei, das andere nicht.
Bei fmincon kann helfen, die Einstellung von DiffMinChange hochzusetzen.
Ist dein Parameter"vektor" x skalar, also nur eine zu optimierende Variable?
Es macht an sich wenig Sinn, dass fmincon wiederholt genau den selben Wert testet. Ist es möglich, dass das Problem im Schreiben der Datei liegt?
Ohne sich das Problem wirklich ansehen zu können ist das leider ein Stück weit Stochern im Nebel...
system('"C:\Program Files\ANSYS Inc\v145\Framework\bin\Win64\RunWB2.exe" -F "C:\data\projekt.wbpj" -R "C:\code\skript.py"'); %Starten von Ansys+Laden des Projekts+Laden des Pythonskripts zum Ein- und Auslesen
ich würde Dateien nach dem Lesen/Schreiben immer mit fclose schließen.
Gerade wenn mehrfach in einer Datei gelesen/geschrieben wird, kann es sonst Probleme geben.
Du hast ja 6 Parameterwerte. Was davor geschrieben hast, sah immer nach einem skalaren Parameter aus. Wie passt das zusammen?
Lass das ganze im Zweifel auch mal mit 'Display' auf 'Iter' laufen.
Bin gerade verwirrt, oben habe ich ja bereits p1-p7 erwähnt. du hast mir dann auch den nötigen code gepostet. es hat sich seitdem auch nichts verändert. es gibt in dem beispiel 6 inputparameter (p1-p6) und eine zielgröße (p7).
ich werde alle deine vorschläge beherzigen und schauen was passiert. danke aufjedenfall
ich antworte hier auf viele Beiträge und lese dann nicht jeden Thread nochmal komplett durch. Bei meinem Kurzzeitgedächtnis kann es schon mal passieren, dass ich die anfängliche Antwort am Ende nicht mehr berücksichtige.
Mit "davor" meinte ich Dinge wie
5.000610e+03 <-- die änderung reicht übrigens für eine änderung des zfwerts!
5000
5000
5000
5000
5000
oder
9225
9225
13725
13725
13725
13725
hallo harald,
das sind meine 6 startwerte für p1-p6
also
p1=5000
p2=5000
p3=5000
p4=5000
p5=5000
p6=5000
ich hab jetzt fclose eingefügt und eine ausgabe erzeugt und mit fmincon laufen lassen:
Code:
p1 =
5000
p2 =
5000
p3 =
5000
p4 =
5000
p5 =
5000
p6 =
5000
zfwert =
38.6566
p1 =
5.0000e+03
p2 =
5000
p3 =
5000
p4 =
5000
p5 =
5000
p6 =
5000
zfwert =
38.6566
p1 =
5000
p2 =
5.0000e+03
p3 =
5000
p4 =
5000
p5 =
5000
p6 =
5000
zfwert =
38.6566
p1 =
5000
p2 =
5000
p3 =
5.0000e+03
p4 =
5000
p5 =
5000
p6 =
5000
zfwert =
38.6566
p1 =
5000
p2 =
5000
p3 =
5000
p4 =
5.0000e+03
p5 =
5000
p6 =
5000
zfwert =
38.6566
p1 =
5000
p2 =
5000
p3 =
5000
p4 =
5000
p5 =
5.0000e+03
p6 =
5000
zfwert =
38.6566
p1 =
5000
p2 =
5000
p3 =
5000
p4 =
5000
p5 =
5000
p6 =
5.0000e+03
zfwert =
38.6566
First-order Norm of
Iter F-count f(x) Feasibility optimality step 073.865658e+010.000e+000.000e+00
Initial point is a local minimum that satisfies the constraints.
Optimization completed because at the initial point, the objective functionis non-decreasing
in feasible directions to within the default value of the function tolerance, and
constraints are satisfied to within the default value of the constraint tolerance.
<stopping criteria details>
Optimization completed: The final point is the initial point.
The first-order optimality measure, 0.000000e+00, is less than
options.TolFun = 1.000000e-06, and the maximum constraint
violation, 0.000000e+00, is less than options.TolCon = 1.000000e-06.
viel getan hat sich mit fmincon also nicht. er geht die startwerte für jeden parameter einmal durch ohne sie zu verändern.
soll ich es mal mit diffminchange probieren? wo kann ich denn in der toolbox diffminchange eingeben? dort finde ich die option nicht. geht das nur über optimset?
Ich habe übrigens linear inequalities constraints in der form
A=[-1 1 0 0 0 0;0 0 -1 1 0 0;0 0 0 0 -1 1]
b=[0;0;0]
denke aber das sollte so ok sein. das soll bewirken, dass
p1>p2
p3>p4
p5>p6
ist.
Hallo
wie würde denn der Befehl aussehen?
optimset(..)?
Muss ich nur die Einstellungen angeben, die ich ändern will und der Rest bleibt auf standard?
Mit patternsearch werde ich nämlich nicht glücklich. Das legt sich zu schnell auf einen minimal besseren Wert fest und macht dann nicht mehr viel (siehe Bild). Andere Kombinationen werden einfach ausgelassen. Aber wenigstens ändert er die Startwerte! Das möchte ich jetzt auch mit fmincon etc. erreichen.
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
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.