Verfasst am: 11.02.2021, 20:44
Titel: Optimierung einer Variablen in einer Berechnungsschleife
Hallo,
mein Ziel ist es eine Variable t, die in einer Berechnungsschleife verrechnet wird, zu optimieren. Das Problem ist, dass t nicht in expliziter Form vorkommt. Es ist auch nicht möglich, nach t aufzulösen. Deshalb konnte ich die Matlab-Funktion "fmincon" nicht verwenden.
Das Programm läuft so ab:
1. Aus den gegebenen Parametern wird eine 3x3-Matrix erstellt
2. Diese wird auf eine bestimmte Art verrechnet (z.B. wird die Inverse gebildet o.ä.), das Ergebnis nenne ich Q
3. In einer for-Schleife werden auf einzelne Elemente von Q zugegriffen, mit t multipliziert und in der 3x3 Matrix A gespeichert
4. A wird verschiedenen Berechnungen unterzogen
5. Als Ergebnis hat man eine 3xn-Matrix sigma (n wird zu Beginn des Programms vorgegeben und kann z.B. 2 oder 8 betragen)
Die Nebenbedingungen der Optimierung sind in sigma enthalten. Dieser müsste (wahrscheinlich mit einer Schleife) durchlaufen und überprüft werden, ob sie die Nebenbedingungen einhalten. Ist denn überhaupt vorgesehen, dass man Nebenbedingungen mit einer Schleife überprüft?
Kann jemand eine Matlab-Funktion nennen, mithilfe dessen man so eine Aufgabenstellung lösen kann? Ich tappe seit langem im Dunkeln.
Vielen Dank im voraus!
Idence
PS: Wenn erwünscht, kann der Code präsentiert werden. Aber ich denke das hätte keinen Mehrwert.
In sigma stehen ja erst mal Werte. Was bedeutet, dass dort die Nebenbedingungen enthalten sind? Müssen die Werte in sigma bestimmte Bedingungen erfüllen, z.B. <= 0 sein? So würden bei fmincon ja nichtlineare Ungleichungen definiert.
Bisher sehe ich nichts, was gegen eine Lösung mit fmincon spricht. Zu wissen was du machst, also den Code zu zeigen, kann nie schaden. Zudem wäre gut zu wissen, welches Optimierungsproblem (Zielfunktion ist recht klar, aber die Nebenbedingungen nicht, siehe Rückfrage) du eigentlich lösen willst.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Sigma ist eine 3xn-Matrix. Alle Zahlen müssen in einem bestimmten Intervall liegen. Dabei werden an alle Elemente der gleichen Zeile, das gleiche Kriterium gestellt. Das heißt z.B., dass sigma(1,3) im gleichen Intervall wie sigma(1,10) liegen muss, weil diese in der gleichen Zeile stehen. Für die Zahlen in der zweiten Zeile gilt ein anderes Kriterium, für die dritte Zeile wiederum ein anderes.
Für fmincon würde die Funktion, die die Nebenbedingungen angibt, so aussehen: (sigma heißt im Code „sigma_k_speicher“)
Das heißt, ich würde sigma in einer Schleife durchlaufen und überprüfen, ob dessen Inhalte in den vorgeschriebenen Intervallen liegen.
Nun zu dem für mich eigentlich schwierigen Punkt:
Die Werte für sigma können nur berechnet werden, wenn die A-Matrix vorliegt. Für diese jedoch, braucht man einen konkreten Wert für t.
Fmincon funktioniert so, dass man eine Funktion y=f(x) vorgibt, dann bestimmt diese Methode ein x, für das y minimal wird. In meinem Fall würde das heißen, ich brauche eine Funktion für t, da t minimiert werden soll. Doch ich sehe nicht, wie ich die Gleichungen/den Code nach t auflösen soll. Bei mir liegt t nicht explizit vor. Somit kann ich keine Funktion für Fmincon angeben, die minimiert werden soll.
Die Berechnung von A und sigma erfolgt folgendermaßen:
Anmerkung:
-Die 3x3-Matrix „Q_1_2“ ist eine Matrix, in der einfach nur gegebene Konstanten Platz finden, dessen Berechung ist hier nicht enthalten.
-sigma heißt im Code "sigma_k_speicher"
alpha_k = [45-45].'*(pi/180); % Umwandlung Grad in Bogenmaß
A= zeros(3);
for LF=1:3 for i=1:2% zuerst +45° dann -45° Grad
T_sigma_to_x_y = [cos(alpha_k(i))^2sin(alpha_k(i))^2 -sin(2*alpha_k(i)) sin(alpha_k(i))^2cos(alpha_k(i))^2sin(2*alpha_k(i)) 0.5*sin(2*alpha_k(i))-0.5*sin(2*alpha_k(i))cos(2*alpha_k(i))];
Wenn man erstmalig an der Stelle ankommt, wo "Hier Optimierungsalgorithmus einfügen" steht, hat man sigma für LF=1 berechnet. Nun soll die Optimierung durchgeführt werden. Das Ergebnis ist ein Wert für t. t soll in einer Speichermatrix abgespeichert. Danach betrachtet man LF=2, ermittelt also auch für diesen Fall einen Wert für t. Dies geht bis LF=3.
Zum Schluss hat man also drei Werte für t. Das Endergebnis für diese Aufgabe ist der größte Wert für t.
Das hier beschriebende ist für mich kein Problem, nur weiß ich nicht, wie die Optimierung durchgeführt werden könnte.
man fügt nicht den Optimierungsalgorithmus in die Nebenbedingungen ein, sondern quasi umgekehrt.
Dazu würde ich aus der Berechnung der Nebenbedingungen eine Funktion machen, die von t und den benötigten Konstanten abhängt. Das müsste mit in die momentane Funktion constr hinein.
In der Funktion constr sehe ich das Problem, dass c momentan in jeder Iteration von s überschrieben wird. Du musst das untereinander hängen.
Soweit ich das sehen kann, können die Lastfälle voneinander unabhängig berechnet werden? Dann würde ich der Einfachheit halber auch drei Optimierungen durchführen und nicht alles in eine Funktion packen.
Bisher sehe ich nur, was die Nebenbedingungen sind. Diese werden ja vermutlich von mehreren t erfüllt. Was soll denn nun minimiert werden, um das gesuchte t zu bestimmen?
Generell finde ich deinen Code sehr schleifenlastig. Nutze doch aus, dass MATLAB schön mit Vektoren und Matrizen arbeitet? Beispielsweise in constr:
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
danke für die Tipps. Da ich C vor Matlab gelernt habe, denke ich sozusagen immer in C und nicht in Matlab. Muss das noch lernen. Darum arbeite ich oft mit zu vielen Schleifen.
"Bisher sehe ich nur, was die Nebenbedingungen sind. Diese werden ja vermutlich von mehreren t erfüllt. Was soll denn nun minimiert werden, um das gesuchte t zu bestimmen?"
Eigentlich suche ich nur eine Matlab-Methode, die in mein Programm geschickt! Werte für t einsetzt, daraus sigma berechnet und überprüft, ob sigma die Nebenbedingungen erfüllt. Von allen t, die die Nebenbedingungen erfüllen, soll ich als Ergebnis das minimale t erhalten. Diese Variante wäre mir am liebsten. Gibt es keine solche Methode?
Die Betonung liegt hierbei auf "geschickt". Denn ich habe schon ein Programm geschrieben, das Werte für t von t=0.1 bis 10 mit einer Schrittweite von z.B. 0.01 einsetzt. Theoretisch bekäme man eine Lösung. In der Praxis scheitert dies an zu langen Rechenzeiten.
Falls es so eine Methode nicht gibt und man fmincon verwendet muss:
Dann würde ich t als Funktion von sigma ausdrücken wollen, also t = f(sigma).
Matlab würde ein sigma finden, für das t minimal wird. Somit hätte ich das gesuchte t.
Dies wäre an sich auch super. Doch leider kann ich diese Funktionsgleichung nicht aufstellen, da nicht nach t auzulösen ist. Diese Variante scheint deshalb nicht zu funktionieren.
Was bleibt, ist eine andere Variante: sigma=f(t)
Bei dieser Variante muss sigma nicht minimiert, sondern maximiert werden, da man minimale t bei maximalem sigma erhält. Um von einem Minimierungsproblem zu einem Maximierungsproblem zu kommen, muss man lediglich die Funktion mit (-1) multiplizieren. Also kein Problem.
Da sigma nicht eine einzelne Zahl ist, sondern ein Vektor, müsste man den Betrag von sigma maximieren. Ob dieser Schritt zulässig ist, also an einer "richtigen Lösung" etwas ändert, kann ich nicht sagen.
Als Nebenbedingungen verwende ich die im vorherigen Post gezeigten. Damit wäre die Aufgabe theoretisch gelöst, nehme ich an. Dass man aber den Betrag von sigma maximieren soll, bereitet mir, wie gesagt, etwas Bauchschmerzen.
Dies wäre nicht nötig, könnte man die anderen Varianten durchführen. Deshalb noch einmal die Frage: Es gibt keine Matlab-Methode, die diese Aufgabe durch geschicktes Probieren löst?
Eigentlich suche ich nur eine Matlab-Methode, die in mein Programm geschickt! Werte für t einsetzt, daraus sigma berechnet und überprüft, ob sigma die Nebenbedingungen erfüllt. Von allen t, die die Nebenbedingungen erfüllen, soll ich als Ergebnis das minimale t erhalten. Diese Variante wäre mir am liebsten. Gibt es keine solche Methode?
Ist mir jedenfalls nicht bekannt. Einen Vorschlag zur Anwendung von fmincon habe ich dir ja gemacht. Als Zielfunktion kannst du, wenn sich die Berechnung der drei Lastfälle voneinander unabhängig sehen lässt,
@(t) t
verwenden. Wenn das nicht der Fall ist, dann etwas, das minimal wird, wenn jedes der t minimal wird, z.B.
@(t)sum(t)
.
Zitat:
Dann würde ich t als Funktion von sigma ausdrücken wollen, also t = f(sigma).
Das ist nicht notwendig, ich würde sogar sagen: nicht sinnvoll.
Zitat:
Was bleibt, ist eine andere Variante: sigma=f(t)
Auch das würde ich nicht empfehlen, weil du ja nicht sigma minimieren oder maximieren willst, sondern weil sigma in bestimmten Schranken sein muss.
Deswegen Zielfunktion siehe oben in diesem Beitrag, und zu den Nebenbedingungen siehe den vorherigen Beitrag.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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.