Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Systemarchitekt Projektmanagement (m/w) DOORS / Matlab /CAN
Erstellung der Systemarchitektur und Auslegung sicherheitsrelevanter Systeme
Bertrandt Services GmbH - Espelkamp

Funktionsentwickler (w/m) Automobile
Entwicklung von modellbasierten Softwarelösungen in Simulink inklusive Autocode-Generierung
Bertrandt Ing.-Büro GmbH Rüsselsheim - Frankfurt am Main

Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Senior Softwareentwickler/in 48 Volt Mild-Hybrid
Funktions- und Softwareentwicklung für einen Elektroantrieb für 48 Volt Mild-Hybrid Anwendungen
Robert Bosch GmbH - Schwieberdingen

System-Entwickler (m/w)
Analyse und Spezifikation von Systemanforderungen & Abstimmung von Anforderungen
MicroNova AG - Braunschweig

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

fmincon - "Aeq must have 'x' columns"

 

jh4711
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2017, 19:09     Titel: fmincon - "Aeq must have 'x' columns"
  Antworten mit Zitat      
Hallo zusammen,

meine Optimierung schmeißt leider einen Fehler aus:

Code:
Error using fmincon (line 282)
Aeq must have 12 column(s).

Error in Untitled (line 71)
 [x0, fval, exitFlag]=
 fmincon(optFunc,x0,[],[],Aeq,beq);


Ich weiß nicht, wie MATLAB auf 12 kommt und weiß deshalb nicht, wo ich ansetzen soll.
Es soll die Funktion "dist" optimiert werden, mit dem Parameter x0. x0 besteht aus zwei Spalten: Die Erste beschreibt die Rendite zu jedem Wertpapier (n=6) , die zweite Spalte die Volatilität.

Code:

%% Optimierung
   
% Zielfkt = distOpt  

    %  fun = dist=distOpt(a,N,x0,mu_sam,std_sam)
        % a = aAnteile (6x1)
        % N = y ; Spalten der Renditematrix (6)
       
        % aMu = Initial Vektor mit 0en (6x1)
        % aMu_sam = historische Rendite (6x1)
       
        % aSig = Initial Vektor mit 0en (6x1)
        % aSig_sam = historische Vola (6x1)
       
        % x0=[aMu, aStd] (6x2)
     
% Funktion extra abgelegt, und ja: das geht sicher eleganter
   
function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=0;
sumStd=0;
for i=1:N
sumMu=sumMu+((x0(i,1)-mu_sam{i})/std_sam{i})^2;
sumStd=sumStd+((x0(i,2)-std_sam{i})/std_sam{i})^2;
end

dist=sqrt(a*(1/N)*sumMu + (1-a)*(1/N)*sumStd);

% Funktion ende


      Aeq=x0(1)-arz;      %  arz= 6x1-Matrix
      beq = aKov*aAnteile;   % aKov: 6x6, aAnteile (6x1)
   

 optFunc=@(x0) distOpt(aAnteile,y,x0,aMu_sam,aSig_sam);
 
 [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],Aeq,beq);
 


Ich hoffe, diese Infos reichen aus. Danke im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 31.12.2017, 19:32     Titel:
  Antworten mit Zitat      
Hallo,

ich würde immer einen Vektor anzupassender Variablen verwenden, in deinem Fall also ein x0 der Länge 12.
So oder so, du hast 6*2 = 12 anzupassende Variablen. Daher muss Aeq auch 12 Spalten haben, die zu den anzupassenden Variablen gehören.

Wenn bestimmte Variablen nicht in den Gleichungen vorkommen sollen, dann kannst du für diese Spalten mit Nullen einfügen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2017, 23:55     Titel:
  Antworten mit Zitat      
In der Hoffnung, dich richtig verstanden zu haben:

Ich habe folgendes verändert:
Code:

