控制系统仿真技术(二)-连续系统的数字仿真二

太原理工大学控制系统仿真技术实验报告
连续系统的数字仿真
1.分别利用欧拉法和预估-校正法求下图所示系统的阶跃响应,并对其结果进行比较。
在这里插入图片描述

%欧拉法求阶跃响应
r=2;num0=8;den0=[1 3 0];
num1=1;den1=1;
[num,den]=feedback(num0,den0,num1,den1);
[A,B,C,D]=tf2ss(num,den);
Tf=input('仿真时间Tf=');h=input('计算步长h=');
x=[zeros(length(A),1)];y=0;t=0;
for i=1:Tf/h
    x=x+h*(A*x+B*r);
    y=[y;C*x];t=[t;t(i)+h];
end
plot(t,y);
%预估-校正法求阶跃响应
r=2;num0=8;den0=[1 3 0];
num1=1;den1=1;
[num,den]=feedback(num0,den0,num1,den1);
[A,B,C,D]=tf2ss(num,den);
Tf=input('仿真时间Tf=');h=input('计算步长h=');
x=[zeros(length(A),1)];y=0;t=0;
for i=1:Tf/h
    x1=x+h*(A*x+B*r);
    x=x+h*((A*x+B*r)+(A*x1+B*r))/2;
    y=[y;C*x];t=[t;t(i)+h];
end
plot(t,y);
%四阶龙格库塔法求阶跃响应
r=2;num0=8;den0=[1 3 0];
num1=1;den1=1;
[num,den]=feedback(num0,den0,num1,den1);
[A,B,C,D]=tf2ss(num,den);
Tf=input('仿真时间Tf=');h=input('计算步长h=');
x=[zeros(length(A),1)];y=0;t=0;
for i=1:Tf/h
    K1=A*x+B*r;
    K2=A*(x+h*K1/2)+B*r;
    K3=A*(x+h*K2/2)+B*r;
    K4=A*(x+h*K3)+B*r;
    x=x+h*(K1+2*K2+2*K3+K4)/6;
    y=[y;C*x];t=[t;t(i)+h];
end
plot(t,y);

在这里插入图片描述
2. 假设某一系统由四个典型环节组成,如下图所示:
在这里插入图片描述分别用四阶龙格-库塔法和离散相似法求输出量 y 的动态响应曲线。
程序代码:(四阶—龙格库达法)

%针对系统结构图的四阶-龙格库塔法
r=10;P=[0.1  1 0.5 1;0 1 1 0;2 1 2 0;10 1 10 0];
W=[0 0 0 -1;1 0 0 0;0 1 0 0;0 0 1 0];
W0=[1;0;0;0];Wc=[0 0 0 1];
Tf=input('仿真时间Tf=');h=input('计算步长h=');
A1=diag(P(:,1));B1=diag(P(:,2));C1=diag(P(:,3));D1=diag(P(:,4));
H=B1-D1*W;Q=C1*W-A1;
A=inv(H)*Q;B=inv(H)*C1*W0;
x=[zeros(length(A),1)];y=[zeros(length(Wc(:,1)),1)];
 t=0;
 for i=1:Tf/h
     K1=A*x+B*r;
     K2=A*(x+h*K1/2)+B*r;
     K3=A*(x+h+K2/2)+B*r;
     K4=A*(x+h*K3)+B*r;
     x=x+h*(K1+2*K2+2*K3+K4)/6;
     y=[y;Wc*x];t=[t;t(i)+h];
 end
 plot(t,y);

(离散相似法)
即将下题目3中的P修改为
[0.1 1 0.5 1 0 0;0 1 1 0 0 0;2 1 2 0 0 0;10 1 10 0 0 0]

3.已知非线性系统如下图所示,试利用连续系统按环节离散化的数字仿真方法求 输出量 y 的动态响应,并与无非线性环节情况进行比较。

