Matlab自控简单仿真

今天没什么事干,折腾折腾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的回调函数设为:

Code:
  1. functionbtnDraw_Callback(hObject,eventdata,handles)
  2. try
  3. str=char(get(handles.strCode,'String'));
  4. str0=[];
  5. forii=1:size(str,1)
  6. str0=[str0,deblank(str(ii,:))];
  7. end
  8. eval(str0);
  9. axes(handles.myAxes);
  10. plot(x,y);
  11. catch
  12. %errordlg('请重新检查输入数据!');
  13. end

bthClose的回调函数设为:

Code:
  1. functionbtnClose_Callback(hObject,eventdata,handles)
  2. close(gcf);

lstBox的回调函数设为:

Code:
  1. functionlstBox_Callback(hObject,eventdata,handles)
  2. v=get(handles.lstBox,'value');
  3. switchv
  4. case1,
  5. str1='nump=3;denp=1;';
  6. str2='t=0:0.1:10;';
  7. str3='[y,t,x]=step(nump,denp,t);';
  8. set(handles.strCode,'String',char(str1,str2,str3));
  9. set(handles.uipanel,'Title','比例环节');
  10. case2,
  11. str1='nump=1;deng=[0.21];';
  12. str2='t=0:0.1:10;';
  13. str3='[y,t,x]=step(nump,deng,t);';
  14. set(handles.strCode,'String',char(str1,str2,str3));
  15. set(handles.uipanel,'Title','惯性环节');
  16. case3,
  17. str1='K=2;T=0.1;N=5;numpd=[K*TK];denpd=[T/N1];';
  18. str2='t=0:0.1:10;';
  19. str3='[y,t,x]=step(numpd,denpd,t);';
  20. set(handles.strCode,'String',char(str1,str2,str3));
  21. set(handles.uipanel,'Title','比例微分环节');
  22. case4,
  23. str1='K=4;T=0.2;numpi=[K*TK];denpi=[T0];';
  24. str2='t=0:0.1:10;';
  25. str3='[y,t,x]=step(numpi,denpi,t);';
  26. set(handles.strCode,'String',char(str1,str2,str3));
  27. set(handles.uipanel,'Title','比例积分环节');
  28. case5,
  29. str1='num=[-1-1];';
  30. str2='den=conv([12],[122]);';
  31. str3='rlocus(tf(num,den));';
  32. set(handles.strCode,'String',char(str1,str2,str3));
  33. set(handles.uipanel,'Title','根轨迹');
  34. case6,
  35. str1='s=tf(''s'');';
  36. str2='G=1000*(s+1)/(s*(s+2)*(s^2+17*s+4000));';
  37. str3='bode(G);grid;';
  38. set(handles.strCode,'String',char(str1,str2,str3));
  39. set(handles.uipanel,'Title','波特图');
  40. case7,
  41. str1='num=[202010];';
  42. str2='den=conv([110],[110]);';
  43. str3='nyquist(num,den);axis([-22-55]);';
  44. set(handles.strCode,'String',char(str1,str2,str3));
  45. set(handles.uipanel,'Title','奈奎斯特曲线');
  46. case8,
  47. str1='Kp=1;Ki=[0.10.82];num=1;den=[41];G0=tf(num,den);';
  48. str2='forii=1:3Gc=tf([KpKi(ii)],[10]);';
  49. str3='G=G0*Gc;step(feedback(G,1));holdon;end;holdoff;';
  50. set(handles.strCode,'String',char(str1,str2,str3));
  51. set(handles.uipanel,'Title','PID调节曲线');
  52. case9,
  53. str1='num=100;den=[180];';
  54. str2='w=logspace(-1,2,100);';
  55. str3='nichols(num,den,w);ngrid;';
  56. set(handles.strCode,'String',char(str1,str2,str3));
  57. set(handles.uipanel,'Title','PID调节曲线');
  58. end
  59. btnDraw_CreateFcn(hObject,eventdata,handles)

以下是一些测试结果:

你可能感兴趣的:(matlab)