今天没什么事干,折腾折腾MATLAB,北航的《MATLAB与控制系统仿真实践》这本书不错,建议一看。
先放张图
通过GUI界面进行编辑的,进入GUI的方法有很多种,可以直接打guide就能进入GUI模式。
首先把界面画的和上图一样,然后设置属性,其中
Axes控件Tag属性设为myAxes,Panel控件的Tag属性设为uipanel,Edit Text控件的Tag属性设为strCode,Static Text的控件Tag属性设为txtDemo,ListBox控件的Tag属性设为lstBox,Push Button控件有两个一个Tag属性设为bthDraw,一个Tag属性设为bthClose.
完成上一步后开始设置回调函数
bthDraw的回调函数设为:
- functionbtnDraw_Callback(hObject,eventdata,handles)
- try
- str=char(get(handles.strCode,'String'));
- str0=[];
- forii=1:size(str,1)
- str0=[str0,deblank(str(ii,:))];
- end
- eval(str0);
- axes(handles.myAxes);
- plot(x,y);
- catch
- %errordlg('请重新检查输入数据!');
- end
bthClose的回调函数设为:
- functionbtnClose_Callback(hObject,eventdata,handles)
- close(gcf);
lstBox的回调函数设为:
- functionlstBox_Callback(hObject,eventdata,handles)
- v=get(handles.lstBox,'value');
- switchv
- case1,
- str1='nump=3;denp=1;';
- str2='t=0:0.1:10;';
- str3='[y,t,x]=step(nump,denp,t);';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','比例环节');
- case2,
- str1='nump=1;deng=[0.21];';
- str2='t=0:0.1:10;';
- str3='[y,t,x]=step(nump,deng,t);';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','惯性环节');
- case3,
- str1='K=2;T=0.1;N=5;numpd=[K*TK];denpd=[T/N1];';
- str2='t=0:0.1:10;';
- str3='[y,t,x]=step(numpd,denpd,t);';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','比例微分环节');
- case4,
- str1='K=4;T=0.2;numpi=[K*TK];denpi=[T0];';
- str2='t=0:0.1:10;';
- str3='[y,t,x]=step(numpi,denpi,t);';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','比例积分环节');
- case5,
- str1='num=[-1-1];';
- str2='den=conv([12],[122]);';
- str3='rlocus(tf(num,den));';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','根轨迹');
- case6,
- str1='s=tf(''s'');';
- str2='G=1000*(s+1)/(s*(s+2)*(s^2+17*s+4000));';
- str3='bode(G);grid;';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','波特图');
- case7,
- str1='num=[202010];';
- str2='den=conv([110],[110]);';
- str3='nyquist(num,den);axis([-22-55]);';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','奈奎斯特曲线');
- case8,
- str1='Kp=1;Ki=[0.10.82];num=1;den=[41];G0=tf(num,den);';
- str2='forii=1:3Gc=tf([KpKi(ii)],[10]);';
- str3='G=G0*Gc;step(feedback(G,1));holdon;end;holdoff;';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','PID调节曲线');
- case9,
- str1='num=100;den=[180];';
- str2='w=logspace(-1,2,100);';
- str3='nichols(num,den,w);ngrid;';
- set(handles.strCode,'String',char(str1,str2,str3));
- set(handles.uipanel,'Title','PID调节曲线');
- end
- btnDraw_CreateFcn(hObject,eventdata,handles)
以下是一些测试结果: