自动控制原理MATLAB笔记

164
0
2020年11月6日 09时17分

全文框架

 

在这里插入图片描述

 

1.函数笔记

 

tf():传递函数

sys = tf(Numerator,Denominator)
创建传递函数,numerator为分子向量,denominator为分母向量
后面可加参数,如:‘Variable’,‘p’,意思是把p作为变量
若要从传递函数中取得分子分母向量,可以用:num1=sys.num{1},不能用numden等函数,因为其不能用于tf结构体
另外,开闭环传递函数之间的转换,务必用feedback,若直接用公式Gs=Gk(s)/(1+Gk(s)H(s))会有错误

 

ss():状态空间方程
sys = ss(A,B,C,D)
A,B,C,D为状态空间方程的四个矩阵

 

ss2tf():状态空间方程转系统函数
[num,den] = ss2tf(A,B,C,D)
Num为分子,den为分母

 

dcgain():获取稳态值
dc=dcgain(sys)

 

feedback():反馈
sys = feedback(sys1,sys2)

 

在这里插入图片描述

 

rlocus(): 求根轨迹
rlocus(sys):绘制根轨迹图
r = rlocus(sys,k):指定增益,返回r为与k对应的根轨迹点
[r,k] = rlocus(sys):同上,但系统会自动选择根轨迹向量。

 

Sgrid():绘制等ξ,ω网格线
sgrid(z,wn)z为阻尼比,wn为无阻尼自然频率

 

rlocfind():求根轨迹上指定点
[k,p]=rlocfind(sys)
K为增益,p为极点坐标,需要用鼠标点击根轨迹上相应的点。同时也会返回被选极点的开环增益K和与之对应的所有其他闭环极点的值

 

Zp2tf():零极点转化为传递函数
[b,a] = zp2tf(z,p,k)
输入零极点向量和增益,输出传递函数的分子分母向量:

 

在这里插入图片描述

 

 

Pzmap():求零极点分布
pzmap(sys):在坐标轴上标出零极点
[p,z] = pzmap(sys):返回系统sys的零点向量z和极点向量p

 

bode(): 绘制bode图
bode(sys):显示系统sys的bode图
[mag,phase,wout] = bode(sys):返回幅值,相位以及对应的角频率w

 

nyquist():绘制极坐标图
nyquist(sys):显示系统的奈奎斯特图

 

2.GUI笔记

 

2.1控件

1.静态文本(Static Text) 2.编辑框(Edit Text)控件
3.列表框(Listbox)控件 4.滚动条(Slider)控件
5.按钮(Push Button)控件 6.开关按钮(Toggle Button)控件
7.单选按钮(Radio Button)控件 8.按钮组(Button Group)控件
9.检查框(Check Box)控件 10.列表框(Listbox)控件
11.弹出式菜单(Popup Menu)控件 12.坐标轴(Axes)控件
13.面板(Panel)控件

 

每一个控件都有自己的属性常规属性有:
控件风格和外观

(1)BackgroundColor:设置控件背景颜色,使用[R G B]或颜色定义。
(2)CData:在控件上显示的真彩色图像,使用矩阵表示。
(3)ForegroundColor:文本颜色。
(4)String属性:控件上的文本,以及列表框和弹出菜单的选项。
(5)Visible:控件是否可见。

 

对象的常规信息

(1)Enable属性: 表示此控件的使能状态,设置为on”,表示可选,为“off”时则表示不可选。
(2)Style:控件对象类型。
(3)Tag:控件表示(用户定义)。
(4)TooltipString属性:提示信息显示。当鼠标指针位于此控件上时,显示提示信息。
(5)UserData:用户指定数据。
(6)Position:控件对象的尺寸和位置。
(7)Units:设置控件的位置及大小的单位
(8)有关字体的属性,如 FontAngle, FontName等。

 

控件回调函数的执行

(1)BusyAction:处理回调函数的中断。有两种选项:即Cancel:取消中断事件,queue:排队(默认设置)。
(2)ButtonDownFcn属性:按钮按下时的处理函数。
(3)CallBack属性:是连接程序界面整个程序系统的实质性功能的纽带。该属性值应该为一个可以直接求值的字符串,在该对象被选中和改变时,系统将自动地对字符串进行求值。
(4)CreateFcn:在对象产生过程中执行的回调函数。
(5)DeleteFcn:删除对象过程中执行的回调函数。
(6)Interruptible属性:指定当前的回调函数在执行时是否允许中断,去执行其他的函数。

 

