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

Wie soll man eine Quadratsumme geschickt fitten

 

TeChierys
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2016, 20:56     Titel: Wie soll man eine Quadratsumme geschickt fitten
  Antworten mit Zitat      
Hallo zusammen,

ich sitze wieder an das Fitting-Problem für
C(p)=\min_{x \in X} \sum^N_{i=1}( \frac{Markt(i)-Modell(i)}{Markt(i)})^2

Diese C(p) mit unbekannten p \in X will ich mittels Levenberg-Marquardt ein lokales minimieren, und dann durch Simulated Annealing das globale Minimum finden.....

Ich tue mich schwer eine gescheites Suchfunktion zu definieren für C(p). Nach meiner Vorstellung soll es doch mit

Code:

 errfun=0;
    for i =1:msize
        tempo=@(x)((markt(i) -modellspreads( x,mty,i))/markt(i))^2;
    errfun=@(x)errfun+ tempo;
    end


funktionieren. Aber in SA-Packet kommt die Fehleranzeige:

Zitat:
??? Undefined function or method 'plus' for input arguments of type 'function_handle'.

Error in ==> Kalispreadi>@(x)errfun+tempo at 15
errfun=@(x)errfun+ tempo;

Error in ==> samakedata at 21
solverData.currentfval =
problem.objective(reshapeinput(problem.x0,solverData.currentx));

Error in ==> simulannealcommon at 113
solverData = samakedata(solverData,problem,options);

Error in ==> simulanneal at 44
[x,fval,exitflag,output,solverData,problem,options] = ...

Error in ==> simulannealbnd at 122
[x, fval, exitflag, output] = simulanneal(FUN, x0, [], [], [], [], lb, ub, options);

Error in ==> Kalispreadi at 19
x1 = simulannealbnd(errfun,x0);

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


Wie soll ich die Funktion (oder besser gesagt die SUMME) denn sonst definieren'?
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: 03.04.2016, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

du machst dir da m.E. das Leben unnötig schwer.

Schreibe eine Funktion, die x und die weiteren benötigten Informationen als Input die Abweichung berechnet. Dann übergib an den Solver ein Function Handle auf diese Funktion.

Falls du Probleme bei der Übergabe der festen Parameter hast, siehe hier:
http://de.mathworks.com/help/optim/.....ing-extra-parameters.html

Statt simulannealbnd würde ich hier tendentiell eher lsqnonlin versuchen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2016, 22:10     Titel:
  Antworten mit Zitat      
Stimmt! Du hast recht! Wieso packe ich die errfun nicht in ner extrafunktion.
Private Nachricht senden Benutzer-Profile anzeigen
 
TeChierys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2016, 23:02     Titel:
  Antworten mit Zitat      
Update:

Code:

function [ errfun] = parameterKali( x,mty, markt,msize )
errfun=0;
    for i =1:msize
        tempo=((markt(i) -modellspreads1( x,mty,i))/markt(i))^2;
    errfun=errfun+ tempo;
    end
end
 


Ja das klappt jetzt theoretisch, praktisch komme ich aber nicht weiter. Der Abstand ist auf einmal nicht mehr zu minimieren....

mit lsqnonlin:

Code:
function [sp x] =Kalispreadi( Maturities,Marktspreads,H,b)
mty=Maturities;  msize=length(mty);
Sp=Marktspreads/10000; V0=1; R=.4;
%%%%%%%%%%%%%%idee 1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    options = optimset('Algorithm','levenberg-marquardt');
    options = optimset(options,'TolFun',1e-6,'TolX',1e-6);
    x0=0.2*ones(1,msize);
    errfun=@(x)parameterKali( x,H,b,mty,Sp,msize) ;
    x=lsqnonlin(errfun,x0,[],[], options);
    x1 = simulannealbnd(errfun,x0);
   


bekomme ich nach MaxIter=2000 auch keine Lösung
Zitat:
Solver stopped prematurely.

lsqnonlin stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 2000 (the default value).


