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

Probleme mit der Iteration

 

Hard Harry
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2011, 17:25     Titel: Probleme mit der Iteration
  Antworten mit Zitat      
Sehr geehrte Matlab-Spezialisten,
ich habe das Folgende Problem:

Es soll der Levenberg-Marquardt-Algorithmus programmiert werden, der folgende Link zeigt die Problemstellung an einem Beispiel...
http://www.igpm.rwth-aachen.de/Numa/NumaMB/SS10/LevMarq.pdf

Wie schaffe ich es in meinem Programm diesen zu realiesieren?
Wie schaffe ich es das k Iterationen durchlaufen werden?
-Hierbei ist das Abbruchkriterium: Puk ändert sich in der nächsten Iteration nicht mehr! Damit wären die Parameter gefunden!
Wie setze ich es programmiertechnisch um, dass die unten aufgeführten if-Abfragen auf den höher liegenden Programmcode zugreifen?

Code:
%----------------Stützpunkte----------------
t=[2 3 4];
y=[0 2 0];
%----------------Startvektor----------------
x=[4 0];  %x=[ak bk]
%---------------Dämpfungsparameter----------
uk=1;
%----------------Anzahl der Stützpunkte-----
n=length(t);
%-------------Zugriff auf Symbolik----------
syms ak bk real
%--------------Erzeugung-Startwertematrix---
for i=1:n
f(i)=(t(i)-ak)^2+exp(bk*(t(i)^2+y(i)^2))-5; % <- Modellfunktion
end
f=f';
 