x0=[aMu aSig]; % von 6x2 zu 12x1

      Aeq=(x0(1:(y-1))'-arz); % y=7, Die ersten 6 Zeilen bleiben mu - arz
      Aeq(y:(2*y-2))=1;    % die nächsten 6 Zeilen mit 1en auffüllen (Habe es auch mit 0en versucht), ergibt 12x1
     
      beq = aKov*aAnteile';
      beq(y:(2*y-2))=1;     % die nächsten 6 Zeilen mit 1en füllen, ergibt 12x1


% Anpassung an Funktion
function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=0;
sumStd=0;
for i=1:N %N=7
sumMu=sumMu+((x0(i)-mu_sam{i})/std_sam{i})^2; % Veränderung x0(i)
sumStd=sumStd+((x0(N+i)-std_sam{i})/std_sam{i})^2;    % Veränderung x0(N+ii)
end

dist=sqrt(a*(1/N)*sumMu + (1-a)*(1/N)*sumStd);
     


Jetzt habe ich Aeq und beq als 12x1, wie in der Ausgangssituation laut Matlab-Instruktion. Als Fehlercode kommt der Gleiche wie davor. (An den Spalten hat sich ja auch nichts verändert).

Wenn ich nun Aeq und beq transponieren und zwei 1x12 Vektoren erhalte kommt die Meldung
Code:

Error using fmincon (line 285)
Row dimension of Aeq is inconsistent
with length of beq.
 


Und jetzt?

Guten Rutsch!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

gutes neues Jahr!

Es muss mit Nullen aufgefüllt werden. Einsen verfälschen die Gleichungen.

Wenn du m lineare Gleichungen hast, muss A eine mx12 -Matrix sein und b ein mx1 - Vektor. Um dir bei der Aufstellung der Matrizen weiter zu helfen, müsste ich wissen, welche Gleichungen du überhaupt umsetzen willst.
Erste Frage wäre: Wie viele Gleichungen hast du eigentlich?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2018, 13:15     Titel:
  Antworten mit Zitat      
Frohes Neues!

Mir sind heute morgen noch zwei Fehler aufgefallen: alpha in meiner Zelfunktion (siehe unten) sind nicht meine Anteile sondern "0 ≤α ≤1 is a parameter determining the relative weight assigned to deviations of the means relative to deviations of the standard deviations."Kannst du damit etwas anfangen? Und in meiner Ausgangsfrage hatte ich fälschlicherweise Aeq und beq umgedreht.


Das ist die Zielfunktion:


Die Zielvariablen sind mu_i und sigma_i, N die N Anzahl meiner Wertpapiere (=6), mu_sam und sigma_sam meine mu´s und sigma´s von Wertpapier i.

Und das die Bedingung Aeq=beq:


q wird zur Vereinfachung =1 gesetzt (soll "constant of proportionality" sein ?!), x_m_i sind die Marktanteile von Wertpapier i zum Zeitpunkt m und r_z der risikofreie Zins.In meinem Auszug habe ich 6 Spalten = Wertpapiere, also m=6?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

wo kommt denn q vor?

Was soll denn eigentlich variiert werden? Die sigmas und mus, oder die x_i?

Falls es die sigmas und mus sind: die Gleichungen sind dann überhaupt nicht linear, da die sigmas quadratisch eingehen. Sieht man, wenn man das mal gedanklich ausmultipliziert.

Die Anzahl der Gleichungen hängt von der Anzahl der Zeitpunkte ab. Für jeden Zeitpunkt hast du 6 Gleichungen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2018, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

das ist nicht die klassische Portfolio-Optimierung, bei der man die Anteile x_i optimieren möchte. Das habe ich zum Üben der "fmincon"-Funktion, dank deiner Hilfe bei einem anderen Beitrag hier, benutzt. Jetzt geht es um einen besseren Schätzer als die historischen mu_sample und sigma_sample.

Das es eine nichtlineare Opt. ist, wusste ich. Muss ich dann etwas umstellen?

q wird bei beq als Faktor verwendet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 15:11     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das es eine nichtlineare Opt. ist, wusste ich.

Die Frage ist, ob nur die Zielfunktion nichtlinear ist oder auch die Nebenbedingungen. Ich gehe jetzt davon aus, dass auch die Nebenbedingungen nichtlinear sind.

Zitat:
Muss ich dann etwas umstellen?

Ja ;)
Du kannst hierfür nicht Aeq, beq verwenden, sondern musst das stattdessen als Function Handle übergeben (Argument nonlcon in der Doku).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2018, 16:24     Titel:
  Antworten mit Zitat      
