Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Variablen speichern

 

Lars_1991
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2019, 15:34     Titel: Variablen speichern
  Antworten mit Zitat      
Hallo liebes Forum

Ich habe eine for Schleife:
Code:
for k = 1:length(M_z)
    % Vorhersage Zustand und Fehlerkovarianz
    x_p = J_D_A_Kurve(s) .* M_z(k,:)
    s_x_p(k,:) = diag(x_p)
    P_p = D_A_Kurve(s) .* P .*(D_A_Kurve(s))' + Q
    % Berechnung Kalman Gain
    S = H(s)*P_p*(H(s))' + R_1
    K = P_p*(H(s))' / S
    % Berechnung der Schätzung
    x_e = x_p + K*(z_L - H(s)*x_p)
    s_x_e(:,k) = x_e
    s_z_L(:,k) = z_L
    % Berechnung der nächsten Fehlerkovarianz
    P_k = P_p - K * H(s)*P_p
end


ich möchte gern diese Parameter abspeichern, damit ich sie mir später ansehen kann und plotten kann.

Code:
% Vorhersage
s_x_p = zeros(1,length(M_z));

% Schätzung
s_x_e = zeros(n,length(M_z));

% Messung
s_z_L = zeros(n,length(M_z));
 


Kann mir jemand helfen?

Meine ausgeworfene Fehlermeldung lautet, dass die Matrixdimensionen nicht zusammenpassen

"Unable to perform assignment because the size of the left side is 1-by-360 and the size of the right side is 5-by-1."


Vielleicht ist ja jemand bereit mir zu helfen.

Mit freundlichen Grüßen
Lars
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 20.529
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 07.11.2019, 17:42     Titel:
  Antworten mit Zitat      
Hallo,

ohne ein nachvollziehbares Beispiel schwierig.
Ist M_z eine Matrix? Dann würde ich von der Verwendung von length abraten und stattdessen size empfehlen.

Läuft der Code denn fehlerfrei, wenn du nicht vorbelegst? Sicherheitshalber vor neuen Versuchen
clear
Falls ja, kannst du an der Größe der Variable am Ende ja sehen, wie du sie vorbelegen musst.

Ansonsten: die Fehlermeldung ist ja recht klar, und die komplette Fehlermeldung sagt vermutlich auch noch aus, in welcher Zeile das Problem auftritt. So blöd es klingt, kurz gesagt wäre der Rat: dann mach die Dimensionen halt passend ;)

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2019, 21:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich schicke dir den vollständigen Code mal rüber. nein der Code läuft nicht...eben weil die Dimensionen noch nicht passen.

Es gibt ein Beispiel, wo es die gleiche Herangehensweise ist.
https://www.cbcity.de/das-extended-kalman-filter-einfach-erklaert

M_z ist eine Matrix genau. Ok, danke für den Tipp mit der "size" Funktion.
Du meinst vor der Speicherung clear reinzuschreiben?

Danke und einen schönen Abend.

EKF_CTRV_LARSs.mlx
 Beschreibung:

Download
 Dateiname:  EKF_CTRV_LARSs.mlx
 Dateigröße:  61.13 KB
 Heruntergeladen:  7 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.614
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 08.11.2019, 08:00     Titel:
  Antworten mit Zitat      
Der Code liefert einen anderen Fehler:
Code:

Unrecognized function or variable 'v_e_1'.

Error in EKF_CTRV_LARSs (line 120)
psi_e_1 = (v_e_1/R)
 


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.529
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 08.11.2019, 08:49     Titel:
  Antworten mit Zitat      
Hallo,

Andreas, das lag an (warum auch immer) auskommentierten Zeilen.

Korrekturvorschlag Zeile 164: s_x_p = zeros(5,length(M_z));
Korrekturvorschlag Zeile 181: s_x_p(:,k) = diag(x_p)

Jetzt gibt es einen Fehler in Zeile 183, aber mir ist nicht recht klar, was die Absicht hinter der Zeile ist. Warum insbesondere das komplizierte Function Handle Konstrukt? Ist das nicht einfach s(1:5) ?

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2019, 09:27     Titel:
  Antworten mit Zitat      
Guten Morgen,

Der Fehler mit dem aaskommentierten v war ein Versehen von mir....möchte da eigentlich noch was ändern, sodass ich nur noch ein v auswählen muss und das Programm dann selbst die nächsten Schritte vollzieht....Wunschdenken Wink

Die Korrektur von Harald hat zumindest erstmal geklappt...jetzt springt der Fehler weiter.
Muss ich die Speichervariablen alle nach dem Beispiel s_x_p anpassen?
Code:
% Vorhersage
s_x_p = zeros(5,length(M_z));

