Verfasst am: 20.07.2012, 09:03
Titel: fminsearch auf function handle, ständig Variable übergeben
Hallo!
Ich habe folgendes Problem: Ich habe eine Funktion get_alpha implementiert, die mir für gegebene Höhe auf einem Gewissen Gitter einen optimalen Winkel per Newton-Verfahren bestimmt. Nun soll die Höhe h optimiert/maximiert werden. Dazu nutze ich die interne Optimierungsroutine fminsearch, der Winkel wird aus geometrischen Gründen als pi/4 initialisiert, h0 ist die Anfangshöhe.
Problem ist nun nur: Die Berechnung verläuft wesentlich schneller, wenn der jeweils zu letzt ermittelte Winkel übergeben wird (ist ja auch logisch, da besser genähert ans Optimum).
Ich möchte nun gern den jeweils aktuellen Winkel neu mit übergeben. Wie mach ich das?
Nur zum einen ist es über globale Variablen nicht schön programmiert, zum anderen wurde ich auch schon gewarnt, dass dies in späteren/früheren Versionen unberechenbare Konsequenzen annehmen kann.
Problem ist nun nur: Die Berechnung verläuft wesentlich schneller, wenn der jeweils zu letzt ermittelte Winkel übergeben wird (ist ja auch logisch, da besser genähert ans Optimum).
Das verstehe ich nicht. Optimierungsalgorithmen suchen doch ohnehin in der Nähe des letzten Wertes nach besseren Werten?
Die einzige Aufgabe der Zielfunktion ist, die Güte eines Punktes zu bewerten. Mir ist nicht klar, welche Rolle dabei ein vorheriger Punkt spielen soll.
Und wenn es wirklich nötig ist, erscheinen mir statische (persistent) Variablen sinnvoller.
Die eigentliche Aufgabe ist die optimale Höhe für maximalen Kippwinkel a zu bestimmen.
Also das eigentlich Problem ist:
Optimiert wird über die Variable h also die Höhe.
Über die Routine get_alpha wird für eine feste Höhe (bei gegebenem Volumen und Gitter) für diese feste Höhe der maximale Winkel ermittelt. Das geschieht über eine Newton-Iteration/Newton-Verfahren.
Nun soll über fminsearch noch die optimale (=maximale) Höhe ermittelt werden zum maximalen Winkel.
Problem ist nur: get_alpha beginnt mit einem Startwert pi/4, die Höhe ist fest (bzw. durch fminsearch bestimmt), und gibt dann z.b. nach der ersten Optimierung durch fminsearch einen Winkel - sagen wir -.30343 aus, nach ca. 20 Newton-Schritten.
Dieser Winkel ist aber natürlich schon besser genähert als pi/4, deshalb möchte ich ihn get_alpha übergeben. Wenn ich nun 0.30343 übergebe, braucht die 2. Newton-Iteration nur noch 8 Schritte, übergebe ich sie nicht, beginnt get_alpha wieder bei pi/4 und braucht wieder ca. 20 Schritte, was natürlich ein deutlicher Zeitverlust im Algorithmus ist.
Es läuft also in jedem Schritt der Routine fminsearch diese Newton-Iteration, die zu dieser Höhe den maximalen Winkel a bestimmt. Übergebe ich den zur ermittelten Winkel in den nächsten Schritt von fminsearch, ist natürlich die gesamte Suche viel schneller.
Ich hoffe, ich konnte es jetzt verständlicher erklären.
Die Frage ist nur, ob das ohne globale Variablen in Matlab überhaupt realisierbar ist bzw. wie.
"Variablen mit übergeben" passiert üblicherweise über anonymous function handles.
Was der Betreuer mit etwas bestimmtem meint, wid er euch i.d.R. auch am besten selbst sagen können?
Also du optimierst erst den Winkel per Newton Verfahren und dann die Höhe per fminsearch?
Also machst du ja quasi aus einem 2-Dimensionalen Minimierungsproblem zwei 1-Dimensionale. Das ist aber schon vom Prinzip her eher schlecht, weil du damit oft nichtmal ein lokales Minimum findest sondern höchstens eine (mehr oder weniger) gute Näherung an eines.
Ich würde (wie von Harald vorgeschlagen) beides gleichzeitig optimieren (also Höhe und Winkel). Dann findest du auch sicher ein lokales Minimum und hast sonst keine weiteren Probleme wie globale Variablen oder ähnliches.
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.