归一化二阶系统的阶跃响应之matlab GUI+程序打包实现

归一化系统的二阶阶跃响应之matlab GUI+程序打包实现

  1. 设计程序效果展示
    1.1.list选项:选择第一项效果展示
    选项1
    1.2.list选项:选择第二项效果展示
    选项2
    1.3.list选项:选择第三项效果展示
    选项3
    1.4.list选项:选择第四项效果展示
    选项4
  2. 设计思想
    为了研究归一化二阶系统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即可,同时也会生成对应的代码。然后参看下面展示的代码来完成回调函数代码填充即可。
  3. 代码实现
    为了兼顾读着学习和查阅代码,本文使用分割线#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

  1. matlab程序打包小技巧
    进入到matlab主界面,点击"应用程序",选择"运用程序打包",选择主文件
    “exm080201.m”,然后点选"刷新依存关系",填写自己的GUI软件说明
    信息,最后点击"打包"即可生成新的软件程序。在当前文件路径下会产生两个文件:huawei.mlappinstall,huawei.prj。效果图见如下:
    程序打包
    双击huawei.prj即可安装到本地matlab APPs中。

猜你喜欢

转载自blog.csdn.net/jp_zhou256/article/details/82928119