% Schätzung
s_x_e = zeros(n,length(M_z));

% Messung
s_z_L = zeros(n,length(M_z));


Ich weiß die frage wurde sicher schon oft gestellt und es gibt auch eine Matlab Hilfe aber in einfachen Worten, was ist der Vorzug eines function Handles? Ich habe das ehrlich gesagt einfach bei einem Beispiel gesehen und dann so übernommen...

Grüße
Lars
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

was ist der aktuelle Fehler? Matrixmultiplikation? Wie gesagt: da weiß ich nicht, was die Absicht der Zeile ist, und kann damit auch nicht Tipps zur Fehlerbehebung geben.

Function Handles würde ich vor allem dann verwenden, wenn eine Funktion eine andere Funktion als Input erwartet, z.B. bei fzero, oder auch zur Definition von Funktionen als Einzeiler.

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2019, 14:18     Titel:
  Antworten mit Zitat      
Hallo,

also der Code läuft jetzt zumindest mal. Es wirft nur mit Sicherheit noch nicht das richtige aus.
Der Code basiert auf den Gleichungen, siehe Anhang. Somit muss wahrscheinlich eine echte Matrix Multiplikation stattfinden und keine Elementweise Multiplikation.

Eine Veränderung, die ich gern noch umsetzen würde, ist, dass beim Starten des Filters, also erster Umlauf, in der ersten Zeile der Zustandsvektor x_init als Prediction (Vorhersage) genommen wird aber im nächsten Umlauf dann durch das berechnete x_e Estimation (Schätzung) ersetzt wird. Und dann immer so weiter.
Das gleich soll eigentlich für P geschehen. Also erster Umlauf mein P, welches ich vorher definiert habe (siehe Code) und dann im weiteren durch das, im letzten Schritt berechnete P_k ersetzt wird.
Wie mache ich das am besten.
Code:
for k = 1:length(M_z)
    % Vorhersage Zustand und Fehlerkovarianz
    x_p = J_D_A_Kurve(s) .* x_init;
    s_x_p(:,k) = diag(x_p);
    P_p = D_A_Kurve(s) .* P .*(D_A_Kurve(s))' + Q;
    % Berechnung Kalman Gain
    S = H(s) .* P_p .* (H(s))' + R_1;
    K = P_p .*(H(s))' / S;
    % Berechnung der Schätzung
    x_e = x_p + K .* (M_z(k,:) - H(s) .* x_p);
    s_x_e(:,k) = diag(x_e);
    s_z_L(:,k) = M_z(k,:);
    % Berechnung der nächsten Fehlerkovarianz
    P_k = P_p - K .* H(s) .* P_p;
end
 


Also meinst du Harald, kann man das auch ganz normal mit den Variablen füllen und nicht das function handle benutzen?
Ich werde das nochmal klären. erstmal Danke dafür Wink

Grüße
Lars

Bildschirmfoto 2019-11-08 um 13.49.04.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2019-11-08 um 13.49.04.png
 Dateigröße:  1.07 MB
 Heruntergeladen:  3 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2019, 12:32     Titel:
  Antworten mit Zitat      
Hat keine eine Idee? Sad

Oder braucht es noch Zusatzinformationen? Ich würde mich über Vorschläge freuen

Liebe Grüße
Lars
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Es wirft nur mit Sicherheit noch nicht das richtige aus.

Dann müsstest du das schrittweise durchgehen und ganz genau sagen, an welcher Stelle was statt was herauskommen sollte. Wie schon gesagt: ich kenne mich mit Kalman-Filtern (und der in den Gleichungen verwendeten Syntax) nicht aus.

Zitat:
Eine Veränderung, die ich gern noch umsetzen würde, ist, dass beim Starten des Filters, also erster Umlauf, in der ersten Zeile der Zustandsvektor x_init als Prediction (Vorhersage) genommen wird aber im nächsten Umlauf dann durch das berechnete x_e Estimation (Schätzung) ersetzt wird

Dann verwende doch nur x_e, setze das vor der Schleife, und überschreibe es in der Schleife.

Zitat:
Das gleich soll eigentlich für P geschehen.

Dann genauso wie für x_e.

Zitat:
kann man das auch ganz normal mit den Variablen füllen und nicht das function handle benutzen?

Definitiv ja.

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2019, 15:28     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für den Hinweis...hab jetzt meine Eingangsvariable x_e so benannt wie sie im Algorithmus auftaucht. wird diese dann automatisch nach dem ersten Umlauf überschrieben? Das gleiche habe ich mit P gemacht. Es ändert sich zwar nichts Grundlegendes aber ich erforsche das mal in den kommenden Tagen und melde mich dann nochmal