Ok Harald,

langsam wird es bei mir unübersichtlich Very Happy

1.) Ich habe anhand von https://de.mathworks.com/help/optim.....equality-constraints.html nun eine zweite Funktion confuneq erstellt:

Code:
function [Aeq, beq] = confuneq(x0,y,arz,aKov,aAnteile)
    aq=1;
 
  Aeq = (aKov*aAnteile')';
  Aeq(y:(2*y-2))=0;
  Aeq=Aeq';
  beq=aq*(x0(1:(y-1))'-arz);
  beq(y:(2*y-2))=0;


Weiterhin habe ich, wie in der Matlab-Hilfe, folgendes gemacht:
Code:
optFunc=@(x0) distOpt(aAnteile',(y-1),x0,aMu_sam,aSig_sam);
 options = optimoptions(@fmincon,'Algorithm','sqp');
 [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],@confuneq,options);
 


Jetzt kommt die Fehlermeldung
Code:
>> [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],@confuneq,options);
Cell contents reference from a non-cell array object.

Error in distOpt (line 5)
sumMu=sumMu+((x0{i}-mu_sam{i})/std_sam{i})^2;

Error in
@(x0)distOpt(aAnteile',(y-1),x0,aMu_sam,aSig_sam)

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

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


Zur Erinnerung: Meine Funktoin sieht so aus:
Code:
function dist=distOpt(a,N,x0,mu_sam,std_sam)
sumMu=repelem(0,6);
sumStd=repelem(0,6);
for i=1:N
sumMu=sumMu+((x0{i}-mu_sam{i})/std_sam{i})^2;
sumStd=sumStd+((x0{N+i}-std_sam{i})/std_sam{i})^2;
end

dist=sqrt(a*(1/N)*sumMu + (1-a)*(1/N)*sumStd);


Ich glaube, es liegt an meinem Verständnisproblem:

2.) Ich bin mir noch nicht ganz sicher, warum mein Aeq 12 Spalten haben muss , da meine Aeq und beq doch (6x6 * 6x1=) 6x1 sind, wenn N=6

Könntest Du bitte nochmal darüberschauen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 16:55     Titel:
  Antworten mit Zitat      
Hallo,

bei Fehlermeldungen immer darauf achten, wo sie herkommen. Ich weiß nicht, warum du auf einmal mit { } statt mit ( ) indizierst, aber das hat ja nichts mit den Nebenbedingungen zu tun.

Wirf mal noch mal einen Blick auf die Doku-Seite:
Zitat:
[c,ceq] = nonlinconstr(x)
The function c(x) represents the constraint c(x) <= 0. The function ceq(x) represents the constraint ceq(x) = 0.


Die nichtlinearen Gleichungen haben also eine ganz andere Form als die linearen. Wenn du keine Ungleichungen hast, setze c = [].

Für ceq würde ich mir eher was vorstellen wie:
Code:
ceq = diag(sigma) * rho * diag(sigma) * x - q * (mu - r)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2018, 17:51     Titel:
  Antworten mit Zitat      
So, habe den Code nochmal gecheckt. Ich glaube, ich bin etwas weiter (dank dir):

Code:
Mu=repelem(0.0001,y-1); % als Startwert 0,01%
 Sig=repelem(0.0002,y-1);     % als Startwert 0,02%
 x0=[aMu aSig];
   

 optFunc=@(x0) distOpt(alpha,(y-1),x0,Mu_sam,Sig_sam); % alpha=0.5
 options = optimoptions(@fmincon,'Algorithm','sqp');
 nonlcon=@(c,ceq) confuneq(x0, r_z, rho, Anteile);
 [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],nonlcon,options);
 


Mit den Ziel-Funktion

