Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Systemingenieur (m/w) Funktionsentwicklung Automotive
Konzeption und Spezifikation von spezifischen Funktionen (Mess- und Regelalgorithmen) in elektronischen Steuergeräten
DRÄXLMAIER Group - Vilsbiburg bei Landshut

Softwareentwickler (w/m) Bypassing- und Steuergeräte-Schnittstellen
Entwicklung von Echtzeit-Software für verschiedene automotive Microcontroller
dSPACE GmbH - Paderborn

Resident-Ingenieur (w/m) Hardware-in-the-Loop-Simulation
Inbetriebnahme und Software-Anpassungen der HIL-Systeme
dSPACE GmbH - Wolfsburg

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

M-function spinnt

 

Heber
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2017, 12:36     Titel: M-function spinnt
  Antworten mit Zitat      
Hallo ich benutze eine m-function in einem Simulink Modell. Und meiner Meinung nach macht sie nur Mist. Zunächst zeigt sie mir Fehler aufgrund von angeblich nicht passenden Dimensionen bei Multiplikationen von Matrizen und Vektoren. Ändere ich hier eine Matrix (bsw Spaltenvektor ) in jeweils die Transponierte erlischt die Fehlermeldung. Mathematisch macht es kein Sinn, da die Dimensionen nun nicht mehr passen bzw eine Multiplikation nicht möglich ist. Was kann flasch sein?

Code:
function [Pk, xk] = fcn(Phi, C, H, R, Q, Pkm1, xkm1, ukm1, yk)
%Prädiktive Kovarianz

Ps_k = Phi*Pkm1*Phi' + Q;

