Verfasst am: 01.02.2017, 11:13
Titel: Symbolische Variable in einer Funktion nutzen
Hallo zusammen,
ich möchte symbolische Variablen in einer Funktion benutzen.
Und zwar soll die Jacobimatrix zu jedem Abtastschritt k berechnet werden, um schließlich damit einen Zustandsvektor schätzen zu können.
Q=0.005^2*eye(3)
R = 0.001 syms x1 x2 x3 u
x = [000];
x = x+x_k
f_k = [x2; 2*x1*x3^2; x1/x3];
T = 0.02;
I = eye(3);
%Jacobimatrix im Vektor x
J_k = subs(jacobian(f_k), [x1 x2 x3],x)
Phi = I +T*J_k;
Ps_k=Phi*Pkm1*Phi'+Q;
H = [100];
K_k=Ps_k*H'*inv(H*Ps_k*H'+R)
P_k =(eye(3)-K_k*H)*Ps_k*(eye(3)-K_k*H)'+ K_k*R*K_k';
x_k=Phi*xkm1*H*ukm1+K_k*(yk-H*Phi*xkm1-H*1*ukm1);
end
Bei der Ausführung des Programmes bekomme ich die Fehlermeldungen:
1.The function 'syms' is not supported for standalone code Generation
2. Undefined function or variable 'x_k'. The first assigment to a local variable determines ist class.
Selbiges für x x2 f_k usw..
Wie kann ich das Problem beheben?
Vllt nochmal zu Erläuterung. Ich möchte beginnend mit einem Startvektor x0 (wusste nicht wie ich den verwenden kann) immer die Jacobimatrix im Punkt x_k des k-ten Abtastschritts berechnen (Startpunkt x0).
Das funktionierte außerhalb der Funktion im Command Window auch mit dem Subs befehl. Damit soll anschließend die Matrix Phi berechnet werden und mit Ihr und H die prädiktive Kovarianzmatrix Ps_k.
Darauf basierend sollen die K Matrix und eine korrigierte Kovarianzmatrix P_k berechnet werden. Diese werden dann dazu genutzt den geschätzten Zustandsvektor x_k zu berechnen.
Das 'km1' bedeutet die jeweilige Variable einen Schritt vorher.
Fehlermeldungen bitte grundsätzlich kopieren, nicht interpretieren.
Eine Alternative kann sein, den Code in eine andere Funktion auszulagern und in der Original-Funktion als extrinsisch zu deklarieren und von dort aufzurufen.
Ansonsten numerisch rechnen.
Es sieht auch so aus, als ob nur die letzten beiden Zeilen von den Inputs abhängen. Wäre es dann nicht besser, die anderen Variablen nur einmalig zu berechnen?
Fehlermeldungen bitte grundsätzlich kopieren, nicht interpretieren.
Eine Alternative kann sein, den Code in eine andere Funktion auszulagern und in der Original-Funktion als extrinsisch zu deklarieren und von dort aufzurufen.
Ansonsten numerisch rechnen.
Es sieht auch so aus, als ob nur die letzten beiden Zeilen von den Inputs abhängen. Wäre es dann nicht besser, die anderen Variablen nur einmalig zu berechnen?
Grüße,
Harald
Ich habe die Funktion Jacobi ausgelagert, und hier coder.extrinsic('syms') benutzt.
Also das aktuelle x-Array wovon die Funktion f_k abhängt ist auch von den Eingangskrößen abhängig. Pkm1 wird übrigens auch vorher benutzt.
Im Grunde soll es ja ein rekusives Verfahren sein. Die Funktion f_k soll zu jedem Schritt k differenziert werden, an dem jeweiligen Punkt des Arrays x_k
Ja ich denke vllt wäre eine andere Berechnung besser..
%Schätzvektor
xs = xkm1 + integeral von 0 bis T von f xkm1 beim ersten Mal = x0
%function definieren
f = ...
% Jacobimatrix bei xkm1 berechnen
% Phi berechnen
%Start kovarianz
Ps = Phi*Pkm1*Phi'+Q;
%Übrige Matrizen wie definiert...
du hast es zwar nie explizit erwähnt, aber das ganze ist ja vermutlich in Simulink eingebunden?
Wenn es nur darum geht zu iterieren, dann kannst du das doch auch ganz innerhalb von MATLAB machen?
Es wäre auch hilfreich, wenn du das komplette Projekt zur Verfügung stellst. Dann kann man Vorschläge direkt ausprobieren und sehen, ob sie funktionieren.
function[x_k,P_k]=Estimate(xkm1,P,ukm1,yk)
n=4; %number of states
q=0.001; %std of process
r=0.01; %std of measurement
Q=q^2*eye(n); % covariance of process
R=r^2; % covariance of measurement
T=0.02; % Timestep
Mit dem aktuellen Zustandsvektor x_k und dem Ausgangsvektor y_k. die Funktionen f und g beschreiben den Zusammenhang zwischen dem aktuellen und dem vorerigen Zusänden
Diese sollen in die Form:
% x_k+1 = Phi*x_k + H*u_k + Q
% y_k = C*x_k +R
Phi setz sich wie oben beschrieben zusammen. F ergibt sich als Jacobimatrix df/dx und H als Jacobimatrix df/du (hier Null) sowie C =dg/dx).
Diese Form ist die linearisierte Form in jeweiligen Zustand x_k.
Einstellungen und Berechtigungen
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
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.