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

Optimierung mit fminsearch

 

ogbob
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2015, 12:30     Titel: Optimierung mit fminsearch
  Antworten mit Zitat      
Hallo,

der Umgang mit Matlab ist mir noch relativ neu.

Ich möchte mit fminsearch das Minimum einer Funktion finden. Dafür steht mir eine Funktion mit symbolischen Variablen zur Verfügung. Ich möchte also jetzt für die symbolischen Variablen Werte finden, die die Funktion minimiert.

Das ganze sieht in etwa so aus:
Code:

%die zur Verfügung stehenden symbolischen Variablen:
syms a b c

%eine Funktion mit diesen Variablen:
f = a^2+2*(b/c)
 


Meine Frage ist jetzt:
Wie kann ich auf diesen Grundlagen das Minimum finden?

Mein erster Gedanke war:

Code:

f =@(a,b,c) f;

[f,fval] = fminsearch(f,[0,0,0])
 


Das funktioniert aber nicht, wegen der fehlenden Konvertierung in double, so wie ich das verstanden habe. Eine Lösung wie ich das zum Laufen bringe finde ich aber nicht.

(In die übliche Form mit @(x) x(1)^2 ..... Schreibweise kann ich es nicht von Hand umwandeln, da die Funktion die mir zur Verfügung steht zu lang ist)

Hilfe ! Sad
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

spätestens wenn du vielleicht noch symbolische Parameter hast wäre es doch sinnvoller, den Gradienten auf 0 zu setzen?

Ansonsten gibt es genau für den Zweck matlabFunction .
Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ogbob
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2015, 18:14     Titel:
  Antworten mit Zitat      
Danke schonmal für die sehr schnelle Antwort!

-Mit dem Gradient auf Null setzen kann ich nicht so viel anfangen Confused

Also so wie ich das verstanden habe erwartet fminsearch ein handle. Das habe ich jetzt mit matlabFunction erstellt und an fminsearch übergeben. Das ganze sieht so aus:

Code:


syms x f a b c

x(1) = a;
x(2) = b;
x(3) = c;


f = a^2+2*(b/c);

f = matlabFunction(f)

%Ausgabe nach diesem Aufruf ist: f = @(a,b,c)(b.*2.0)./c+a.^2

[f,fval] = fminsearch(f,[0,0,0])

 


Nach dem letzten Aufruf wird ein Error geworfen:


Error using symengine>makeFhandle/@(a,b,c)(b.*2.0)./c+a.^2
Not enough input arguments.

Error in fminsearch (line 191)
fv(:,1) = funfcn(x,varargin{:});

Error in Test_fminsearch (line 1Cool
[g,fval] = fminsearch(f,[0,0,0,0,0,0])


Mit der Aussage "Not enough input arguments" kann ich an dieser Stelle gar nicht anfangen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Mit dem Gradient auf Null setzen kann ich nicht so viel anfangen

Ist an sich Schulwissen: in einem Minimum oder Maximum ist die Ableitung 0, mehrdimensional entsprechend der Gradient. Wenn man also symbolisch ein Minimum oder Maximum sucht, muss man
Code:
grad(f(x)) = 0

lösen.

Zitat:
Mit der Aussage "Not enough input arguments" kann ich an dieser Stelle gar nicht anfangen.

Hast du denn vielleicht mal die Dokumentation gelesen und dir angeschaut, wieviele Eingabeargumente die Funktion, die übergeben wird, annehmen soll?
Zitat:
fun is the function to be minimized. It accepts an input x and returns a scalar f, the objective function evaluated at x.


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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2015, 14:03     Titel:
  Antworten mit Zitat      
Sorry aber da blicke ich nicht durch. Es muss doch eine einfach Lösung geben anstatt die Variablen x(1), x(2) und x(3) zu nennen und damit einen Vektor x zu füllen...

Code:


f =@(x) x(1)^2+2*(x(2)/x(3));

[f, fval] = fminsearch(f,[0,0,0])

 


... die Variablen beliebig zu nennen:

Code:


f =@(a,b,c) a^2+2*(b/c);

[f,fval] = fminsearch(f,[0,0,0])

 



Mit Gradient = 0 steht man doch letztendlich vor ähnlichen Problemen oder nicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Es muss doch eine einfach Lösung geben anstatt die Variablen x(1), x(2) und x(3) zu nennen und damit einen Vektor x zu füllen...

Mir ist keine bekannt. Wo liegt denn das Problem dabei?

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

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2015, 08:45     Titel:
  Antworten mit Zitat      
Das Problem ist, dass ich aus einer vorherigen Berechnung (durch ein Skript) eine Matrix erhalte, die voller Funktion mit symbolischen Variablen ist. Jetzt möchte ich daraus erstmal nur eine Funktion nehmen.
Die Funktionen auf in der Matrix sind aber sehr sehr lang, so lang, dass das manuelle Ändern der Variablen (a, b, c, d, e, ...) in x(1), x(2), x(3), ... keinen Sinn macht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Die Funktionen auf in der Matrix sind aber sehr sehr lang, so lang, dass das manuelle Ändern der Variablen (a, b, c, d, e, ...) in x(1), x(2), x(3), ... keinen Sinn macht.

Eine Möglichkeit wäre eine Umwandlung in folgender Form:
Code:
x = [1, 2, 3]; % als Eingabeargument
xcell = num2cell(x);
[a, b, c] = deal(xcell{:}) % zum Weitermachen


Das wird allerdings nicht mit einem anonymous function handle gehen, muss also in eine Funktion ausgelagert werden.

Die andere Frage ist natürlich, ob es so sinnvoll ist, die Matrix anfangs symbolisch aufzustellen, wenn man am Ende damit numerisch arbeiten will.

Grüße,
Harald
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 - 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.