Das ist für ein schnelles Verfahren wie LM undenkbar...Ich glaube ich muss die Abstand anders definieren....
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: 04.04.2016, 08:41     Titel:
  Antworten mit Zitat      
Hallo,

hätte ich wohl dazuschreiben sollen: bei lsqnonlin sollte man nicht die aufsummierten Quadrate, sondern einen Vektor der Abweichungen übergeben.

Mit der momentanen Zielfunktion sollte man eher fmincon nehmen.

Siehe auch
http://de.mathworks.com/help/optim/.....-a-solver.html#brhkghv-19

... und bei der Meldung bietet es sich an, über optimoptions die Anzahl der Iterationen zu erhöhen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2016, 13:40     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

hätte ich wohl dazuschreiben sollen: bei lsqnonlin sollte man nicht die aufsummierten Quadrate, sondern einen Vektor der Abweichungen übergeben.

Mit der momentanen Zielfunktion sollte man eher fmincon nehmen.

Siehe auch
http://de.mathworks.com/help/optim/.....-a-solver.html#brhkghv-19

... und bei der Meldung bietet es sich an, über optimoptions die Anzahl der Iterationen zu erhöhen.

Grüße,
Harald


Danke Harald, das habe ich verstanden. Nun was ich machen wollte (oder muss) ist eine Kombination aus Levenberg-Marquardt und Simulated Annealling zum Zweck globaler Minimierung. Die Frage ist jetzt über Programmierung hinaus:

wie soll ich die Kombination denn machen? Über Google gibts quasi nichts konkretes. Wikens (2003), Horst(2000) haben halt gesagt, dass es geht, Horst(1997) behauptet mit einem Satz, dass es einfach durch Hinzufügen der SA-Ansatz auf LM-Ansatz geht. Jetzt habe ich das Problem, dass LM auf vektorartige Errorfunktion agiert, und SA nur auf Skalarwert.....Wie soll das gehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
TeChierys
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2016, 13:51     Titel:
  Antworten mit Zitat      
AHHHH, ich hab lsqnonlin nochmal gelesen. Der rechnet ja in sich nochmal die Quadratsumme, natürlich kommt dann kein Ergebnis raus, wenn ich die Summe eingebe. Gut, technisch muss ich also 2 Errfun definieren, eine nicht quadratsummiert für LM, und eine Quadratsumme für SA?

Algorithmus:
1. ich geben x= x0 startpunkt ein, errfun1 für LM und errfun2 für SA definieren

while Tol nicht erreicht
x=x
2. errfun1 mit x in LM minimieren - Output errfun Vergleiche mit Tol
3. errfun2 in SA minimieren - Output x=x1
end while

so?

[EDITED, Jan, Bitte kein Top-Quoting - Danke!]
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: 04.04.2016, 14:59     Titel:
  Antworten mit Zitat      
Hallo,

gibt es einen speziellen Grund, warum die Simulated Annealing für die globale Optimierung verwenden möchtest?

Laut Doku ist es der letzte Solver, den man als letztes versuchen sollte.
http://de.mathworks.com/help/gads/choosing-a-solver.html
MultiStart hätte insbesondere den Vorteil, dass du das problemlos mit lsqnonlin verknüpfen kannst. Für die anderen Strategien würde ich fmincon in Verbindung mit deiner alten Zielfunktion versuchen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 14.11.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2016, 17:47     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

gibt es einen speziellen Grund, warum die Simulated Annealing für die globale Optimierung verwenden möchtest?

Laut Doku ist es der letzte Solver, den man als letztes versuchen sollte.
http://de.mathworks.com/help/gads/choosing-a-solver.html
MultiStart hätte insbesondere den Vorteil, dass du das problemlos mit lsqnonlin verknüpfen kannst. Für die anderen Strategien würde ich fmincon in Verbindung mit deiner alten Zielfunktion versuchen.

Grüße,
Harald


haha weil der Referenzauthor das benutzt hat....Danke für den Rat, mir ist bewusst, dass SA sehr sehr langsam ist. Ich werde mal mit MultiStart probieren.
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 - 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.