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

fmincon - Fehlerhafte Funktion für constraints

 

jh4711
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 10.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2018, 22:15     Titel: fmincon - Fehlerhafte Funktion für constraints
  Antworten mit Zitat      
Hallo zusammen. Ich möchte mit fmincon eine nichtlineare Optimierung durchführen. Dabei kommt folgende Fehlermeldung:

Code:

Error using sqpLineSearchMex
Requested 676287x676287 (3407.6GB) array exceeds maximum array size
preference. Creation of arrays greater than this limit may take a long time
and cause MATLAB to become unresponsive. See array size limit or preference
panel for more information.

Error in sqpInterface

Error in fmincon (line 810)
    [X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] =
    sqpInterface(funfcn,X,full(A),full(B),full(Aeq),full(Beq), ...

 


Woran sehe ich, wo der Fehler liegt? Arbeite mit 1164 Parametern.
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: 20.01.2018, 22:21     Titel:
  Antworten mit Zitat      
Meine Optimimierungsfunktion:

Code:

function dist=distOpt(alpha, N, x0, mu_sam, sigma_sam)

sumMu=0;
sumSigma=0;
for i=1:N
sumMu=sumMu+((x0(i)-mu_sam(i))/sigma_sam(i))^2;
sumSigma=sumSigma+((x0(N+i)-sigma_sam(i))/sigma_sam(i))^2;
end

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

 


Meine Constraints

Code:

function [c,ceq] = confuneq(x0,rho,Weights)
N=(length(x0)-2)/2;
    ceq=diag(x0(N+1:end-2)).*rho.*diag(x0(N+1:end-2)).*Weights' - x0(end-1).*(x0(1:N)'-x0(end));
    c=[];
 