Parameter=[ak bk];
%-------------------------------------------
%--------------Erzeugung-Jacobimatrix-------
v=[ak bk];
j=jacobian(f,v);
%--------------Matrix-Substitution----------
J=subs(j,Parameter,x); %nach jeder Iteration hätte man ein neuen Vektor x
F=subs(f,Parameter,x);
%--------------Korrektur-Vektor-------------
z=min(size(J)); %Dim von eye(z,z)
sk=-inv(J'*J+uk^2*eye(z,z))*J'*F;
 
xk=x'+sk;
%---Entscheidung für Korrektur-Vektor sk----
%-------Parametersteuerungs-Variablen--------
Beta1=0.2;
Beta2=0.8;
%-------------------------------------------
 
Fxk=subs(f,Parameter,xk);  % F(xk)=F(xk-1+sk-1)
Fxk_1=subs(f,Parameter,x); % F(xk-1)
Jxk_1=subs(j,Parameter,x); % J(xk-1)
Fxk_1_Jxk_1sk=Fxk_1+Jxk_1*sk
Puk=(norm(Fxk_1)^2-norm(Fxk)^2)/...
    (norm(Fxk_1)^2-norm(Fxk_1_Jxk_1sk)^2)

%Abfrage für Entscheidung
if Puk <= Beta1
   uk=2*uk
    % uk wird verdoppelt und alles wird neu berechnet
end
 
if Beta1 < Puk < Beta2
    uk=uk %Die Berechnung wird akzeptiert und das gleiche uk wird genommen
end
 
if Puk>=Beta2
    uk=uk/2 %Die Berechnung wird akzeptiert und das uk wird halbiert
end
 


Über eine Lösung diese Problems wäre ich Euch sehr Dankbar.
Private Nachricht senden Benutzer-Profile anzeigen


Hard Harry
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2011, 10:46     Titel:
  Antworten mit Zitat      
Könnte man dieses Problem vielleicht lösen wenn man eine function() des Hauptprogramms über den if-Abfragen schreibt lösen?
Könnte mir bitte jemand helfen Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Hard Harry
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2011, 16:29     Titel:
  Antworten mit Zitat      
Warum hilft mir bloss keiner???????
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

zum einen rate ich zu etwas Geduld - es sind ja noch nicht mal 24 Stunden seit der Fragestellung vergangen.
Zum anderen liegt das Ausbleiben einer Antwort oft an der Fragestellung.

Zitat:
Wie schaffe ich es das k Iterationen durchlaufen werden?

Über welchen Programmteil soll iteriert werden? Generell kann man k Iterationen erreichen durch
Code:
for I = 1:k
% Code
end


Zitat:
Hierbei ist das Abbruchkriterium...

Ja, was denn nun? k Iterationen oder abbrechen? Oder eine Kombination aus beidem? Das wäre dann
Code:
I = 0;
while I <= k && Abbruchkriterium nicht erfüllt
% Code
I = I + 1;
end

Zitat:

Wie setze ich es programmiertechnisch um, dass die unten aufgeführten if-Abfragen auf den höher liegenden Programmcode zugreifen?

Ich verstehe beim besten Willen nicht, wer auf was wie zugreifen soll.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2011, 17:29     Titel:
  Antworten mit Zitat      
Hallo Harald,
entschuldige mit der Gedult hast du recht. Ich bin nur am verzweifeln und sitze schon sehr lange an meinem Problem Sad

Die Grundstruktur des Algorithmus sieht sio aus:
--------------------------------------------------------------------------------------
Wähle Startwertvektor x bzw. xk und Anfangswert für den Parameter μk.
Für k = 0, 1, 2, . . .:
1. Berechne F(xk), J(xk).
2. Löse das lineare Ausgleichsproblem
Code:
sk=-inv(J'*J+uk^2*eye(z,z))*J'*F;

3. Teste, ob die Korrektur sk akzeptabel ist dafür steht der Parameter Puk. Wenn nein, dann wird
μ angepaßt und Schritt 2 wiederholt.
Wenn ja, dann:
4. Setze xk+1 = xk +sk.
--------------------------------------------------------------------------------------
k läuft dementsprechend durch das ganze Programm bis: der Parameter Puk sich in der nächsten Iteration also k+1 nicht mehr ändert!

Einen genaueren Einblick für den Algorithmus findet man unter dem folgendem Link, dort wird die Methodik anhand eines Zahlenbeispiels erläutert. http://www.igpm.rwth-aachen.de/Numa/NumaMB/SS10/LevMarq.pdf

Viele grüße,
Harry
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.10.2011, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

ich habe dir ja Vorschläge gemacht. Hast du es mal damit versucht?

Edit: was ich noch schreiben wollte:
Code:
if Beta1 < Puk < Beta2

macht wohl nicht das, was es soll. Du willst wohl
Code:
if Beta1 < Puk && Puk< Beta2


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2011, 22:06     Titel:
  Antworten mit Zitat      
Ich habe nun versucht das ganze mit Funktionen zu schreiben.
Soweit so gut Smile
Allerdings funktioniert es immer noch nicht?
problem 1: rumgemecker über zu wenig Input arguments
problem 2: Eine vernüftige ausgabe wie in der Datei Ergebnisse

Wie bekomme ich das hin?

Ergebnisse.png
 Beschreibung:

Download
 Dateiname:  Ergebnisse.png
 Dateigröße:  51.4 KB
 Heruntergeladen:  366 mal
levenberg_marquardt.m
 Beschreibung:

Download
 Dateiname:  levenberg_marquardt.m
 Dateigröße:  301 Bytes
 Heruntergeladen:  272 mal
L_M.m
 Beschreibung:

Download
 Dateiname:  L_M.m
 Dateigröße:  1.04 KB
 Heruntergeladen:  268 mal
korrektur.m
 Beschreibung:

Download
 Dateiname:  korrektur.m
 Dateigröße:  333 Bytes
 Heruntergeladen:  265 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.11.2011, 22:32     Titel:
  Antworten mit Zitat      
Hallo,

L_M.m läuft bei Ausführung durch, die anderen Dateien sind Funktionen und brauchen somit natürlich Eingabeargumente.

zu 1.: Welche Datei führst du wie aus?

Ich würde eine Fehlermeldung nicht als "Rumgemecker" bezeichnen. Bei dieser speziellen Fehlermeldung reicht an sich das Abzählen der erwarteten und der übergebenen Argumente.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2011, 23:13     Titel:
  Antworten mit Zitat      
Die Eingabeargumente habe ich doch in L_M.m

kommt wenn ich Run drücke bei der Datei korrektur.m

Error using korrektur (line 3)
Not enough input arguments.

Ich bekomme es also nicht zum laufen, weil ich es falsch starte....?
oder wie? Wie rufe ich den die functionen auf indem ich L_M.m starte
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du solltest dich mal mit den Grundlagen von Funktionen auseinandersetzen. Die Eingabeargumente müssen an Funktionen immer übergeben werden; das Drücken des Run-Buttons ist dort also nicht sinnvoll, außer die Run Configurations wurden angepasst.

Wenn du in deinem Skript alle diese Variablen definiert hättest, könntest du korrektur.m so aufrufen:
Code:
[s,mu] = korrektur(F,DF,x,mu,beta0,beta1)

x wird aber im Skript nicht definiert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 12.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2011, 00:00     Titel:
  Antworten mit Zitat      
ich verstehe das noch nicht...es sind doch alle Variablen definiert

x wird doch erst in levenberg_marquardt.m definiert bzw. x=x0
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

woher soll korrektur.m wissen, dass es Parameter aus levenberg_marquardt.m übernehmen soll, wenn du bei korrektur.m auf "run" drückst?

Sinnvoll wäre eher:
Code:
L_M
levenberg_marquardt(F, DF, x0, mu0, beta0, beta1, maxit, tol)


Dann gibt es eine Fehlermeldung:
Zitat:
Subscript indices must either be real positive integers
or logicals.

Error in levenberg_marquardt (line Cool
s=-(DF(x0)'*DF(x0)+mu^2*eye(n))\(DF(x0)'*F(x0));


Das ist nachvollziehbar, da DF eine (konstante) Matrix ist und du sie nicht an einem Vektor "auswerten" kannst.

Grüße,
Harald
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.