控件当前状态信息

(1)ListboxTop:在列表框中显示的最顶层的字符串的索引。
(2)Max:最大值。
(3)Min:最小值。
(4)Value:控件的当前值。你可以使用属性编辑器来设置属性

 

2.2 回调函数 :CallBack

 

每个控件都有几种回调函数,右键选中的控件一般会有如下菜单:
然后就可以跳转到相应的 Editor中编辑代码,GUIDE会自动生成 相应的函数体,函数名,名称一般是 控件 Tag+ Call类型名 参数有三个 ( hObject, eventdata, handles)

其中 hObject 为发生事件的源控件,eventdata为事件数据结构,handles为传入的对象句柄
CreateFcn 是在控件对象创建的时候发生(一般为初始化样式,颜色,初始值等)
DeleteFcn 实在空间对象被清除的时候发生
ButtonDownFcn和KeyPressFcn分别为鼠标点击和按键事件Callback
CallBack为一般回调函数,因不同的控件而已异。例如按钮被按下时发生,下拉框改变值时发生,sliderbar 拖动时发生等等。

 

2.3 绘图

 

1.figure函数:创建一个新的图形对象。
2.newplot函数:做好开始画新图形对象的准备。
3.axes函数:创建坐标轴图形对象。
4.line函数:画线。
5.patch函数:填充多边形。
6.surface函数:绘制三维曲面。
7.image函数:显示图片对象。
8.uicontrol函数:生成用户控制图形对象。
9.uimenu函数:生成图形窗口的菜单中层次菜单与下一级子菜单。

 

几个实用的小函数:

uigetfile 选择文件对话框
uiputfile 保存文件对话框
uisetcolor 设置颜色对话框
fontsetcolor 设置字体对话框
msgbox 消息框
warndlg 警告框
helpdlg 消息框

 

打开新窗口首先创建一个计算窗口界面test2.flg,和父窗口放在同一个文件夹下
在.m文件中的计算按钮函数里添加语句:
open(‘test2.fig’)
h = guihandles;%为新定义的窗口设置句柄变量h
set(h.text,‘string’,结果变量名)%text为输出控件名
不过如果要让父窗口不可用,你需要使用uiwait来定焦于用户对话框。
例如:
h=helpdlg(‘Please press me!’,‘Attention’);
uiwait(h);

 

在某一坐标轴上作图
h=guihandles;
axes(h.axes1);
plot(y);

 

注意,每次在旧的坐标轴上画新图的时候,务必清除坐标轴,否则会显示找不到axes

 

2.4 获取与设置对象属性

 

常用函数:

gcf函数:获得当前图形窗口的句柄
gca函数:获得当前坐标轴的句柄
gco函数:获得当前对象的句柄
gcbo函数:获得当前正在执行调用的对象的句柄
gcbf函数:获取包括正在执行调用的对象的图形句柄
delete函数:删除句柄所对应的图形对象
findobj函数:查找具有某种属性的图形对象

 

设置方法:

(1)get函数返回某些对象属性的当前值。例如:
p=get(obj,‘Position’);
(2)函数set改变句柄图形对象属性,例如:
set(obj,‘Position’,vect);

 

2.5 部分函数笔记

 

部分字符串处理函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

v = get(h,propertyName)
h. v is a structure whose field names are the property names
propertyName, returns the value for the specific property, eg: ‘Color’ ‘LineWidth’ ‘string’…
set(H,Name,Value)
specifies a value for the property Name on the object identified by H.

 

字符串类型:Char 和 String

假如str为char,则可用str(1),str(2)等来求字符串元素,下标从0开始。String同理。

从一串带空格的字符串里分离出数字:(如输入 12 23 45)

 

 t='';
    str1=get(handles.edit1,'String');
    n=length(str1);
    j=1;
    num=strings;%字符串数组
    for i=1:n
        if(str1(i)~=' ')
            t=strcat(t,str1(i));
        else
            num(j)=t;
            j=j+1;
            t='';
        end
    end

 

从输入框里获取矩阵:

 

matrix=str2num(get(handles.edit,'string'));