Ich muss noch herausfinden, welcher Art von Matrix/Vektor ausgegeben werden soll.

Das mit dem Funktion handle werde ich mir dann nochmal überlegen, wenn es eh auch klassisch geht

Ich wünsche noch einen schönen restlichen Sonntag.

Liebe Grüße
Lars
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
wird diese dann automatisch nach dem ersten Umlauf überschrieben?

Wenn du das so gemacht hast, wie ich meine: ja. Probier es aber doch einfach aus? Lass den Code im Debugging-Modus zeilenweise durchlaufen und schau dir die Variablen im Workspace an.

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2019, 12:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe jetzt nochmal ein bisschen was verändert und damit beschäftigt, welche Dimensionen meine Ergebnisse haben sollen und welche ich derzeit habe.

Hier der Code für den Algorithmus:
Code:
format short
for k = 1:length(M_z)
    % Vorhersage Zustand und Fehlerkovarianz
    x_p = D_A_Kurve(s)
    s_x_p(:,k) = x_p
    P_p = D_A_Kurve(s)' * P_k *(D_A_Kurve(s)) + Q
    % Berechnung Kalman Gain
    S = H(s)' * P_p * H(s) + R_1
    K_0 = P_p' *(H(s));
    K = K_0' * inv(S)
    % Berechnung der Schätzung
    x_e = x_p + K * (M_z(k,:) - J_H_1(s))
    s_x_e(:,k) = diag(x_e)
    s_z_L(:,k) = M_z(k,:)
    % Berechnung der nächsten Fehlerkovarianz
    P_k = P_p - K * H(s) * P_p                      % keine Neuberechnung von P_k, WARUM?
end


Eine Zeile an der ich mir noch die Zähen ausbeiße, ist die Zeile:
Code:
x_e = x_p + K * (M_z(k,:) - J_H_1(s))


der Vektor x_e soll vom Format 5x1 sein. So wie er oben berechnet wird, kommt eine 5x5 Matrix raus. Da der Vektor x_e ja immer wieder überschrieben wird, funktioniert der Filter nicht richtig. Die Dimensionen der anderen Vektoren und Matrizen lauten:
x_p = 5x1
K = 5x5
M_z = 360x5
J_H_1 = 5x1
Ich denke das Fehler in der M_z Matrix liegt.

Jetzt meine Frage:

mich interessiert aus M_z immer nur die jeweilige Zeile, passend zum k, also die Dimension 1x5. hat jemand eine Idee, wie man zeilenweise Daten extrahieren kann und trotzdem der Wert nach dem Umlauf verändert?

Ich stelle meinen vollständigen Code nochmal zur Verfügung.
Bei Fragen bitte gern melden!!!

Ich bin fast am Ziel und würde mich über eure Hilfe freuen.

Liebe Grüße
Lars

EKF_CTRV_LARS.mlx
 Beschreibung:

Download
 Dateiname:  EKF_CTRV_LARS.mlx
 Dateigröße:  124.38 KB
 Heruntergeladen:  1 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
hat jemand eine Idee, wie man zeilenweise Daten extrahieren kann

so, wie du das machst.

Das ist aber auch schon das Problem: du mischt an der Stelle einen Zeilenvektor mit den Spaltenvektor. Evtl. transponieren?

Zitat:
trotzdem der Wert nach dem Umlauf verändert?

Der Wert von was? Mit Umlauf meinst du Iterationen?
Das Extrahieren einer Zeile ändert nichts am weiteren Verhalten der Matrix.

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
 
Lars_1991
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 04.11.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2019, 20:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
Das ist aber auch schon das Problem: du mischt an der Stelle einen Zeilenvektor mit den Spaltenvektor. Evtl. transponieren?


Eigentlich ist das kein Problem bei der Berechnung.

Zitat:
Der Wert von was? Mit Umlauf meinst du Iterationen?
Das Extrahieren einer Zeile ändert nichts am weiteren Verhalten der Matrix.


Umlauf = Iteration (k= 1:360). Die beiden Werte, die ich und dem screenshot markiert habe, sollen nach jedem Umlauf die beiden oberen, zu dem die Pfeile gehe überschrieben werden.
Das Extrahieren der Zeile hat funktioniert...die Dimension ist ja (1x5)

Liebe Grüße
Lars

Bildschirmfoto 2019-11-12 um 20.07.18.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2019-11-12 um 20.07.18.png
 Dateigröße:  165.66 KB
 Heruntergeladen:  2 mal
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


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


Copyright © 2007 - 2019 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.