MATLAB 命令 lsim 是否适用于线性化状态 space 模型?
Is the MATLAB command lsim good for linearized state space models?
状态space模型在表格上:
dx = Ax + Bu
y = Cx + Du
非线性状态space线性化的模型是这种形式:
dΔx = AΔx + BΔu
Δy = CΔx + DΔu
其中:
Δx = [x1 - x10; x2 - x20; x3 - x30; .... ; xn - xn0]
Δu = [u1 - u10; u2 - u20; u3 - u30; .... ; um - um0]
x10、x20、x30、xn0、u10、u20、u30、um0 是 constants/initial 个线性化值。
所以!问题是关于 MATLAB 命令 "lsim":
lsim (sys, u, t, x0)
在这种情况下,sys 是来自线性化状态 space 模型的 A、B、C、D 矩阵。 u 是信号向量,t 是时间向量。但是 x0....我可以说 x0 是 x10、x20、x30、....、xn0 吗?
我也可以说 u = u - u0 ,而 u0 是 , u10 u10, u20, u30,... , um0 吗?
示例:
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)
这将导致:
Δx = [x1 - 2; x2 + 2; x3 - 1]
Δu = [u1 + 0.2; u2 - 1.2; u3 - 3]
我说得对吗?
有一个现成的 Simulink S-Function dsfunc.m
,它是状态 Space 模型的仿真,可以很容易地适应包含的线性化状态 Space矩阵,每一步都在变化。
只需构建一个 simulink 文件 dsfunc.slx
并使用 sim 命令 sim('dsfunc')
命令 运行 它。
好的部分是 S-Function 可以正确处理状态,您每次只需调整状态 Space 模型,保持状态从一次迭代到另一次迭代。
你也可以用一个 for
循环同样轻松地做到这一点。如图所示包含线性化常数。
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];
状态space模型在表格上: dx = Ax + Bu y = Cx + Du
非线性状态space线性化的模型是这种形式:
dΔx = AΔx + BΔu
Δy = CΔx + DΔu
其中:
Δx = [x1 - x10; x2 - x20; x3 - x30; .... ; xn - xn0]
Δu = [u1 - u10; u2 - u20; u3 - u30; .... ; um - um0]
x10、x20、x30、xn0、u10、u20、u30、um0 是 constants/initial 个线性化值。
所以!问题是关于 MATLAB 命令 "lsim":
lsim (sys, u, t, x0)
在这种情况下,sys 是来自线性化状态 space 模型的 A、B、C、D 矩阵。 u 是信号向量,t 是时间向量。但是 x0....我可以说 x0 是 x10、x20、x30、....、xn0 吗?
我也可以说 u = u - u0 ,而 u0 是 , u10 u10, u20, u30,... , um0 吗?
示例:
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)
这将导致:
Δx = [x1 - 2; x2 + 2; x3 - 1]
Δu = [u1 + 0.2; u2 - 1.2; u3 - 3]
我说得对吗?
有一个现成的 Simulink S-Function dsfunc.m
,它是状态 Space 模型的仿真,可以很容易地适应包含的线性化状态 Space矩阵,每一步都在变化。
只需构建一个 simulink 文件 dsfunc.slx
并使用 sim 命令 sim('dsfunc')
命令 运行 它。
好的部分是 S-Function 可以正确处理状态,您每次只需调整状态 Space 模型,保持状态从一次迭代到另一次迭代。
你也可以用一个 for
循环同样轻松地做到这一点。如图所示包含线性化常数。
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];