3.GUI程序

 

3.1求单位阶跃响应及稳态误差

 

一、题目及要求:

1、由用户输入被控系统的模型(含传递函数模型和状态空间模型);
2、根据闭环系统单位阶跃响应计算系统的超调量、峰值时间和调整时间,并输出显示计算结果;
3、计算闭环系统的稳态误差并输出显示计算结果;
4、输出并显示闭环系统的单位阶跃响应曲线。

 

二、运行结果

 

输入开环传递函数:

 

输入系统函数

 

输出

 

 

输入状态空间模型:

 

在这里插入图片描述

 

在这里插入图片描述

 

三、代码

 

求开环函数性能的代码:

 

function pushbutton1_Callback(hObject, eventdata, handles)

t='';
h1=guihandles;
str1=get(h1.edit1,'String');
str2=get(h1.edit2,'String');
n=length(str1);
m=length(str2);
j=1;

num=[];%分子
den=[];%分母
for i=1:n
    if(str1(i)~=' ')
        t=strcat(t,str1(i));
    else
        num(j)=str2double(t);
        j=j+1;
        t='';
    end
    if(i==n)
      num(j)=str2double(t);  
    end
end
t='';
j=1;
for i=1:m
    if(str2(i)~=' ')
        t=strcat(t,str2(i));
    else
        den(j)=str2double(t);
        j=j+1;
        t='';
    end
    if(i==m)
      den(j)=str2double(t);  
    end
end


GkS=tf(num,den)%开环函数
GS=GkS/(1+GkS)%闭环函数,默认单位反馈
[y1 t]=step(GS);%单位阶跃响应

mp=max(y1);
%峰值时间
tp=find(y1==mp)
cs=length(t);
%稳态值
yss=y1(cs)
%超调量
ct=(mp - yss)/yss
%调整时间
s=cs;
while y1(s)>0.98*yss&y1(s)<1.02*yss
    s=s-1;
end;
ts=s

open('output.fig');
h2=guihandles;
set(h2.edit1,'string',string(ct));
set(h2.edit2,'string',string(tp));
set(h2.edit3,'string',string(cs));
plot(h2.axes1,y1);title('单位阶跃响应');xlabel('t/s');ylabel('y(t)');

%稳态误差
I=0;%系统类型
K_p=dcgain(GkS);
num1=num;
num1(length(num)+1)=0;
sGkS=tf(num1,den);
K_v=dcgain(sGkS);
num2=num1;
num2(length(num1)+1)=0;
s2GkS=tf(num2,den);
K_a=dcgain(s2GkS);
if(K_p~=0&&K_p~=inf)
    I=0;
    e_sr=1/(1+K_p);%单位阶跃输入时
elseif(K_v~=0&&K_v~=inf)
        I=1;
        e_sr=1/K_v;
elseif(K_a~=0&&K_a~=inf)
            I=2;
            e_sr=1/K_a;
else  
     
end
 set(h2.edit4,'string',string(I));
 set(h2.edit5,'string',string(e_sr));

 

状态空间模型输入:

 

h1=guihandles;
A=str2num(get(h1.edit3,'string'));
B=str2num(get(h1.edit4,'string'));
C=str2num(get(h1.edit6,'string'));
D=str2num(get(h1.edit5,'string'));
[num den]=ss2tf(A,B,C,D);

GkS=tf(num,den)%系统函数
%%%%%%%%%%%%%%后面省略,因转化为系统函数了,后面操作和上面程序相同

3.2根轨迹综合

 

一、题目及要求:

 

在这里插入图片描述

 

二、运行结果

 

主界面,输入开环传递函数与根轨迹综合指标

 

在这里插入图片描述

 

显示单位阶跃响应

 

在这里插入图片描述

 

输入性能指标,进入综合界面

 

在这里插入图片描述

 

超前校正

 

在这里插入图片描述

 

迟后校正

 

在这里插入图片描述

 

校正后阶跃响应

 

在这里插入图片描述

 

三、代码

 

显示单位阶跃响应代码:

 

function pushbutton1_Callback(hObject, eventdata, handles)

global h1;
h1=guihandles;
t='';
str1=get(h1.edit1,'String');
str2=get(h1.edit2,'String');
n=length(str1);
m=length(str2);
j=1;

