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

Frage zu fmincon

 

psigh
Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2011, 21:10     Titel: Frage zu fmincon
  Antworten mit Zitat      
Hallo Leute,

ich habe diese mfile programmiert. Es ist die ganz normale mean-variance-Portfolio selection nach Markowitz.


Code:

function testen



x0 = [0; 0; 0];
lb = [0.1;0.1;0.1];
ub=[1;1;1];
A=-[0.04 0.06 -0.01];
b=-0.05;
Aeq = [1  1  1];
beq = 1;
   





p=@(x)((x(1)^2*0.1+x(2)^2*0.15+x(3)^2*0.05+2*x(1)*x(2)*0.06+x(1)*x(3)*-0.02+x(2)*x(3)*-0.15)^(1/2));

[x,fval,exitflag]=fmincon(p,x0,A,b,Aeq,beq,lb,ub);




 






Ich hab auch nur eine kurze Frage zu den Nebenbedingungen. Ich möchte gerne eine dreidimensionale Matrix M in die Funktion übergeben und eine weitere Nebenbedingung hinzufügen.
Die Berechnung und Nebenbedingung soll so aussehen (oder schöner (-Smile:


Code:

a=0

for i=1:3
for j=1:3
for k=1:3

a=a+M(i,j,k)*x(i)*x(j)*x(k)

end
end
end
a<= 0.03 <- Bedingung


 




Ich gehe natürlich davon aus, dass ich dann fmincon nicht mehr benutzen kann und ich glaube quadprog auch auch nicht.

Vielleicht kann mir da jemand von Euch weiter helfen.


Vielen Dank,

Dominik
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: 22.02.2011, 22:14     Titel:
  Antworten mit Zitat      
Hallo,

das wäre eine nichtlineare Nebenbedingung, die als weiteres Argument (Function Handle, ähnlich wie die Zielfunktion) an fmincon übergeben werden muss.
Bist du zudem sicher, dass sich deine Zielfunktion nicht schöner hinschreiben lässt? Sieht nach x'*M*x für eine Matrix M aus.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2011, 22:17     Titel:
  Antworten mit Zitat      
Vielen Dank!

Wenn ich mir im selben mfile die Nebenbedingung zusammenbaue, wie für ich das denn dann als Nebenbedingung ein?
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: 22.02.2011, 22:50     Titel:
  Antworten mit Zitat      
Hallo,

als weiteres Argument, siehe auch
Code:

(unter Input Arguments, nonlcon)

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2011, 23:44     Titel:
  Antworten mit Zitat      
Entschuldige, wenn ich nochmal nachfragen muss. Ich habs mir jetzt durchgelesen und schonmal die Funktion für die Nebenbedingung gemacht. Funktion f.

Code:

function [x]=mark_opt(datenvektor,j,k,koschiefe)



x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);
%----------------------------------------------------------

f=@(x)0;
for i=1:j
for p=1:j    
for q=1:j    
    f=@(x) (f(x)+(x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end






[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub) ;

[quote]

Habe ich das richtig verstanden, dass ich eigentlich für die Nebenbedingung, Funktion f; ein neues mfile machen muss?[/quote]
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: 23.02.2011, 10:17     Titel:
  Antworten mit Zitat      
Hallo,

ich verstehe deine Frage nicht.
Was bei deinem Code aber sehr gefährlich ist:
i ist zugleich ein Handle auf die Zielfunktion und eine Laufvariable. Dein Aufruf von fmincon wird also scheitern.
Ich würde f, g, h und das Function Handle i jeweils in Unterfunktionen (subfunctions) definieren, um Konstruktionen wie f = @(x) 0 zu umgehen. Anonyme Function Handles sind ja eben in erster Linie für Funktionen gedacht, die in einer Zeile beschreibbar sind.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 10:30     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe.


Bis hierhin funktioniert der Code. Ich kann aber auch gerne die zusammengesetzte Funktion i umbenennen, das ist wahrscheinlich besser.


Code:

function [x]=mark_opt(datenvektor,j,k)



x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);

[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub) ;
 









Ich muss wirklich nurnoch diese Nebenbedingung rein bekommen.UNd da hatte ich anfangs gedacht, dass es doch wphl am einfachsten wäre, wenn ich diese auch in dem Minimierungsfile zusammensetzten würde. Dann hätte ich alles schön kompakt.


Code:

f=@(x)0;
for i=1:j
for p=1:j    
for q=1:j    
    f=@(x) (f(x)+(x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end
 





Ich habe jetzt im Netz schon einige BEispiele angesehen. Ich glaube es wäre alles kein Problem, wenn die Nebenbedingung immer gleich aussehen würde. Aber man sieht ja, dass die Anzahl der x von j abhängt. DIe Größe der Funktion ändert sich also. Diese Minimierung ist ja in ein größeres Programm eingebunden. Und ich brauche manchmal eben 2 x und beim anderen mal vielleicht 23 x.

Ich habe auch schon versucht ein eigenes File für diese Nebenbedingung zu schreiben, aber das hat nicht geklappt.

z.B. so:

Code:


function [c ceq]=confun(j,koschiefe)


c=@(x)0;
for i=1:j
for p=1:j    
for q=1:j    
    c=@(x) (c(x)+(x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end
 


Und in dem Minimierungsfile wollte ich dann einfach schreiben:


Code:

[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub,@confun
 


[/code]


So klappt es eben nur leider nicht.
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: 23.02.2011, 10:40     Titel:
  Antworten mit Zitat      
Hallo,

bitte immer dazuschreiben, WAS nicht klappt.

Du solltest in deiner Funktion confun weg von den Function Handles. Zumindest aber muss c am Ende als numerischer Wert zurückgegeben werden. Außerdem fehlt dir die 0.03.
ceq muss auf [] gesetzt werden.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 12:40     Titel:
  Antworten mit Zitat      
Ich muss zugeben, dass ich mich langsam etwas im Kreis drehe. Muss ich denn unbedingt ein neues File für die Nebenbedingung machen? In dem ersten von mir geposteten File habe ich sie ja einfach in das Minimierungsfile geschrieben. Wenn ich ein neues File machen muss, wo muss ich dann die Matrix und j übergeben?

DIe Idee mit den Funktion Handles kommt aus einer Frage, die ich mal hier im Forum gestellt habe. Ich weiß einfach nicht, wie ich sonst die Funktion dynamisch zusammenbauen soll. Es klappt ja auch.
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: 23.02.2011, 13:14     Titel:
  Antworten mit Zitat      
Hallo,

ich verliere hier zugegebenermaßen langsam den Überblick.

Es muss kein separates File sein, ich würde aber Unterfunktionen verwenden.

Irgendwas (was?) klappt ja nun anscheinend doch noch nicht?

Könntest du nochmal den aktuellen Stand anhängen, falls es eine Funktion ist auch mit einem Beispielaufruf? Ich habe heute tagsüber nicht die Zeit, aber ich werde mir das dann heute abend oder morgen nochmal genauer ansehen.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 13:26     Titel:
  Antworten mit Zitat      
Ich mach es jetzt mal ganz ordentlich. Ist wirklich unübersichtlich.

Dies ist der aufruf der minimierungsfunktion im Hauptprogramm.

Code:

mark_opt(datenvektor,j,i,koschiefe);
 


Das geht ins Minimierungsfile:

Code:

function [x]=mark_opt(datenvektor,j,k,koschiefe)



x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);
%----------------------------------------------------------







[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub,@confun,[],j,koschiefe) ;

%Übergabe der Parameter j und koschiefe an confun

 


Wie man in der letzten Zeile sieht, ist jetzt ist meine neue Idee, die Parameter j und koschiefe durchzureichen an confun. ICh muss ja irgendwie diese beiden Sachen mit confun verbinden. SO gehts auf jeden Fall nicht. Ich hab in der Funktion confun jetzt ohne Handles gearbeitet. Wenn das so klappt frage ich miich, warum ich es nicht immer so gemacht habe. Aber das hatte irgendeinen Grund, warum´ich die gebraucht habe (-:

Confun sieht jetzt so aus. c soll größer als 0.3 sein. Ich hatte mich da vertan.

Code:

function [c ceq]=confun(j,koschiefe)


c=0;
for i=1:j
for p=1:j    
for q=1:j    
    c=c+((x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end

c=-c+0.3;
ceq=[];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 13:31     Titel:
  Antworten mit Zitat      
Am schönsten hätte ich sowas gefunden, auch wenn es nicht besonders ansehnlich ist:

Code:


x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);
%----------------------------------------------------------


%Nichtlineare Nebenbedingung

c=@(x)0;
for i=1:j
for p=1:j    
for q=1:j    
    c=@(x) c(x)+((x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end

c=-c+0.3;






[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub,c) ;
 





Ich kenne mich nicht aus mit Unterfunktionen. Ich bin froh, wenn die Sachen überhaupt mal irgendwie läuft (-:
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 14:32     Titel:
  Antworten mit Zitat      
Meintest Du soetwas in der Richtung? Ich glaube, dass das nahe an "richtig" ist. Nur die Zusammensetzung der Nebenbedingungen macht die Problme.

Code:

function [x]=mark_opt(datenvektor,j,k,koschiefe)



x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);
%----------------------------------------------------------


[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub,@mycon) ;

function [c ceq]=mycon(x,j,koschiefe)
%Nichtlineare Nebenbedingung

c=0;
for i=1:j
for p=1:j    
for q=1:j    
    c=c+((x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end

%c=-c+0.3;
ceq=[];





 
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: 23.02.2011, 14:51     Titel:
  Antworten mit Zitat      
Hallo,

ich geh mal davon aus, dass die letzte Variante jetzt die ist, die ich mir dann anschauen sollte.
Zwei Fragen dazu:
- kannst du Testdaten zur Verfügung stellen, damit ich das ganze wirklich mal laufen lassen kann?
- insbesondere falls nicht: gibt es Fehlermeldungen? welche? inwiefern ist das Resultat nicht wie erwartet?

Grüße,
Haraöd
_________________

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2011, 14:51     Titel:
  Antworten mit Zitat      
Ich glaube ich habe es! Er läuft auf jeden Fall durch (Mit warnungen).





Code:

x0 = 0.05*ones(j,1);   %starting vektor [0.2;0.2]
lb = 0.05*ones(j,1);      %lower boundaries [0;0];  0.15*ones(j,1);
ub=  ones(j,1);       %upper boundaries [1;1];  
A=-datenvektor{1,k}{5,1}';
b=-0.05;
Aeq= ones(1,j);  
beq= 1;  




g=@(x)0;
for i=1:j
     g=@(x) (g(x)+x(i)^2*datenvektor{1,k}{3,1}(i,i));
end

%---------------------------------------------------------

h=@(x)0;
for i=1:(j-1)
for p=(i+1):j
    h=@(x) (h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end
end
%----------------------------------------------------------


i=@(x) (g(x)+h(x))^(1/2);
%----------------------------------------------------------
[x,fval,exitflag]=fmincon(i,x0,A,b,Aeq,beq,lb,ub,@mycon) ;


function [c ceq]=mycon(x)
%Nichtlineare Nebenbedingung

c=0;
for i=1:j
for p=1:j    
for q=1:j    
    c=c+((x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end
end
end
ceq=[];
c=-c+0.3;


 



Der Output:

Code:

Warning: Trust-region-reflective algorithm does not solve this type of problem,
using active-set algorithm. You could also try the interior-point or sqp
algorithms: set the Algorithm option to 'interior-point' or 'sqp' and rerun. For
more help, see Choosing the Algorithm in the documentation.
> In fmincon at 472
  In mark_opt at 34
Warning: Colon operands must be real scalars.
> In mark_opt>mycon at 41
  In fmincon at 654
  In mark_opt at 34
Warning: Colon operands must be real scalars.
> In mark_opt>mycon at 41
  In finitedifferences at 142
  In nlconst at 321
  In fmincon at 758
  In mark_opt at 34
 



Ob das jetzt Warnungen sind, die ich ignorieren kann, weiß ich nicht.
Er hat noch Probleme, mit "j". Warum auch immer. Ich hatte mir gedacht, dass er j und koschiefe jetzt schon kennt, weil sie ganz oben übergeben werden. Anscheinend ist es aber nicht so.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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 - 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.