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

Minimum einer Funktion

 

ThKo26
Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 11:24     Titel: Minimum einer Funktion
  Antworten mit Zitat      
Hallo zusammen,

ich habe das Thema schon mal angesprochen. Ich versuche es nun sehr ausführlich zu erklären.

Ich besitze eine Matrix X als Eingang (siehe Anhang). Die Matrix besteht aus 10 Spalten und 32 Zeilen. Jede Zeile ergibt ein verschiedene Ergebnisse Matriy Y_norm (siehe Anhang). Die Eergebnis Matrix besteht aus 5 Spalten und 32 Zeilen. Ich hoffe, das ist soweit verständlich.

ich möchte mit fmincon das minimum einer Funktion bestimmen,
f = w1J1(x)+w2J2(x)+w3J3(x)+....

f = Kostenfunktion
w = Gewichtungsfaktor
J = Ergebnis
x = (variablen)der Input zu dem Ergenis
Code:
function f = singleObjCostFunWL(X)
   f = WL_CEntry*y_norm(:,3)*(X')+WL_MD*y_norm(:,4)*(X')+WL_CExit*y_norm(:,5)*(X');
end


Nun, wie komme ich von X zu Y. Ich habe ein MKS Modell. dieses wird mit 10 Parametern bedatet. Dieses Modell hat jetzt verschiedene Ausgangsgrößen. In diesem Fall 5.

Ich möchte mit der fmincon, die Funktion minimieren und dabei Gewichtungsfaktoren berücksichtigen.

Fragen:
Ich benötige einen Startwert x0. Wa soll ich da als Startwert nehmen?
Welchen Algorithm soll ich nutzen? interior-point, trust region-refelctive,sqp, active-set,?
Oder nutze ich statt fmincon lieber ga ?

Ich benötige dringend Unterstützung, da ich es für meine Abschlussarbeit benötige.

Vielen Dank.

Grüße

y_norm.mat
 Beschreibung:

Download
 Dateiname:  y_norm.mat
 Dateigröße:  1.4 KB
 Heruntergeladen:  437 mal
X.xls
 Beschreibung:

Download
 Dateiname:  X.xls
 Dateigröße:  28 KB
 Heruntergeladen:  405 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

was willst du denn eigentlich variieren? X oder w? Wenn du w variieren willst, muss es auch ein Eingang der Zielfunktion sein.

Zitat:
Ich benötige einen Startwert x0. Wa soll ich da als Startwert nehmen?

Das musst du wissen. Irgendetwas "vernünftiges".

Zitat:
Welchen Algorithm soll ich nutzen? interior-point, trust region-refelctive,sqp, active-set,?

Siehe https://de.mathworks.com/help/optim.....oosing-the-algorithm.html

Zitat:
Oder nutze ich statt fmincon lieber ga ?

fmincon macht lokale Optimierung. Man ist also auf eine gutmütige Funktion bzw. einen ausreichend guten Startwert angewiesen.
Wenn das nicht der Fall ist, hilft globale Optimierung. Da würde ich aber erst andere Funktionen statt ga verwenden, siehe
https://de.mathworks.com/help/gads/.....her-solver.html#bu9r6hl-4

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 12:55     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe.

ich möchte nur w variieren, da für jeden Eingang (X) eine Lösung (Y) exisitiert.

Code:

WL_CEntry = 1/3;  
WL_MD = 1/3;    
WL_CExit = 1/3;  

minRH = 1/2;      
RHV = 1/2;
 


Zielfunktion:
Code:
function f = singleObjCostFunRH(X)
    global J1; global J2;    
    f = (minRH)*J1*(X')+(RHV)*J2*(X');
   
   end


Code:
function f = singleObjCostFunWL(X)
    global J3; global J4; global J5;
    f = WL_CEntry*J3*(X')+WL_MD*J4*(X')+WL_CExit*J5*(X');
   
end


Der Startwert wäre bezieht sich auf den Eingang X und somit benötige ich für jede Spalete einen Startwert. Da habe ich etwas vernüftiges
Code:
x0 =[0 0 0 0 150 0 0 0 0 100];


Insgesamt habe ich jetzt folgendes:
Code:

Aeq = [0 0 0 0 0 0 0 0 0 ];
beq = [0];
lb = [0 0 0 0 0 0 0 0 0 0];
ub = [0 0 0 0 0 0 0 0 0 0];
x0 =[0 0 0 0 150 0 0 0 0 100];
%
tic
[x,fval] = fmincon(@singleObjCostFunRH,x0,[],[],Aeq,beq,lb,ub);
toc
 


Code:
function f = singleObjCostFunRH(X)
    global J1; global J2;    
    f = (minRH)*J1*(X')+(RHV)*J2*(X');
   
   end


und erhalte folgenden Fehler

Code:
Warning: Length of lower bounds is > length(x); ignoring extra bounds.
> In checkbounds (line 27)
  In fmincon (line 306)
Warning: Length of upper bounds is > length(x); ignoring extra bounds.
> In checkbounds (line 41)
  In fmincon (line 306)
Undefined function or variable 'minRH'.

Error in singleObjCostFunRH (line 3)
    f = (minRH)*J1*(X')+(RHV)*J2*(X');

Error in fmincon (line 534)
      initVals.f = feval(funfcn{3},X,varargin{:});

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINCON cannot continue.


Danke.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
ThKo26
Themenstarter

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 13:08     Titel:
  Antworten mit Zitat      
Hallo ,

Die Matrix X (Eingang) hat 10 Parameter.
Der Range von den Parametern 1,2,3,4,6,7,8,9 geht von 0 bis 50
Der Range von dem Parameter 5 geht von 150 bis 300
und der Range von dem Parameter 10 geht von 100 bis 250.

Somit nutze ich den Startwert

Code:
x0 =[0 0 0 0 150 0 0 0 0 100];


Nebenbedinungen:

der Eingang muss immer bei allen J1, J2, J3, J4, J5 gleich bleiben. Es dürfen keine J1 und J2 etc mit unterschiedllichen Eingängen sein.

Ich hoffe, dass ist verständlich.

Danke für die hilfe !!

Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

was du schreibst, ist für mich recht verwirrend.

Zitat:
Die Matrix X (Eingang) hat 10 Parameter.

Was soll es bedeuten, dass eine Matrix Parameter hat??

Zitat:
Der Range von den Parametern 1,2,3,4,6,7,8,9 geht von 0 bis 50
Der Range von dem Parameter 5 geht von 150 bis 300
und der Range von dem Parameter 10 geht von 100 bis 250.

Dann setze doch lb und ub entsprechend statt auf die sinnfreien Nullvektoren.

Auch Aeq und beq sind nicht sinnvoll. Wenn du keine linearen Gleichungen hast, dann setze das ebenso wie A und b auf [].

Zitat:
der Eingang muss immer bei allen J1, J2, J3, J4, J5 gleich bleiben. Es dürfen keine J1 und J2 etc mit unterschiedllichen Eingängen sein.

Ich habe keine Ahnung, was das bedeuten soll.

Zum vorherigen Beitrag noch:
du brauchst genau eine Zielfunktion.
Wenn du die Gewichte variieren willst, dann müssen diese wie gesagt ein Eingabeargument der Zielfunktion sein. Vor allem aber muss die Zielfunktion von den Gewichten abhängen.

Globale Variablen sind hier unnötig.
https://de.mathworks.com/help/optim.....ing-extra-parameters.html

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 14:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

Harald hat Folgendes geschrieben:
Hallo,

was du schreibst, ist für mich recht verwirrend.


Die Matrix X hat 10 Spalten und 32 Zeilen. Jede Spalte ist sozusagen ein Parameter und jede Zeile ist ein Run.

Die Matrix Y hat 5 Spalten und 32 Zeilen. Jede Spalte ist eine Ergebnisgröße und jede Zeile ist ein Run.

Nun:
Ich möchte mir jetzt das Minimum ausgeben lassen.

Code:
min (f)
f(x) = J1(x) + J2(x)


Es darf aber nicht sein, dass für J1 das Ergebnis aus Run 5 genommen wird und für J2 das Ergebnis aus Run 10. Sondern J1 und J2 müssen als Eingang den selben Run haben.

Nun habe ich noch Gewichtungen:
Code:

minf(x)
f(x) = w1 J1(x) +w2 J2(x)


Wenn ich jetzt w1 mit Faktor 2 und w2 mit Faktor 0,3 Gewichte, bekommt J1 mehr Bedeutung. Und nun will ich das Minimum haben.

Ich hoffe, die Erklärung hilft mehr für die Umsetzung in matlab.

Grüße







Harald hat Folgendes geschrieben:
Dann setze doch lb und ub entsprechend statt auf die sinnfreien Nullvektoren.


habe ich gemacht.

optimization tool.PNG
 Beschreibung:

Download
 Dateiname:  optimization tool.PNG
 Dateigröße:  47.08 KB
 Heruntergeladen:  448 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

und was haben X, die J1, J2, ... und Y nun miteinander zu tun?

Wenn du w1 und w2 anpassen willst, dann müssen diese Eingang der Funktion sein, und lb und ub müssen zwei Elemente haben (für w1 und w2).
Bei Gewichten gibt es oft auch noch Bedingungen, dass z.B. deren Summe 1 oder kleiner 1 sein muss. Das wäre dann eine lineare Nebenbedingung.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 15:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
und was haben X, die J1, J2, ... und Y nun miteinander zu tun?


Input --> MKS Simulation --> Output.

X = Input ( 32 Runs mit 10 Parametern)
Y = Output ( 32 Runs mit 5 Ergebnissen)

Y wird aufgeteilt in J1,J2,J3,J4 und J5.

z.B. Du nimmst aus der Matrix X Run 5. Mit hilfe des MKS´s bekommst du ein Ergebnis Y (Matrix) für Run 5.

Oh man, das ist mein Denkfehler :O
Genau, diese Nebendeingung will ich mit implementieren, dass die Gewichtung immer die Summe 1 ist.

Ich vesuche mich mal bei der Umsetzung und melde mich sicher Wink

Danke für den Input!

Grüße
Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2018, 15:59     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Y wird aufgeteilt in J1,J2,J3,J4 und J5.

Das war eine wichtige Information.

Für die Gewichte ist dann in der Regel auch lb = 0 und ub = 1. Keine Ahnung, wie du da auf deine Bedingungen gekommen bist.

J1, J2 etc. sind dann ja Vektoren, also ist auch die Gewichtung ein Vektor. Was soll daran nun minimiert werden? Die Summe der Quadrate? Das wäre dann eher lsqnonlin als fmincon . Da die Zielfunktion linear in den Gewichten ist, sogar lsqlin .

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 23.01.2018, 16:11     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe mein Skript angepasst. (global ist noch beürcksichtigt, bekomme sonst einen Fehler, das J1 nicht bekannt ist)

Code:
global J1; global J2; global J3; global J4; global J5;
J1 = y_norm(:,1);
J2 = y_norm(:,2);
J3 = y_norm(:,3);
J4 = y_norm(:,4);
J5 = y_norm(:,5);


Code:
Aeq = [];
A = [];
beq = [];
b =[];
lb = [0 0];
ub = [1 1];
x0 =[0 1];


es fehlt noch, dass w1 und w2 zusammen immer 1 geben muss.

Code:
[x,fval] = fmincon(@singleObjCostFunRH,x0,A,b,Aeq,beq,lb,ub);


Code:
function f = singleObjCostFunRH(minRH,RHV)
    global J1; global J2;    
    f = minRH*J1*(X')+RHV*J2*(X');
   
   end


jetzt erhalte ich den Fehler

Code:
Inner matrix dimensions must agree.


Fehler ist mir bewusst.

Zitat:
J1, J2 etc. sind dann ja Vektoren, also ist auch die Gewichtung ein Vektor


richtig, das ist mir bewusst. Ich will aber als fmin nur einen Zahlenwert haben und den Run, der diesen ergibt.

Ich weiß aber nicht, wie ich berücksichtigen kann, dass für jedes J immer der gleiche Run aus X genommen wird.

Meine Vorstellung:

er geht durch jede Zeile und schaut sich die Ergebnisse in Spalte 1 (J1) und Spalte 2 (J2) an. wenn w1 =w2 ergibt kommt für das Minimum eine zahl heraus und es wird mir gleichzeitg angezeigt, welche Run aus der Matrix X dies ergibt. Wenn die w1 und w2 jetzt geändert werden, soll ebenfalls das Minimum von J1+J2 gefunden werden.

Bitte um Hilfe bei der Umsetzung.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

sorry, aber ich werde aus deiner Vorstellung nicht schlau.

Zitat:
Ich will aber als fmin nur einen Zahlenwert haben und den Run, der diesen ergibt.

Okay. Also willst du die Zeilennummer variieren? Was soll nun mit w1 und w2 passieren? Sollen diese fest sein oder sollen sie auch variiert werden?

Vor allem, wo sind denn w1 und w2 in der Funktion? Und was haben minRH und RHV mit dem ganzen zu tun?

In jedem Fall sollte die Zielfunktion als Eingabeargument einen Vektor zu variierender Variablen haben.

Zitat:
es fehlt noch, dass w1 und w2 zusammen immer 1 geben muss.

Das ist eine lineare Gleichung, kommt also in Aeq und beq.

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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 25.01.2018, 13:29     Titel:
  Antworten mit Zitat      
Hallo harald,

im Anhang eine Excel- Liste, die mein Vorhaben schildert.

Grüße

Ziel.xls
 Beschreibung:

Download
 Dateiname:  Ziel.xls
 Dateigröße:  38 KB
 Heruntergeladen:  544 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.01.2018, 13:40     Titel:
  Antworten mit Zitat      
Hallo,

das ist jetzt nicht dein Ernst... das hat doch mit einem Optimierungsproblem überhaupt nichts zu tun?! Da reicht die min -Funktion.

Code:
J = xlsread('Ziel.xls', 'I4:M34');
w1 = 0.9;
w2 = 0.1;
f1 = w1 * J(:,1) + w2 * J(:,2);

[fmin, pos] = min(f1)


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

Forum-Century

Forum-Century


Beiträge: 184
Anmeldedatum: 21.09.17
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 25.01.2018, 13:47     Titel:
  Antworten mit Zitat      
Hallo,

warum kompliziert, wenn es auch einfach geht. ....
hm ... danke.


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe leider das Problem jetzt erst verstanden.
Auf meine Nachfrage meintest du ja, dass die Gewichte variiert werden sollen. Das ist aber nicht der Fall, denn du gibst die Gewichte ja vor.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2, 3  Weiter

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.