MATLAB命令lsim是否适用于线性化状态空间模型?

时间:2017-05-14 18:17:41

标签: matlab state space linearization

状态空间模型在表单上:     dx = Ax + Bu     y = Cx + Du

线性化的非线性状态空间模型就是这种形式:

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是线性化的常数/初始值。

原来如此!问题是关于MATLAB命令“lsim”:

lsim (sys, u, t, x0)

在这种情况下,sys是来自线性化状态空间模型的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]

我是对的吗?

1 个答案:

答案 0 :(得分:0)

有一个随时可用的Simulink S-Function dsfunc.m,它是状态空间模型的模拟,可以很容易地适应包含的线性化状态空间矩阵,每个时间步都会改变。

只需构建一个simulink文件dsfunc.slx并使用sim命令sim('dsfunc')命令运行它。

好的部分是S-Function正确处理状态,你只需每次调整状态空间模型,使状态从一次迭代到另一次迭代。

您也可以使用单个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];

enter image description here