num=[];%分子
den=[];%分母
for i=1:n
    if(str1(i)~=' ')
        t=strcat(t,str1(i));
    else
        num(j)=str2double(t);
        j=j+1;
        t='';
    end
    if(i==n)
      num(j)=str2double(t);  
    end
end
t='';
j=1;
for i=1:m
    if(str2(i)~=' ')
        t=strcat(t,str2(i));
    else
        den(j)=str2double(t);
        j=j+1;
        t='';
    end
    if(i==m)
      den(j)=str2double(t);  
    end
end

global GkS GkS_original;
GkS=tf(num,den)%开环函数
GkS_original=GkS;
GS=feedback(GkS,1)%闭环函数,默认单位反馈
[y1 t]=step(GS);%单位阶跃响应


open('output.fig');
h2=guihandles;
plot(h2.axes1,t,y1);title('单位阶跃响应');xlabel('t/s');ylabel('y(t)');

mp=max(y1);
%峰值时间
tp=t(find(y1==mp));%注意:step返回的t为时间序列,但间隔并不为1s,find只是找到时间序列中的位置,并非时间本身
% cs=length(t);%此算法错误,t序列长度并非t本身
% yss=y1(cs)%稳态值
y_dc=dcgain(GS);
%超调量
ct=(mp - y_dc)/y_dc;
ct=ct*100;
%调整时间
i=length(t);
while y1(i)>0.95*y_dc&y1(i)<1.05*y_dc
    i=i-1;
end;
ts=t(i);

set(h2.edit1,'string',string(ct));
set(h2.edit2,'string',string(tp));
set(h2.edit3,'string',string(ts));

%稳态误差
I=0;%系统类型
K_p=dcgain(GkS);
num1=num;
num1(length(num)+1)=0;
sGkS=tf(num1,den);
K_v=dcgain(sGkS);
num2=num1;
num2(length(num1)+1)=0;
s2GkS=tf(num2,den);
K_a=dcgain(s2GkS);
if(K_p~=0&&K_p~=inf)
    I=0;
    e_sr=1/(1+K_p);%单位阶跃输入时
elseif(K_v~=0&&K_v~=inf)
        I=1;
        e_sr=1/K_v;
elseif(K_a~=0&&K_a~=inf)
            I=2;
            e_sr=1/K_a;
else  
     
end
 set(h2.edit4,'string',string(I));
 set(h2.edit5,'string',string(e_sr));

 

显示根轨迹图的代码

 

function pushbutton4_Callback(hObject, eventdata, handles)

h1=guihandles;
global GkS GkS_original p z p1 p2;

k_need=str2num(get(h1.edit7,'String'));
sigma_need=str2num(get(h1.edit8,'String'));
kesai_need=log(1/sigma_need)/(pi^2+(log(1/sigma_need))^2)^0.5;
kesai_need=kesai_need+0.15;%留裕量
ts_need=str2num(get(h1.edit9,'String'));
wn_need=3/(kesai_need*ts_need);
wn_need=wn_need+0.5;%留裕量

p1=-kesai_need*wn_need+i*wn_need*(1-kesai_need^2)^0.5;
p2=-kesai_need*wn_need-i*wn_need*(1-kesai_need^2)^0.5;%主导极点

global Gc_d Gc_i;
Gc_d=1;%控制器初始化
Gc_i=1;
GkS=GkS_original;

open('rlocus1.fig');
h3=guihandles;
set(h3.edit13,'string',string(k_need));
axes(h3.axes1);
plot(p1,'square','LineWidth',2,'MarkerEdgeColor','r');hold on
plot(p2,'square','LineWidth',2,'MarkerEdgeColor','r');hold on;%主导极点设为红色
[p,z]=pzmap(GkS);
rlocus(GkS);
sgrid(0.707,10);

 

在根轨迹图上显示点的详细信息

 

function pushbutton1_Callback(hObject, eventdata, handles)

global GkS;
close (figure(1));
h3=guihandles;

[k,p]=rlocfind(GkS);