%Kalman Matrix
K_k = (Ps_k*C')/(C*Ps_k*C' + R);    %Richtig aber mit Fehlermeldung
K_k = (Ps_k*C)/(C'*Ps_k*C + R);   % Falsch aber ohne Fehlemreldung

%Korrigierte Kovarianz
Pk = (eye(2)-K_k*C)*Ps_k*(eye(2)-K_k*C)' + K_k*R*K_k';   %Richtig aber mit Fehlermeldung
Pk = (eye(2)-K_k*C')*Ps_k*(eye(2)-K_k*C')' + K_k*R*K_k'; % Falsch aber ohne Fehlemreldung

%Geschätzte Zustände
xk = Phi*xkm1 + H*ukm1 +K_k*(yk -C'*Phi*xkm1 -C'*H*ukm1); %Richtig aber mit Fehlermeldung
xk = Phi*xkm1 + H*ukm1 +K_k*(yk -C*Phi*xkm1 -C*H*ukm1);  % Falsch aber ohne Fehlemreldung
 

das ist mein Code. Als Eingangsgröße sind die Matrizen Phi (2x2), H (2x1) und C (1x2) und die Koavrianzmatrizen R (skalar) Q (2x2). xkm1 ukm1 und yk sind die Zustände zum k-1ten, die Eingangsgröße zum k-1ten und yk die Ausgangsgröße zum kten Schritt.
Ich habe jeweisl den eigentlich richtigen Code und den falschen Code dargelegt.

Wo könnte mein Fehler liegen? Ich bin ratlos, gerade weil Matlab einen falschen Code alsrRichtig interpretiert...
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ich würde dir mal den Debugger empfehlen. Es ist extrem unwahrscheinlich, dass MATLAB bei so elementaren Operationen falsch rechnet.

Bitte Fehlermeldungen generell kopieren und nicht übersetzen / interpretieren.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2017, 10:18     Titel:
  Antworten mit Zitat      
Die Matrizen sind devinitiv richtig definiert! Es kann normalerweise keine Meldungen aufgrund von Dimensionen geben...

Ich habe mal den Debugger benutzt: Siehe Anhang.
Leider wird es so lang gezogen...

Fehlermeldung im Anhang.

Betrefflicher Codeauszug(m-file):
Code:

G = tf([-b0],[1 a1 a0]);
A = [0, 1;-a0, -a1];
B = [0;-b0];
C1 = [1, 0];
D = [0];

T = 0.001;
sys = ss(A,B,C1,D);
sysd = c2d(sys, T);
Phi = sysd.a;
H2 = sysd.b;
R_m = 0.0005;
Q_m = 5e-9;
Q = eye(2)*Q_m;

 



Was ich noch probiert hatte ist die Ps_k Matrix auf persistent zu stellen und zunächst via if isempty() einen Startwert vorzugeben, was allerdings auch nichts half.

[EDITED, Jan, Bitte keine vollständigen Zitate der vorhergehenden Nachricht - Danke!]

Fehlermeldungen.png
 Beschreibung:

Download
 Dateiname:  Fehlermeldungen.png
 Dateigröße:  25.44 KB
 Heruntergeladen:  15 mal
Debug.png
 Beschreibung:

Download
 Dateiname:  Debug.png
 Dateigröße:  21.94 KB
 Heruntergeladen:  13 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

es wäre hilfreich, ein komplett reproduzierbares Beispiel zu haben. Auch bei deinem Beispielskript fehlt noch die Hälfte der Parameter.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2017, 15:54     Titel:
  Antworten mit Zitat      
Es fehlt nichts, außer b0, a1 und a0. Diese kannst du so wählen: b0 =1; a1 = 7 und a0 =30. Der Rest ist bekannt.

[EDITED, Jan, Bitte keine vollständigen Zitate der vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mir zumindest erschließt sich nicht, was die konkreten Werte von
C, H, R, Pkm1, xkm1, ukm1, yk
sein sollen.

Du hast zwar zu einigen der Variablen die Dimensionen angeben, aber warum soll ich ein Beispiel konstruieren, das vielleicht dann doch nicht das selbe Verhalten hat wie bei dir, wenn du leicht ein solches Beispiel zur Verfügung stellen kannst?

Hast du die Funktion denn mal als reine MATLAB-Funktion getestet? Treten die Probleme schon dort auf oder erst, wenn du das in Simulink einzubinden versuchst? In letzterem Fall wäre ein Beispielmodell hilfreich.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2017, 19:55     Titel:
  Antworten mit Zitat      
C = C1 aus dem Skript
H = H2 aus dem Skript
Pkm1 (gesprochen Pk minus 1) ist die zurückgefürte Kovarianz einen Schritt vorher (delay zwischen Aus- und Eingang)
xkm1 ist die zurückgefürte Kovarianz einen Schritt vorher (delay zwischen Aus- und Eingang)
yk gemessener Systemausgang zu k-Schritt

Skript samt Modell und Datei im Anhang.

[EDITED, Jan, Bitte keine vollständigen Zitate der vorhergehenden Nachricht - Danke!]

KF.zip
 Beschreibung:

Download
 Dateiname:  KF.zip
 Dateigröße:  1.07 MB
 Heruntergeladen:  7 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.531
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 16.10.2017, 21:34     Titel:
  Antworten mit Zitat      
Hallo,

ich habe mir mal den "diagnostic report" angesehen. Da wird C interessanterweise als 2x1 aufgeführt, obwohl es von außen scheinbar als 1x2 reinkommt. Als Dimension wird auch 2 angegeben, nicht etwa 1x2.
Wenn du im Constant-Block den Haken bei "Interpret vector parameters as 1-D" entfernst, wird ein Zeilenvektor daraus.

Vielleicht bringt dich das ja weiter.
Falls nicht, bitte noch angeben, wie zAdd und zAdd19 (und ggf. weitere) definiert werden müssen, damit das Modell lauffähig ist.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2017, 16:03     Titel:
  Antworten mit Zitat      
Ja das hat funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.481
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.10.2017, 12:40     Titel:
  Antworten mit Zitat      
Hallo Heber,

Bitte füge nicht die gesammte vorhergehende Nachricht als Zitat ein, denn das halbiert nur die Informationsdichte des Threads. Danke!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Heber
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 54
Anmeldedatum: 01.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2017, 09:38     Titel:
  Antworten mit Zitat      
Der Verzicht auf derartige Hinweise, würde ebenfalls einen Beitrag leisten...
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
.


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 - 2017 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.