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

Symbolische Variable in einer Funktion nutzen

 

Heber
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 01.02.17
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 01.02.2017, 11:13     Titel: Symbolische Variable in einer Funktion nutzen
  Antworten mit Zitat      
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.

Code:
function [x_k P_k] = Estimate(yk, xkm1, Pkm1, ukm1)

Q=0.005^2*eye(3)
R = 0.001
syms x1 x2 x3 u
x = [0 0 0];
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 = [1 0 0];
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.


Kann mir jemand helfen?
Ganz lieben Dank!
Private Nachricht senden Benutzer-Profile anzeigen


Heber
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 01.02.17
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 01.02.2017, 14:31     Titel:
  Antworten mit Zitat      
Ich habe inzwischen die Berechnung meiner Jacobimatrix ausgelagert.

Code:

function J = Jacobi(x)
%Parameter
...

syms x1 x2 x3
f_k = ...;
J = subs(jacobian(f_k), [x1 x2 x3], x);
end


Dies Führt allerdings auf die selbe Fehlermeldung...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2017, 20:00     Titel:
  Antworten mit Zitat      
Hallo,

versuchs mal, syms etc. als extrinsisch zu definieren - z.B.
Code:
coder.extrinsic('syms')


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 01.02.17
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 02.02.2017, 15:05     Titel:
  Antworten mit Zitat      
Hallo Harald, danke für den Tipp.
In dem Fall werden die symbolischen Variablen nicht erkannt.
Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.02.2017, 18:46     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Heber
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 01.02.17
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 02.02.2017, 21:05     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

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

Schematisch könnte es so aussehen

funktion (x_k, P_k) = myfunction(yk xkm1 ukm1 pkm1)

x0 = Startvektor

%%Rekusive Vorschrift

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

Und dass soll kontinuierlich wiederholt werden.

Ist es nun verständlicher?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 01.02.17
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 07.02.2017, 09:56     Titel:
  Antworten mit Zitat      
Also das wäre mal der komplette Code:

Code:

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

f_k = [x(2); 2*x(1)*x(3)^2; x(1)/x(3)];
g=(x)[x(1)];
[xp, F]=jaccsd(f,xkm1);    
Phi = eye(4)+0.02*F;
Ps=Phi*P*Phi'+Q;
[xp2, H]=jaccsd(f,ukm1)
[yp,C]=jaccsd(g,xkm1);    
K_k = Ps*H'*inv(H*Ps*H'+R);
P_k = (eye(4)-K_k*H)*Ps*(eye(4)-K_k*H)'+K_k*R*K_k';
x_k = Phi*xkm1+H*ukm1+K_k(yk-C*Phi*xkm1-C*H*ukm1);

function [z,A]=jaccsd(fun,x)
% JACCSD Jacobian through complex step differentiation
% [z J] = jaccsd(f,x)
% z = f(x)
% J = f'(x)
%
z=fun(x);
n=numel(x);
m=numel(z);
A=zeros(m,n);
h=n*eps;
for k=1:n
    x1=x;
    x1(k)=x1(k)+h*i;
    A(:,k)=imag(fun(x1))/h;
end


Folgendes soll berechnet werden:

der Zustand
% x_k+1 = f(x_k) + w_k
% y_k = g(x_k) + v_k

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