Code:

function dist=distOpt(alpha, N, x0, mu_sam, sigma_sam)
sumMu=0;
sumStd=0;
for i=1:N % N= Anzahl Wertpapiere = 6
sumMu = sumMu + ((x0(i) - mu_sam(i)) / sigma_sam(i)) ^2;
sumStd = sumStd + ((x0(N+i) - sigma_sam(i)) / sigma_sam(i)) ^2;
end

dist=sqrt(alpha * (1/N) * sumMu + (1-alpha) * (1/N) * sumStd);
 


Und der Nebenbedingung

Code:

function [c,ceq] = confuneq(x0, r_z, rho, Anteile)
    aq=1;
    c=[];
    ceq=diag(x0(7:end)) * rho* diag(x0(7:end))* Anteile' - aq*(x0(1:6) - r_z);
   
 


Nun kommt die Meldung

Code:
[x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],nonlcon,options);

Solver stopped prematurely.

fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunctionEvaluations = 1200 (the default value).
 


Das bedeutet einfach, dass keine Lösung gefunden wurde, oder? Weißt du woran das liegen könnte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 18:53     Titel:
  Antworten mit Zitat      
Hallo,

der Löser ist nicht innerhalb der vorgegebenen Anzahl Funktionsauswertungen konvergiert. Du kannst wie in der Meldung beschrieben die Anzahl der Funktionsauswertungen erhöhen.

Grundsätzlich ist es hilfreich, wenn Codebeispiele reproduzierbar sind. Dann kann ich ggf. auch damit herumexperimentieren. Hier fehlen z.B. y und aMu sowie aSig.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2018, 19:22     Titel:
  Antworten mit Zitat      
Kommt sofort:
Code:
y=7;
Anteile=[0.1221 0.0332 0.0966 0.2484 0.1098 0.39];
Mu_sam=[0.0030    0.0007    0.0009    0.0011    0.0003   -0.0006]';
rho=[1.0000   0.2351   0.3028   -0.3445   -0.0531   0.1412,
0.2351   1.0000   0.3574   -0.4908   -0.1502   -0.0874,
0.3028   0.3574   1.0000   0.1959   0.2437   0.2460,
-0.3445   -0,4908   0.1959   1.0000   0.3766   0.2082,
-0.0531   -0.1502   0.2437   0.3766   1.0000   0.6096,
0.1412   -0.0874   0.2460   0.2082   0.6096   1.0000];
Sigma_sam=[0.0072   0.0127   0.0151   0.0047   0.0079   0.0103]';
r_z=(1+0.00367)^(1/365)-1; % Jahreszins der 10J-Bundesanleihe am 17.10.17, auf Tageszins gerechnet, da Daten auf Tagesbasis
r_z=repelem(r_z,y-1)';
alpha=0.5;
 



Okay, wenn ich mal aus 1200 12000 mache, kommt Folgendes:
Code:

>> options = optimoptions(@fmincon,'Algorithm','sqp','MaxFunctionEvaluations', 12000);
 nonlcon=@(c,ceq) confuneq(x0, r_z, rho, Anteile);
 [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],nonlcon,options);

Converged to an infeasible point.

fmincon stopped because the size of the current step is less than
the default value of the step size tolerance but constraints are not
satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
 


Vielleicht muss ich es mal mit anderen Daten ausprobieren, oder mit dem alpha, bzw. aq/q herumspielen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 18.215
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.01.2018, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

aMu und aSig fehlen noch.
Du kannst auch mal einen anderen Algorithmus versuchen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.01.2018, 11:33     Titel:
  Antworten mit Zitat      
Meine Zielvariable(n) habe ich einfach mal so angegeben. Hatte auch schon +/-1 % und -0.01%

Code:
Mu=repelem(-0.0001,y-1); % y=7
 Sigma=repelem(-0.0002,y-1);    
 x0=[Mu Sigma];


Weiterhin habe ich es mit mehreren Algorithmen versucht und auch options mit 'FunValCheck','on' erweitert.

Leider alles ohne Erfolg.
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.