%ex2_23.m
%1前有饱和,2前有死区,3前有滞环,4是前有继电器,5后有饱和
%6后有死区,7后有滞环,8后有继电器
%注意P为从低到高
clear;
R=10;
P=[0.1 1 0.5 1 5 5;0 1 1 0 1 5;2 1 2 0 0 0;10 1 10 0 0 0];
W=[0 0 0 -1;1 0 0 0;0 1 0 0;0 0 1 0];
W0=[1;0;0;0];Wc=[0 0 0 1];
Tf=input('仿真时间Tf=');T=input('计算步长h=');
A=P(:,1);B=P(:,2);C=P(:,3);D=P(:,4);FZ=P(:,5);S=P(:,6);
n=length(A);
for i=1:n
    if(A(i)~=0)
        if(B(i)==0)
            E(i)=0;F(i)=0;G(i)=0;H(i)=0;
            L(i)=(C(i)+D(i)/T)/A(i);Q(i)=-D(i)/(A(i)*T);
        else
            E(i)=exp(-A(i)*T/B(i));
            F(i)=(D(i)/B(i)-C(i)/A(i))*((1-E(i))*B(i)/(A(i)*T)-1);
            G(i)=(D(i)/B(i)-C(i)/A(i))*(1+(E(i)-1)*(1+B(i)/(A(i)*T)));
            H(i)=1;L(i)=D(i)/B(i);Q(i)=0;
        end
    else
        if(B(i)~=0)
            E(i)=1;F(i)=0.5*C(i)*T/B(i);G(i)=F(i);
            H(i)=1;L(i)=D(i)/B(i);Q(i)=0;
        else
            disp('A(i)=B(i)=0');
        end
    end
end
x=[zeros(length(A),1)];x0=x;z=x;
u=[zeros(length(A),1)];u0=u;
y=[zeros(length(Wc(:,1)),1)];t=0;
for j=1:Tf/T
    u1=u;u=W*x+W0*R;
    for i=1:n
        if(FZ(i)~=0)
            if(FZ(i)==1) 
                u(i)=saturation1(u(i),S(i));
            end
            if(FZ(i)==2) 
                u(i)=deadzone1(u(i),S(i));
            end
            if(FZ(i)==3)
                [u(i),u0(i)]=backlash1(u0(i),u(i),u1(i),S(i));
            end
            if(FZ(i)==4)
                u(i)=sign1(u(i),S(i));
            end
        end
    end
   x1=x;
   for i=1:n
       z(i)=E(i)*z(i)+F(i)*u(i)+G(i)*u1(i);
       x(i)=H(i)*z(i)+L(i)*u(i)+Q(i)*u1(i);
   end
    for i=1:n
        if(FZ(i)~=0)
            if(FZ(i)==5)
                x(i)=saturation1(x(i),S(i));
            end
            if(FZ(i)==6)
                x(i)=deadzone1(x(i),S(i));
            end
            if(FZ(i)==7)
                [x(i),x0(i)]=backlash1(x0(i),x(i),x1(i),S(i));
            end
            if(FZ(i)==8)
                x(i)=sign1(x(i),S(i));
            end
        end
    end
    y=[y;Wc*x];t=[t;t(j)+T];
end
plot(t,y)

注意这个程序里面还嵌套着saturation1,deadzone1,backlash1,sign1函数,所以还需要再相应创建这些函数

%饱和非线性
%saturation1.m
function x = saturation1(u,s)
if(abs(u)>=s)
    if(u>0) 
        x=s;
    else
        x=-s;
    end
else
    x=u;
end
%死区非线性
%deadzone1.m
function x = deadzone1(u,s)
if(abs(u)>=s)
    if(u>0)
        x=u-s;
    else
        x=u+s;
    end
else
    x=0;
end
%滞环非线性
%backlash1.m
function x = backlash1(u1,u,x1,s)
if(u>u1)
    if((u-s)>=x1)
        x=u-s;
    else
        x=x1;
    end
else if(u<u1)
        if((u+s)<=x1)
            x=u+s;
        else
            x=x1;
        end
    else
        x=x1;
    end
end
u1=u;
%继电器非线性
%sign1.m
function x = sign1(u,s)
if(u>0)
    x=s;
end
if(u<0)
    x=-s;
end
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿健也会编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值