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

fminsearch auf function handle, ständig Variable übergeben

 

iammrvip
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 20.07.2012, 09:03     Titel: fminsearch auf function handle, ständig Variable übergeben
  Antworten mit Zitat      
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.

Code:

    a = pi/4;
   
    alpha = @(h) -get_alpha(h, cogBottle, massBottle, y);
   
    [hopt, aopt, exitf, out] = fminsearch(alpha,h0);
 


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?

Bisher habe ich das ganze so gelöst:

Code:

    global a
    a = pi/4;
   
    alpha = @(h) -get_alpha(h, cogBottle, massBottle, y);
   
    [hopt, aopt, exitf, out] = fminsearch(alpha,h0);

function a = get_alpha(h, cogBottle, massBottle, y)
    global a
 
    [...]
    a = ...
end
 


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.

Vielen Dank und beste Grüße
Robert
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2012, 10:47     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 20.07.2012, 10:57     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2012, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

ist es nicht möglich, die Höhe direkt mitzuvariieren? Das wäre deultich einfacher.

Zitat:
Die Frage ist nur, ob das ohne globale Variablen in Matlab überhaupt realisierbar ist bzw. wie.


Und die Antwort findest du in meinem ersten Beitrag:
Zitat:
Und wenn es wirklich nötig ist, erscheinen mir statische (persistent) Variablen sinnvoller.


Im übrigen hoffe ich, dass du bei dem erwähnten Newton-Verfahren auf eine Standardroutine aus der Optimization Toolbox zurückgreifst?

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 20.07.2012, 11:13     Titel:
  Antworten mit Zitat      
Ok, weil uns dies vom Betreuer angekreidet wurde, wir sollten die Variable mit übergeben.

Nur finde ich leider nichts, wie man das bei Funktion handle machen können soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
iammrvip
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 20.07.2012, 14:23     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Im übrigen hoffe ich, dass du bei dem erwähnten Newton-Verfahren auf eine Standardroutine aus der Optimization Toolbox zurückgreifst?


Nein wir sollten das ganze selbst implementieren
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2012, 17:04     Titel:
  Antworten mit Zitat      
Hallo,

"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?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
eey
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2012, 21:53     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2025 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.