set(h3.edit1,'string',string(k));
set(h3.edit2,'string',string(p(1)));
set(h3.edit7,'string',string(p(2)));
GkS_2=k*GkS;
GS=feedback(GkS_2,1);%闭环函数,默认单位反馈
[y1 t]=step(GS);%单位阶跃响应
figure(1)
plot(t,y1);title('单位阶跃响应');xlabel('t/s');ylabel('y(t)');
mp=max(y1);
%稳态值
y_dc=dcgain(GS);
if(abs(y_dc-mp)>0.01)%判断是否为过阻尼状态
%峰值时间
tp=t(find(y1==mp));
%超调量
ct=(mp - y_dc)/y_dc;
ct=ct*100;
else
    tp=0;
    ct=0;
end

%调整时间
i=length(t);
while y1(i)>0.95*y_dc&y1(i)<1.05*y_dc
    i=i-1;
end;
ts=t(i);


set(h3.edit3,'string',string(ct));
set(h3.edit4,'string',string(ts));
set(h3.edit5,'string',string(tp));
%稳态误差
I=0;%系统类型
K_p=dcgain(GkS_2);
num1=GkS_2.num{1};
den=GkS_2.den{1};
num1(length(num1)+1)=0;
sGkS=tf(num1,den);
K_v=dcgain(sGkS);
num2=num1;
num2(length(num1)+1)=0;
s2GkS=tf(num2,den);
K_a=dcgain(s2GkS);
if(K_p~=0&&K_p~=inf)
    Kout=K_p;
    I=0;
    e_sr=1/(1+K_p);%单位阶跃输入时
elseif(K_v~=0&&K_v~=inf)
        Kout=K_v;
        I=1;
        e_sr=1/K_v;
elseif(K_a~=0&&K_a~=inf)
            Kout=K_a;
            I=2;
            e_sr=1/K_a;
else  
     
end
 set(h3.edit8,'string',string(I));
 set(h3.edit17,'string',string(K_p));
 set(h3.edit15,'string',string(K_v));
 set(h3.edit16,'string',string(K_a));
 set(h3.edit6,'string',string(e_sr));
 set(h3.edit14,'string',string(Kout));

 

超前校正代码

 

function pushbutton2_Callback(hObject, eventdata, handles)

h3=guihandles;
global p1 p2 Gc_d GkS GkS_original Gc_i;
pd=str2num(get(h3.edit10,'String'));
zd=str2num(get(h3.edit9,'String'));
Gc_d=tf([1 -zd],[1 -pd]);
GkS=GkS_original*Gc_d*Gc_i;

%%%%%%%%%%%%%%%%%%%%%%%%%%%不可取,因为只是通过零极点得到的开环传递函数,不是串联校正
%global p z
% p_1=p;
% length_p=length(p);
% p_1(length_p+1)=pd;
% z_1=z;
% length_z=length(z);
% z_1(length_z+1)=zd;
% [num,den]=zp2tf(z_1,p_1,1);
% GkS_d=tf(num,den);

cla
plot(p1,'square','LineWidth',2,'MarkerEdgeColor','r');hold on
plot(p2,'square','LineWidth',2,'MarkerEdgeColor','r');hold on
rlocus(GkS);

 

超前校正中:幅角条件算法

 

function edit9_Callback(hObject, eventdata, handles)
global z p p1;
h3=guihandles;
zd=str2num(get(h3.edit9,'String'));
%%%%%%%%%%%通过幅角条件算极点位置
angle_p=0;
angle_z=0;
for i=1:length(p)
    angle_p=angle_p+rad2deg(angle(p1-p(i)));
end
for i=1:length(z)
    angle_z=angle_z+rad2deg(angle(p1-z(i)));
end
angle_z=angle_z+rad2deg(angle(p1-zd));%超前控制零点的幅角
% angle_p=angle_p+rad2deg(angle(p1-pd));

angle_zd=angle_z-angle_p+180;
if(angle_zd>3&&angle_zd<90)
x_zd=real(p1)-imag(p1)/tan(deg2rad(angle_zd));
set(h3.edit18,'string',string(x_zd));
else
    set(h3.edit18,'string',string('ERROR'));
end

 

迟后校正代码

 

function pushbutton3_Callback(hObject, eventdata, handles)