Variablen:
alpha=0.75
N=581
mu_sam = 1x581 (Durchschnitt historische Renditen für 581 Wertpapiere)
sigma_sam= 1x581 ( " Varianzen)
rho = 581x581, Korrelation
Weights = 1x581, Gewcihtungen
x0= 1164 (581= summe parameter mu_i, 581 = summe parameter sigma_i, q, r_z)
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: 20.01.2018, 23:21     Titel:
  Antworten mit Zitat      
Hallo,

und wie rufst du die Funktionen auf?

Hast du mal die Zielfunktion und die Nebenbedingungsfunktion für x0 aufgerufen? Tritt der Fehler da schon auf? Kommt was vernünftiges raus? Zur Not mal Schritt für Schritt mit dem Debugger durchgehen.

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: 21.01.2018, 10:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ich rufe folgendes auf:
Code:

 optFunc=@(x0) distOpt(alpha,(y),x0, Mu_sam, Sig_sam);
 
 options = optimoptions(@fmincon,'Algorithm','sqp','MaxFunctionEvaluations', 12000,'FunValCheck','on');
 
 nonlcon=@(c,ceq) confuneq(x0, rho, Weights);
 
 [x0, fval, exitFlag]= fmincon(optFunc,x0,[],[],[],[],[],[],nonlcon,options);
 


Und der Fehler taucht erst bei der fmincon-Funktion zum Schluss auf. Ich habe mal Grenzen hinzugefügt (Zielwert x0 +/- 1), aber das führt zum gleichen Fehler. Zumal die gesuchten Werte nicht stark von x0 abweichen dürften.
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: 21.01.2018, 11:05     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Und der Fehler taucht erst bei der fmincon-Funktion zum Schluss auf.

Das ist klar, denn erst da werden die Funktionen überhaupt ausgeführt.

Mein Vorschlag war, mal die Zielfunktion und die Nebenbedingungsfunktion für x0 aufzurufen und zu sehen, ob das die erwarteten Ergebnisse liefert.
Code:
optFunc(x0)
nonlcon(x0)


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: 21.01.2018, 11:31     Titel:
  Antworten mit Zitat      
Oh, ja das macht Sinn. Folgendes Ergebnis:

Habe optDist erweitert durch x0 zu
Code:
so dass ich auch die zu optimierenden Parameter erhalte.

Code:

[dist,b]=optDist(x0)
dist= 0.5051
b =x0 %wurde in der Funktion auch nicht verändert
 


und

Code:

[c,c1]=nonlcon(x0);
c = [] % wie in Funktion
c1 = 581x581 Matrix
 


Liegt es also an nonlcon, oder?
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: 21.01.2018, 11:45     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Liegt es also an nonlcon, oder?

Würde ich sagen, denn du willst ja wahrscheinlich 581 Ungleichungen haben und nicht 581*581 Ungleichungen. Vielleicht sind da irgendwo Zeilen- und Spaltenvektoren durcheinander geraten.

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: 21.01.2018, 12:22     Titel:
  Antworten mit Zitat      
Harald ... Ich glaube ernsthaft, dass ich durch dich meine Abschlussarbeit bestehe. Es hat funktioniert. Ich habe ".*" statt "*" verwendet... Die Basics mal wieder. Die Optimierung hat zwar 20 Minuten gebraucht, aber sie hat glaube ich ein brauchbare Ergebnis erzeugt. Das gilt es jetzt zu zeigen.

Könntest du mir bei der Performance noch helfen? Ich müsste die Optimierung für ca. 900 Zeitintervalle durchführen. Ein Zeitintervall hat wie gesagt 20 Min gedauert. Ich könnte mir vorstellen, dass man aus den Schleifen (in optDist) etwas in Matrizenrechnung umwandeln kann und so Rechenzeit einspart.
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: 21.01.2018, 21:07     Titel:
  Antworten mit Zitat      
Hallo,

mir ist noch ein Fehler aufgefallen: du meinst wahrscheinlich
Code:
nonlcon=@(x0) confuneq(x0, rho, Weights);


Was die for-Schleife angeht, sollte sich das etwa so umschreiben lassen:
Code:
sumMu= sum( ((x0(1:N)-mu_sam(1:N))./sigma_sam(1:N)).^2 );
sumSigma= sum( ((x0(N+1:2*N)-sigma_sam(1:N))./sigma_sam(1:N)).^2 );

Wenn Vektoren die Länge N haben, kannst du das 1:N auch weglassen.
Klammern musst du noch überprüfen.

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: 21.01.2018, 22:35     Titel:
  Antworten mit Zitat      
1.
Zitat:
mir ist noch ein Fehler aufgefallen: du meinst wahrscheinlich
Code: ausblenden
nonlcon=@(x0) confuneq(x0, rho, Weights);


habe das von hier übernommen:
https://de.mathworks.com/help/optim.....equality-constraints.html

Bin mir nicht sicher. Meinst du
Code:
nonlcon=@(x0) confuneq(x0, rho, Weights);
passt trotzdem?


2. Danke !!!

3. Ein Problem gelöst, kommt das Nächste: Daten werden per SQL als "struct" eingelesen und danach per
Code:

Preise=[Data.isin Data.datum Data.preis];
 

eingelesen. Wenn ich dann "Preise" auswähle, sind diese schön nach 1. Datum und 2. Isin sortiert:
Code:

>> Preise(1:5,1:3)

ans =

  5×3 cell array

    {'AT0000652011'}    {'29.12.2000'}    {[11.0900]}
    {'AT0000720008'}    {'29.12.2000'}    {[ 5.0200]}
    {'AT0000743059'}    {'29.12.2000'}    {[ 8.2000]}
    {'AT0000746409'}    {'29.12.2000'}    {[10.8000]}
    {'AT0000767553'}    {'29.12.2000'}    {[ 3.1700]}

 


Wenn ich diese nun pivotisiere mit
Code:
Pivot_P=Pivot(Preise);
sind diese leider nicht mehr nach Datum sortiert:

Code:
>> Pivot_P(1:5,1:5)

ans =

  5×5 cell array

    {[       NaN]}    {'AT0000652011'}    {'AT0000720008'}    {'AT0000743059'}    {'AT0000746409'}
    {'27.02.2004'}    {[     26.1200]}    {[     10.7200]}    {[     12.9000]}    {[          12]}
    {'28.02.2001'}    {[     12.9400]}    {[      5.2000]}    {[      8.7600]}    {[     12.5100]}
    {'28.02.2002'}    {[     14.5600]}    {[      7.7700]}    {[      9.6800]}    {[      8.8200]}
    {'28.02.2003'}    {[     14.4300]}    {[           9]}    {[      9.9700]}    {[      8.2300]}


Wie bekomme ich die Matrix nach Spalte 1 sortiert? Das habe ich versucht:
Code:
>> a=sortrows(Pivot_P)
Error using matlab.internal.math.cellstrpad
Cell elements must be character arrays.

Error in sortrows>sortBackToFrontCell (line 131)
            tmp = matlab.internal.math.cellstrpad(A(I,ack));

Error in sortrows (line 68)
        I = sortBackToFrontCell(A, col);

Edit: Bei Folgendem erhalte ich zwar keine Fehlermeldung, trotzdem werden die Daten nicht sortiert und die Überschrift, bzw. die erste Zeile ist weg.
Code:
>> a=sortrows(Pivot_P(2:end,:));
>> a(1:5,1:5)

ans =

  5×5 cell array

    {'27.02.2004'}    {[26.1200]}    {[10.7200]}    {[12.9000]}    {[     12]}
    {'28.02.2001'}    {[12.9400]}    {[ 5.2000]}    {[ 8.7600]}    {[12.5100]}
    {'28.02.2002'}    {[14.5600]}    {[ 7.7700]}    {[ 9.6800]}    {[ 8.8200]}
    {'28.02.2003'}    {[14.4300]}    {[      9]}    {[ 9.9700]}    {[ 8.2300]}
    {'28.02.2005'}    {[38.2900]}    {[13.8100]}    {[26.0100]}    {[17.9500]}

Ich nehme an, dass es daran liegt, dass Spalte 1 nicht als Datum formatiert ist. Kann ich das irgendwie mit "dateformat" oder "str2double" überschreiben? Ist mir bisher nicht gelungen.
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: 21.01.2018, 23:09     Titel:
  Antworten mit Zitat      
Hallo,

1.
in dem Link finde ich nichts von @(c, ceq) ...

3. datetime sollte helfen.
Statt Pivot (ist doch keine Standard-Funktion??) würde ich einen Table und dann die unstack-Funktion verwenden.

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: 22.01.2018, 08:13     Titel:
  Antworten mit Zitat      
Hallo,

1. direkt in der zweiten Zeile steht
Code:
[c,ceq] = nonlinconstr(x)
. brauche ich nicht von dieser Funktion die Nebenbedingung und nicht x0? Oder bringe ich da etwas durcheinander?
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: 22.01.2018, 10:32     Titel:
  Antworten mit Zitat      
Hallo,

das ist die Funktionsdeklaration, ja. Dabei sind c und ceq die Rückgabeargumente.
Bei der Definition eines Function Handles sind in @( ) aber die Eingabeargumente.

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: 22.01.2018, 10:34     Titel:
  Antworten mit Zitat      
Hallo,

alles klar. Ist verstanden!

Danke
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: 22.01.2018, 19:13     Titel:
  Antworten mit Zitat      
Hallo nochmal,

habe es mit unstack versucht und es klappt gut. Nur leider kann ich nun meine Matrixoperation nicht mehr machen. Habe alle möglichen Kombinationen an eckigen Klammern versucht, da es sonst an denen lag.

Code:

>> Return=(Pivot_P(3:end,2:end)./Pivot_P(2:end-1,2:end))-1;
Undefined operator './' for input arguments of type 'table'.
 
>> Return=(Pivot_P[3:end,2:end]./Pivot_P[2:end-1,2:end])-1;
 Return=(Pivot_P[3:end,2:end]./Pivot_P[2:end-1,2:end])-1;
                ↑
Error: Unbalanced or unexpected parenthesis or bracket.
 
>> Return=[Pivot_P(3:end,2:end)./Pivot_P(2:end-1,2:end)]-1;
Undefined operator './' for input arguments of type 'table'.
 


Mein table sieht so aus ("---" habe ich zur besseren Lesbarkeit eingefügt) :

>> Pivot_P(1:5,1:5)

ans =

5×5 table

datum AT0000652011 AT0000720008 AT0000743059 AT0000746409
___________ ____________ ____________ ____________ ____________

29-Dec-2000 --- 11.09 --- 5.02 --- 8.2 --- 10.8
31-Jan-2001 12.42 5.31 8.07 11.2
28-Feb-2001 12.94 5.2 8.76 12.51
30-Mar-2001 13.34 4.85 8.84 12.44
30-Apr-2001 14.19 5.51 9.45 12.48
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 - 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.