2017-05-14 2 views
1

Ein Zustandsraummodell ist von der Form: dx = Ax + Bu y = Cx + DuIst der MATLAB-Befehl lsim gut für linearisierte Zustandsraum-Modelle?

Nonlinear Zustandsraummodellen, die auf diesem Formular wird linearisiert wird:

dΔx = AΔx + BΔu 
Δy = CΔx + DΔu 

Wo:

Die Werte x10, x20, x30, xn0, u10, u20, u30, um0 sind Konstanten/Anfangswerte für die Linearisierung.

So! Die Frage ist, über den MATLAB-Befehl "lsim":

lsim (sys, u, t, x0) 

In diesem Fall sys sind die A, B, C, D Matrizen aus dem lineraized Zustandsraummodell. Sie ist der Insignalvektor, t ist der Zeitvektor. Aber x0 .... kann ich sagen, dass x0 x10, x20, x30, ...., xn0 ist?

Kann ich auch sagen, dass u = u - u0 und U0 ist, u10 u10, u20, u30, ..., UM0?

Beispiel:

u = linspace(5, 5, 100); % insignal 5 
t = linspace(0, 100, 100); % 100 seconds 
u0 = [0.2; -1.2; -3]; 
u = u - u0; % 
x0 = [-2; 2; -1] 
lsim (sys, u, t, x0) 

Dies wird Ergebnisse:

Δx = [x1 - 2; x2 + 2; x3 - 1] 
Δu = [u1 + 0.2; u2 - 1.2; u3 - 3] 

Habe ich Recht?

+0

Gibt es einen Grund, dass Sie denken, Sie nicht richtig sein kann? Die Antwort auf die Frage "Ist diese speziell für diese Aufgabe entwickelte Funktion bei dieser Aufgabe gut?" ist relativ klar, denke ich, also was ist die eigentliche Frage? –

+0

Die Frage ist, kann ich mein linearisiert Zustandsraummodell simulieren, wie ich oben gezeigt. –

+0

Der Ansatz ist in der Regel: versuchen Sie es, wenn es funktioniert, dann schön! Wenn es nicht funktioniert, dann komm und frage danach –

Antwort

0

Es gibt ein leicht verfügbares Simulink S-Functiondsfunc.m welches die Simulation eines Zustandsraummodells ist und das leicht für eingeschlossene linearisierte Zustandsraummatrizen angepasst werden kann und sich bei jedem Zeitschritt ändert.

Erstellen Sie einfach eine Simulink-Datei dsfunc.slx und führen Sie sie mit dem Befehl sim Befehl sim('dsfunc') Befehl.

Der gute Teil ist die S-Funktion behandelt ordnungsgemäß mit dem Zustand, und Sie passen nur das State Space-Modell jedes Mal, den Zustand von einer Iteration zur anderen zu halten.

Auch können Sie es ebenso leicht mit einer einzigen for Schleife. Linearisierungskonstante sind wie gezeigt enthalten.

function [t,u,x,y]=example2 
% Start 
dt=0.001; 
N=1000; 
n=2; 
r=1; 
t=(0:N-1)'*dt; 
u=rand(N,r); 
% First 
[A,B,C,D,x0,y0]=ABCD(t(1),zeros(n,1),u(1,:)'); 
x(1,:)=x0'; 
y(1,:)=(C*x(1,:)'+D*u(1,:)'+y0)'; 
% Cycle 
for i=2:N 
    [A,B,C,D,x0,y0]=ABCD(t(i),x(i-1,:)',u(i-1,:)'); 
    x(i,:)=(A*x(i-1,:)'+B*u(i-1,:)'+x0)'; 
    y(i,:)=(C*x(i,:)'+D*u(i,:)'+y0)'; 
end 
plot(t,[u x y]);legend({'u' 'x1' 'x2' 'y'}); 


function [A,B,C,D,x0,y0]=ABCD(t,x,u) 
A=[0.1 -0.9;0 0.1]; 
B=0.5*ones(2,1); 
C=[1 1]; 
x0=[0];y0=[0]; 

enter image description here

+0

Danke! Aber ich bevorzuge lsim Befehl :) –

+0

Ja, ich wollte zwar an mehreren Punkten linearisieren. Es passiert, dass Sie nur ein lineares Modell benötigen, um zu gehen. Das ist ok :\. – hyprfrcb