h3=guihandles;
global p1 p2 Gc_d Gc_i GkS GkS_original Kout;
pi=str2num(get(h3.edit12,'String'));
zi=str2num(get(h3.edit11,'String'));
Gc_i=tf([1 -zi],[1 -pi]);
GkS=GkS_original*Gc_d*Gc_i;
cla
plot(p1,'square','LineWidth',2,'MarkerEdgeColor','r');hold on
plot(p2,'square','LineWidth',2,'MarkerEdgeColor','r');hold on
rlocus(GkS);

 

迟后校正:求偶极子

 

function edit11_Callback(hObject, eventdata, handles)
global k_need Kout;
h3=guihandles;
zi=str2num(get(h3.edit11,'String'));
ratio=k_need./Kout;
pi=zi/ratio;
if(pi<0)
set(h3.edit19,'string',string(pi));
else
    set(h3.edit19,'string',string('ERROR'));
end

 

3.3频率响应综合

 

一、题目及要求:

 

在这里插入图片描述

 

二、运行结果

 

输入开环传递函数

 

自动控制原理MATLAB笔记插图(23)

 

未综合系统的单位阶跃响应

 

在这里插入图片描述

 

输入稳态和暂态指标

 

在这里插入图片描述

 

输入参数显示bode图

 

在这里插入图片描述

 

调整后系统的单位阶跃响应

 

在这里插入图片描述

 

三、代码

 

计算相位裕量,频带宽度以及显示bode图

 

function pushbutton6_Callback(hObject, eventdata, handles)
global GkS k_need sigma_need ts_need phym;
h1=guihandles;
k_need=str2num(get(h1.edit7,'String'));
sigma_need=str2num(get(h1.edit8,'String'));
ts_need=str2num(get(h1.edit9,'String'));
kesai_need=log(1/sigma_need)/(pi^2+(log(1/sigma_need))^2)^0.5;
wn_need=3/(kesai_need*ts_need);
%%%求相位裕量
r = atan(2*kesai_need/(sqrt(sqrt(1+kesai_need^4)-2*kesai_need*kesai_need)));
phym=rad2deg(r);
%求频带宽度
wbw = wn_need*sqrt((1-2*kesai_need*kesai_need)+sqrt(4*kesai_need^4-4*kesai_need^2+2)); 
open('frequency.fig');
h4=guihandles;
axes(h4.axes2);
GS=feedback(GkS,1);
bode(GkS);grid;
set(h4.edit3,'string',string(k_need));
set(h4.edit2,'string',string(phym));
set(h4.edit1,'string',string(wbw));

 

超前滞后补偿器的计算

 

function pushbutton3_Callback(hObject, eventdata, handles)
global GkS GkS_original phym Gc Gd;
h4=guihandles;
wc=str2num(get(h4.edit12,'string'));%幅穿频率
x=str2num(get(h4.edit13,'string'));%安全裕量
[ mag,phase ] = bode( GkS,wc );%在幅穿频率处的相位
phase = phase +180;
phy = deg2rad( phym - phase + x ); %超前补偿器需要提供的超前相位,角度转换为弧度制
B = ( 1-sin( phy ))/( 1+sin( phy ) ); % β
T1 = 1/(wc*sqrt( B )); %超前补偿器低段转折频率
Gc = tf( 1,B )*tf( [1,1/T1],[ 1,1/(B*T1) ] ); %超前补偿器传递函数

w2 = wc/10; %滞后补偿器高段转折频率
Gd = tf( B,1 )*tf( [1,w2],[ 1,B*w2 ] ); %滞后补偿器传递函数
GkS = GkS*Gd*Gc; %超前-滞后综合
cla
bode(GkS);grid;

 

增益补偿

 

function pushbutton1_Callback(hObject, eventdata, handles)

global GkS I K_p K_v K_a k_need GkS_original;
h4=guihandles;
if(I==0)
    K=K_p;
elseif(I==1)
    K=K_v;
elseif(I==2)
    K=K_a;
else
end
k_need=str2num(get(h4.edit3,'string'));
k_add=k_need/K;
GkS=tf(k_add,1)*GkS;
cla
bode(GkS);grid;

 

显示单位阶跃响应,bode图参数以及补偿器参数

 

function pushbutton2_Callback(hObject, eventdata, handles)

global GkS;
h4=guihandles;
GS=feedback(GkS,1)%闭环函数,默认单位反馈
[y1 t]=step(GS);%单位阶跃响应

