归一化二阶系统的阶跃响应之matlab GUI+程序打包实现
归一化系统的二阶阶跃响应之matlab GUI+程序打包实现
- 设计程序效果展示
1.1.list选项:选择第一项效果展示
1.2.list选项:选择第二项效果展示
1.3.list选项:选择第三项效果展示
1.4.list选项:选择第四项效果展示 - 设计思想
为了研究归一化二阶系统G(s)中阻尼比对单位阶跃响应的影响,于是做了上述1中的效果界面来做可视化分析和展示。G(s)公式如下:其中s是时间,单位秒,另一个字母为阻尼比。
在matlab命令行中输入"guide"命令,然后再弹出的界面中选择"新建GUI",然后选择Blank GUI(Default)即可。按照1中的效果图在界面中依次拖选"轴Axes",“静态文本”,“可编辑文本"等即可。详细属性设置如下:
2.1.双击轴位框,在"属性检查器”,进行如下设置:
FontUnits和Units均设置为normalized;XLimNode和 YLimNode均设置为normalized。
2.2.静态文本组件设置:
FontUnits和Units均设置为normalized;String设置为"归一化二阶系统的阶跃响应"
2.3.面板设置:
FontUnits为points和Units为normalized;Title为"阻尼比zeta";TitlePosition为lefttop。
2.4.可编辑文本设置:
FontUnits和Units均设置为normalized。
2.5.滑动条Slider设置:
FontUnits和Units均设置为normalized;Min为0,Max为2;SliderStep中x为0.01,y为0.1;Value为0。
2.6.grid on设置:
FontUnits和Units均设置为normalized;String为Grid on;Tag为gridon;Value为0。
2.7.grid off设置:
FontUnits和Units均设置为normalized;String为Grid off;Tag为gridoff;Value为1。
2.8.ListBox设置:
FontUnits和Units均设置为normalized;Min为0,Max为2;String设置时,单击一下会弹出界面。分别输入不标特征点、上升时间点(0->0.95)、最大峰值点、镇定时间点(0.95,1.05),各占一行即可;Value为1.
最后画完图及设置好属性后,点击绘图中的"保存"按钮将文件保存成exm080201.fig即可,同时也会生成对应的代码。然后参看下面展示的代码来完成回调函数代码填充即可。 - 代码实现
为了兼顾读着学习和查阅代码,本文使用分割线#begin##和#end##标注出需要追加代码的部分方便读着理解和学习。
3.1.exm080201.m文件
%% exm080201.m
function varargout = exm080201(varargin)
% EXM080201 MATLAB code for exm080201.fig
% EXM080201, by itself, creates a new EXM080201 or raises the existing
% singleton*.
%
% H = EXM080201 returns the handle to a new EXM080201 or the handle to
% the existing singleton*.
%
% EXM080201('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in EXM080201.M with the given input arguments.
%
% EXM080201('Property','Value',...) creates a new EXM080201 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before exm080201_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to exm080201_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help exm080201
% Last Modified by GUIDE v2.5 02-Oct-2018 18:22:28
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @exm080201_OpeningFcn, ...
'gui_OutputFcn', @exm080201_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
%% 下面两个函数时界面启动子函数和输出子函数
% --- Executes just before exm080201 is made visible.
function exm080201_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to exm080201 (see VARARGIN)
% Choose default command line output for exm080201
%% ##############begin###############
zeta=0.3; %初始化阻尼比
set(handles.edit1,'String',num2str(zeta));
set(handles.slider1,'Value',zeta);
set(handles.gridon,'Value',0); %单选处于"非选"状态
set(handles.gridoff,'Value',1); %单选处于"选中"状态
set(handles.listbox1,'Value',1);
handles.t=0:0.05:15; %自定时间采样数组
handles.Color='Red'; %定义响应曲线的初始色彩
handles.zeta=zeta;
handles.flag=0; %初始绘图标志
handles=surfplot(handles);
handles.Color='Blue'; %定义响应曲线的非初始色彩
%% ##############end#################
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes exm080201 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = exm080201_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
%% 单选按钮 Grid on回调子函数
% --- Executes on button press in gridon.
function gridon_Callback(hObject, eventdata, handles)
% hObject handle to gridon (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of gridon
%% ##############begin###############
set(handles.gridoff,'Value',0)
grid on %画出网格线
%% ##############end#################
%% 单选按钮 Grid off回调子函数
% --- Executes on button press in gridoff.
function gridoff_Callback(hObject, eventdata, handles)
% hObject handle to gridoff (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of gridoff
%% ##############begin###############
set(handles.gridon,'Value',0)
grid off %画出网格线
%% ##############end#################
%% 列表框回调子函数
% --- Executes on selection change in listbox1.
function listbox1_Callback(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns listbox1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from listbox1
%% ##############begin#################
listindex=get(hObject,'Value'); %获得列表框所有选项的序号
if any(listindex==1) %使得第一项只能单独备选
set(handles.listbox1,'Value',1)
end
handles.flag=0; %列表框被触发时,发出重画曲面命令
handles=surfplot(handles);
handles.flag=1;
guidata(hObject, handles);
%% ##############end###################
% --- Executes during object creation, after setting all properties.
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: listbox controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%% 可编辑文本框回调子函数
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
%% ##############begin###############
sz=get(hObject,'String'); %从编辑文本框读取输入字符
zeta=str2double(sz); %将字符转成双精度
%handles.slider1直接看各个控件对象的Tag标签即可。
set(handles.slider1,'Value',zeta) %对话滑块的油表定位
handles.zeta=zeta; %"GUI数据"形式,保存数据以便共享
handles=surfplot(handles); %调用绘制子图函数,绘制响应曲线
guidata(hObject, handles);
%% ##############end#################
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%% 滑块回调子函数组
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
%% ##############begin###############
zeta=get(hObject,'Value'); %获得滑块的游标数值
set(handles.edit1,'String',num2str(zeta)) %将滑块游标数值填充到文本框中
handles.zeta=zeta; %更新阻尼系数
handles=surfplot(handles); %调用绘制子图函数,绘制响应曲线
guidata(hObject, handles);
%% ##############end#################
% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on key press with focus on listbox1 and none of its controls.
function listbox1_KeyPressFcn(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata structure with the following fields (see MATLAB.UI.CONTROL.UICONTROL)
% Key: name of the key that was pressed, in lower case
% Character: character interpretation of the key(s) that was pressed
% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed
% handles structure with handles and user data (see GUIDATA)
3.2.surfplot.m文件
%% surfplot.m
function handles=surfplot(handles)
%handles=surfplot(handles) %供启动子函数和个控件回调子函数调用的绘图函数
zeta=handles.zeta ;%仅为记述简单
t=handles.t;
listindex=get(handles.listbox1,'Value'); %读取列表框的选项序号数组
Nt=length(t);
if handles.flag==0 %仅在界面启动时执行
cla %清空截面上次工作后可能残留的轴上对象
zmin=get(handles.slider1,'Min'); %读取滑块的min
zmax=get(handles.slider1,'Max'); %读取滑块的max
zt=zmin:0.05:zmax; %为3维坐标"x轴"准备采样点
Nz=length(zt);
[ZT,T]=meshgrid(zt,t); %3位曲线的"X","Y"采样点阵
Y=zeros(Nt,Nz);
for k=1:Nz
Y(:,k)=step(tf(1,[1,2*zt(k),1]),t);
end
surface(ZT,T,Y) %用底层绘图命令,绘制曲线
shading flat
else
delete(handles.g1) %利用句柄,删除上次绘制的残留曲线
delete(handles.rline) %利用句柄,删除上次绘制的响应曲线
end
xz=ones(1,Nt)*zeta;
y1=ones(1,Nt)*1;
y=step(tf(1,[1,2*zeta,1]),t); %在指定的Zeta下,计算响应曲线
gz=[zeta,zeta,xz,zeta,zeta,xz]; %绿色封闭参考线的x坐标
gt=[t(1),t(1),t,t(end),t(end),fliplr(t)] %绿色封闭参考线的y坐标
gy=[0,1,y1,1,0,0*y1] %绿色封闭参考线的z坐标
handles.g1=line(gz,gt,gy,'Color','g','LineWidth',1); %绘制绿色参照线,并产生句柄
handles.rline=line(xz,t,y,'Color',handles.Color,'LineWidth',2) %绘制红色响应曲线,并产生句柄
K=length(get(handles.listbox1,'Value')); %列表框里,被"选中"的项数
for jj=1:K
switch listindex(jj)
case 1
;
case 2
k95=min(find(y>0.95));
k952=[(k95-1),k95];
t95=interp1(y(k952),t(k952),0.95); %线性插值法确定0.95线的时间
line(zeta,t95,0.95,'marker','+','markeredgecolor','r','markersize',15);
case 3 %画出最大峰值点
[ym,km]=max(y); %找最大峰值
if km<Nt&&(ym-1)>0
line(zeta,t(km),ym,'marker','*','markeredgecolor','k','markersize',15);
end
case 4 %画出镇定时刻点
ii=max(find(abs(y-1)>0.05));
if ii<Nt
line(zeta,t(ii+1),y(ii+1),'Color','r','Marker','o','MarkerSize',7)
end
end
end
xlabel('{\zeta}')
ylabel('t')
zlabel('y')
alpha(0.7)
view(75,44)
代码下载
百度网盘分享密码:wq5e
- matlab程序打包小技巧
进入到matlab主界面,点击"应用程序",选择"运用程序打包",选择主文件
“exm080201.m”,然后点选"刷新依存关系",填写自己的GUI软件说明
信息,最后点击"打包"即可生成新的软件程序。在当前文件路径下会产生两个文件:huawei.mlappinstall,huawei.prj。效果图见如下:
双击huawei.prj即可安装到本地matlab APPs中。