open('output.fig');
h2=guihandles;
plot(h2.axes1,t,y1);title('单位阶跃响应');xlabel('t/s');ylabel('y(t)');
%%%%%%%%%%%%%判断系统稳定性
[p z]=pzmap(GS);
for i=1:length(p)
    if(p(i)>0)
        warndlg('系统不稳定','ERROR');
        return
    end
end
mp=max(y1);
%峰值时间
tp=t(find(y1==mp));%注意:step返回的t为时间序列,但间隔并不为1s,find只是找到时间序列中的位置,并非时间本身
y_dc=dcgain(GS);
if(abs(y_dc-mp)>0.01)%判断是否为过阻尼状态
%峰值时间
tp=t(find(y1==mp));
%超调量
ct=(mp - y_dc)/y_dc;
ct=ct*100;
else
    tp=0;
    ct=0;
end
%调整时间
i=length(t);
while y1(i)>0.95*y_dc&y1(i)<1.05*y_dc
    i=i-1;
end;
ts=t(i);

set(h2.edit1,'string',string(ct));
set(h2.edit2,'string',string(tp));
set(h2.edit3,'string',string(ts));

%稳态误差
I=0;%系统类型
K_p=dcgain(GkS);
num=GkS.num{1,1};%求GkS的分子和分母
den=GkS.den{1,1};
num1=num;
num1(length(num)+1)=0;
sGkS=tf(num1,den);
K_v=dcgain(sGkS);
num2=num1;
num2(length(num1)+1)=0;
s2GkS=tf(num2,den);
K_a=dcgain(s2GkS);
if(K_p~=0&&K_p~=inf)
    I=0;
    kk=K_p;
    e_sr=1/(1+K_p);%单位阶跃输入时
elseif(K_v~=0&&K_v~=inf)
        I=1;
        kk=K_v;
        e_sr=1/K_v;
elseif(K_a~=0&&K_a~=inf)
            I=2;
            kk=K_a;
            e_sr=1/K_a;
else  
     
end
 set(h2.edit4,'string',string(I));
 set(h2.edit5,'string',string(e_sr));
set(h4.edit4,'string',string(kk));
set(h4.edit6,'string',string(ct));
set(h4.edit7,'string',string(ts));
[gm,pm,wg,wc]=margin(GkS);
set(h4.edit8,'string',string(pm));
set(h4.edit9,'string',string(gm));
set(h4.edit10,'string',string(wc));
set(h4.edit11,'string',string(wg));

global Gc Gd;
num1=round(Gc.num{1,1},3);
set(h4.edit14,'string',sprintf('%g  ',num1));
den1=round(Gc.den{1,1},3);
set(h4.edit15,'string',sprintf('%g  ',den1));
num2=round(Gd.num{1,1},3);
set(h4.edit16,'string',sprintf('%g  ',num2));
den2=round(Gd.den{1,1},3);
set(h4.edit17,'string',sprintf('%g  ',den2));

 

3.4极点配置

 

一、题目及要求:

 

在这里插入图片描述

二、运行结果

 

输入状态空间模型

 

在这里插入图片描述

 

显示单位阶跃响应

 

在这里插入图片描述

 

输入配置极点

 

在这里插入图片描述

 

配置极点后的单位阶跃响应

 

在这里插入图片描述

 

三、代码

 

显示状态反馈向量:(要求不能用place函数,这里用Ackermann公式求解)

 

function edit18_Callback(hObject, eventdata, handles)
global A B A_SF;
h1=guihandles;
lambda=str2num(get(h1.edit18,'string'));
lambda_need=charpoly(diag(lambda));
% n=rank(A);%A有可能不满秩,最好用length
n=length(A);
if(rank(ctrb(A,B))~=length(A))
    warndlg('ERROR','系统不完全能控');
    return
end
Q_c=ctrb(A,B);
Q_ct=inv(Q_c);
q_t=Q_ct(n,:);
k=eye(n)*lambda_need(n+1);
 for i=1:n
 k=k+A^i*lambda_need(n+1-i);
 end
 k=q_t*k;
 k=round(k,3);
 A_SF=A-B*k;
set(h1.edit19,'string',sprintf('%g  ',k));

 

总结

 

通过matlab编程,对自动控制原理有了更深刻的了解,也锻炼了编程能力。
继续加油。

发表评论

后才能评论