Code covered by the BSD License

# Controls Tutor

### Craig Borghesani (view profile)

Help understand the fundamentals of classical control theory.

dispfrac(mode)
```function dispfrac(mode)
% DISPFRAC Display terms in laplacian format.
%          DISPFRAC displays the current terms in fraction format.

% Author: Craig Borghesani
% Date: 8/23/94
% Revised: 10/18/94

% obtain handle information
f=gcf;
ui_data     = get(f,'userdata');
ui_han      = ui_data{1};
ui_obj      = ui_data{2};
%popup       = ui_han(1);
popup       = ui_obj.SysUI(5);
term_axis   = ui_han(10);
plant       = ui_han(30);
for_cont    = ui_han(31);
bac_cont    = ui_han(32);
set_to_one1 = ui_han(33);
set_to_one2 = ui_han(34);
cont_type   = ui_han(35);
num_den     = ui_han(36);
pid_1       = ui_han(37);
pid_2       = ui_han(38);
component   = ui_han(44);
open_loop   = ui_han(45);
closed_loop = ui_han(46);
factored    = ui_han(47);
coefficient = ui_han(48);
inverse     = ui_han(49);
neg_loc     = ui_han(68);
cur_sys     = get(ui_han(30),'userdata');
cur_page    = get(ui_han(31),'userdata');
sys_state   = get(ui_han(33),'userdata');
page_setup  = get(ui_han(34),'userdata');
stat_bar    = get(ui_han(43),'userdata');
lab_txt     = get(ui_han(44),'userdata');
ers = 'norm';
fontname = 'times';

% define various shades of grey
grey = get(0,'defaultuicontrolbackground');
ltgrey = [0.5,0.5,0.5]*1.5;
dkgrey = [0.5,0.5,0.5]*0.5;

if nargin == 0, mode = 0; end

% update checked properties of menu items
if mode,
if any(abs(mode) == [1,2,3]), % switching systems

if cur_sys == mode, return; end

eraser1 = ui_obj.eraser1;
tab_uis = ui_obj.SysTabs;

%sel_dims = [-3,0,+6,+2];
%unsel_dims = [3,0,-6,-2];

sel_dims = [0,0,0,+2];
unsel_dims = [0,0,0,-2];

sel_tab = findobj(f,'tag','selected_tab1');
cur_obj = tab_uis(abs(mode));
if mode > 0 & sel_tab == cur_obj, return; end

if length(sel_tab),
tab_pos = get(sel_tab,'pos');
set(sel_tab,'pos',tab_pos+unsel_dims,'tag','',...
'back',ltgrey);
end

cur_pos = get(cur_obj,'pos');
set(cur_obj,'pos',cur_pos+sel_dims,'tag','selected_tab1',...
'back',grey);
eraser_pos = cur_pos+sel_dims;
set(eraser1,'pos',[eraser_pos(1:3)+[2,0,-4],2]);

set(ui_han(25+cur_sys),'checked','off');
set(ui_han(25+abs(mode)),'checked','on');
cur_sys = abs(mode);
set(ui_han(30),'userdata',cur_sys);
set(lab_txt(3),'callback',['dispfrac(',int2str(rem(cur_sys,3)+1),')'],...
'string',['System ',int2str(cur_sys),' Info']);

% restore settings for system
% Plant option
if sys_state(1,cur_sys),
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
set(plant,'checked','on','enable','on');
set(cont_type,'enable','off');
set([for_cont,bac_cont],'checked','off');
set(ui_obj.SysUI(1),'value',1);
set(ui_obj.SysUI(2:3),'value',0);
set(lab_txt(1),'callback','dispfrac(5)');
loc_type = 1;

% set to one option
set(set_to_one1,'label',['Set G(s) = 1']);
set(set_to_one2,'label',['Set H(s) = 1']);
if sys_state(4,cur_sys),
set(set_to_one1,'checked','on');
set(for_cont,'enable','off');
else
set(set_to_one1,'checked','off');
set(for_cont,'enable','on');
end
if sys_state(5,cur_sys),
set(set_to_one2,'checked','on');
set(bac_cont,'enable','off');
else
set(set_to_one2,'checked','off');
set(bac_cont,'enable','on');
end
end

% Forward Controller option
if sys_state(2,cur_sys),
set(for_cont,'checked','on','enable','on');
set([plant,bac_cont],'checked','off');
set(ui_obj.SysUI(2),'value',1);
set(ui_obj.SysUI([1,3]),'value',0);
set(cont_type,'enable','on');
set(lab_txt(1),'callback','dispfrac(6)');

% set to one option
set(set_to_one1,'label',['Set P(s) = 1']);
set(set_to_one2,'label',['Set H(s) = 1']);
if sys_state(4,cur_sys),
set(set_to_one1,'checked','on');
set(plant,'enable','off');
else
set(set_to_one1,'checked','off');
set(plant,'enable','on');
end
if sys_state(5,cur_sys),
set(set_to_one2,'checked','on');
set(bac_cont,'enable','off');
else
set(set_to_one2,'checked','off');
set(bac_cont,'enable','on');
end

% what type of forward controller
loc_type = find(sys_state(6:8,cur_sys)==1);
set(ui_han(36:38),'checked','off');
set(ui_han(35+loc_type),'checked','on');

if loc_type == 1,
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
else
popup_str = ['Proportional Gain|Integral Gain|Derivative Gain|Design Poin'];
set(popup,'string',popup_str,'callback','pidmang(0,1)');
end

end

% Feedback Controller option
if sys_state(3,cur_sys),
set(bac_cont,'checked','on','enable','on');
set([plant,for_cont],'checked','off');
set(cont_type,'enable','on');
set(ui_obj.SysUI(3),'value',1);
set(ui_obj.SysUI(1:2),'value',0);
set(lab_txt(1),'callback','dispfrac(6)');

% set to one option
set(set_to_one1,'label',['Set P(s) = 1']);
set(set_to_one2,'label',['Set G(s) = 1']);
if sys_state(4,cur_sys),
set(set_to_one1,'checked','on');
set(plant,'enable','off');
else
set(set_to_one1,'checked','off');
set(plant,'enable','on');
end
if sys_state(5,cur_sys),
set(set_to_one2,'checked','on');
set(for_cont,'enable','off');
else
set(set_to_one2,'checked','off');
set(for_cont,'enable','on');
end

% what type of feedback controller
loc_type = find(sys_state(9:11,cur_sys)==1);
set(ui_han(36:38),'checked','off');
set(ui_han(35+loc_type),'checked','on');

if loc_type == 1,
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
else
popup_str = ['Proportional Gain|Integral Gain|Derivative Gain|Design Poin'];
set(popup,'string',popup_str,'callback','pidmang(0,1)');
end

end

if loc_type == 1,
termmang(1,2,1);
else
pidmang(1,2)
end

% clear root locus storage
set(ui_han([37,69:75]),'userdata',[]);

pageplot(0,13);

elseif mode == 4, % switching to plant
if strcmp(get(plant,'enable'),'off'),
dispfrac(5);
return
end
set(stat_bar,'string',['Switching to Plant ',int2str(cur_sys),' transfer function']);
set(lab_txt(1),'callback','dispfrac(5)');
set(plant,'checked','on');
set([for_cont,bac_cont],'checked','off');
set(ui_obj.SysUI(1),'value',1);
set(ui_obj.SysUI(2:3),'value',0);

set(set_to_one1,'label',['Set G(s) = 1']);
set(set_to_one2,'label',['Set H(s) = 1']);

if strcmp(get(for_cont,'enable'),'off'),
set(set_to_one1,'checked','on');
temp1 = get(ui_han(12+cur_sys*2-1),'userdata');
temp2 = get(ui_han(12+cur_sys*2),'userdata');
set(ui_han(12+cur_sys*2-1),'userdata',temp2);
set(ui_han(12+cur_sys*2),'userdata',temp1);
end

if strcmp(get(bac_cont,'enable'),'off'),
set(set_to_one2,'checked','on');
end

set(cont_type,'enable','off');
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
termmang(1,2,1)

% update sys_state matrix
sys_state(2:3,cur_sys) = [0;0];
sys_state(1,cur_sys) = 1;

% need to update gain plots because of transfer function change
pageplot(4,[]);

elseif mode == 5, % switching to forward controller
if strcmp(get(for_cont,'enable'),'off'),
dispfrac(6);
return
end
set(stat_bar,'string',['Switching to Forward Controller ',int2str(cur_sys),' transfer function']);
set(lab_txt(1),'callback','dispfrac(6)');
set(for_cont,'checked','on');
set([plant,bac_cont],'checked','off');
set(ui_obj.SysUI(2),'value',1);
set(ui_obj.SysUI([1,3]),'value',0);

set(set_to_one1,'label',['Set P(s) = 1']);
set(set_to_one2,'label',['Set H(s) = 1']);

if strcmp(get(plant,'enable'),'off'),
set(set_to_one1,'checked','on');
end
if strcmp(get(bac_cont,'enable'),'off'),
set(set_to_one2,'checked','on');
end

set(cont_type,'enable','on');

% what type of forward controller
loc_type = find(sys_state(6:8,cur_sys)==1);
set(ui_han(36:38),'checked','off');
set(ui_han(35+loc_type),'checked','on');

if strcmp(get(num_den,'checked'),'on'),
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
termmang(1,2,1)
else
popup_str = ['Proportional Gain|Integral Gain|Derivative Gain|Design Point'];
set(popup,'string',popup_str,'callback','pidmang(0,1)');
pidmang(1,2)
end

% update sys_state matrix
sys_state([1,3],cur_sys) = [0;0];
sys_state(2,cur_sys) = 1;

% need to update gain plots because of transfer function change
pageplot(4,[]);

elseif mode == 6, % switching to feedback controller
if strcmp(get(bac_cont,'enable'),'off'),
dispfrac(4);
return
end
set(stat_bar,'string',['Switching to Feedback Controller ',int2str(cur_sys),' transfer function']);
set(lab_txt(1),'callback','dispfrac(4)');
set(bac_cont,'checked','on');
set([plant,for_cont],'checked','off');
set(ui_obj.SysUI(3),'value',1);
set(ui_obj.SysUI(1:2),'value',0);

set(set_to_one1,'label',['Set P(s) = 1']);
set(set_to_one2,'label',['Set G(s) = 1']);

if strcmp(get(plant,'enable'),'off'),
set(set_to_one1,'checked','on');
end
if strcmp(get(for_cont,'enable'),'off'),
set(set_to_one2,'checked','on');
temp1 = get(ui_han(12+cur_sys*2-1),'userdata');
temp2 = get(ui_han(12+cur_sys*2),'userdata');
set(ui_han(12+cur_sys*2-1),'userdata',temp2);
set(ui_han(12+cur_sys*2),'userdata',temp1);
end

set(cont_type,'enable','on');

% what type of feedback controller
loc_type = find(sys_state(9:11,cur_sys)==1);
set(ui_han(36:38),'checked','off');
set(ui_han(35+loc_type),'checked','on');

if strcmp(get(num_den,'checked'),'on'),
popup_str = ['Gain|Integrator|Differentiator|Real Pole|Real Zero|',...
set(popup,'string',popup_str,'callback','termmang(0,1,1)');
termmang(1,2,1)
else
popup_str = ['Proportional Gain|Integral Gain|Derivative Gain|Design Point'];
set(popup,'string',popup_str,'callback','pidmang(0,1)');
pidmang(1,2)
end

% update sys_state matrix
sys_state(1:2,cur_sys) = [0;0];
sys_state(3,cur_sys) = 1;

% need to update gain plots because of transfer function change
pageplot(4,[]);

elseif mode == 7, % component
set(stat_bar,'string','Displaying individual transfer function');
set(ui_han([45:46]),'checked','off')
set(component,'checked','on');

elseif mode == 8, % open-loop
set(stat_bar,'string','Displaying open-loop transfer function');
set(ui_han([44,46]),'checked','off')
set(open_loop,'checked','on');

elseif mode == 9, % closed-loop
set(stat_bar,'string','Displaying closed-loop transfer function');
set(ui_han([44:45]),'checked','off');
set(closed_loop,'checked','on');

elseif mode == 10, % factored
set(stat_bar,'string','Displaying pole-zero factored form');
set(ui_han([48:49]),'checked','off');
set(factored,'checked','on');

elseif mode == 11, % coefficient
set(stat_bar,'string','Displaying polynomial form');
set(ui_han([47,49]),'checked','off');
set(coefficient,'checked','on');

elseif mode == 12, % inverse laplace transform
set(stat_bar,'string','Displaying inverse Laplace form');
set(ui_han([47:48]),'checked','off');
set(inverse,'checked','on');

end
set(ui_han(33),'userdata',sys_state);

end

% determine states of display

% which component is displayed
if strcmp(get(plant,'checked'),'on'), mode1 = 1;
elseif strcmp(get(for_cont,'checked'),'on'), mode1 = 2;
else mode1 = 3; end

% what type of controller is displayed
if strcmp(get(num_den,'checked'),'on'), mode2 = 1;
elseif strcmp(get(pid_1,'checked'),'on'), mode2 = 2;
else mode2 = 3; end

% what configuration is desired
if strcmp(get(component,'checked'),'on'), mode3 = 1;
elseif strcmp(get(open_loop,'checked'),'on'), mode3 = 2;
else mode3 = 3; end

% what form is desired
if strcmp(get(factored,'checked'),'on'), mode4 = 1;
elseif strcmp(get(coefficient,'checked'),'on'), mode4 = 2;
else mode4 = 3; end

if mode1 == 1,
set(lab_txt(1),'string',['Plant ',int2str(cur_sys),' Entry']);
elseif mode1 == 2,
set(lab_txt(1),'string',['Forward ',int2str(cur_sys),' Entry']);
else
set(lab_txt(1),'string',['Feedback ',int2str(cur_sys),' Entry']);
end

plant_mat = get(ui_han(3+cur_sys),'userdata');
for_mat = get(ui_han(6+cur_sys),'userdata');
bac_mat = get(ui_han(9+cur_sys),'userdata');

if mode3 == 1,

if mode1 == 1,
tf_str = ['P',int2str(cur_sys)];
term_mat = plant_mat;
elseif mode1 == 2,
tf_str = ['G',int2str(cur_sys)];
term_mat = for_mat;
else
tf_str = ['H',int2str(cur_sys)];
term_mat = bac_mat;
end

elseif mode3 == 2,

tf_str = ['GPH',int2str(cur_sys)];
term_mat = termjoin(plant_mat,for_mat,bac_mat);

else

if any(mode == [4:6]), return; end
tf_str = ['CL',int2str(cur_sys)];
[nump,denp] = termextr(plant_mat);
[numg,deng] = termextr(for_mat);
[numh,denh] = termextr(bac_mat);
neg_locus = strcmp(get(neg_loc,'checked'),'on');
numcl = conv(conv(nump,numg),denh);
num = conv(conv(nump,numg),numh);
den = conv(conv(denp,deng),denh);
ln = length(num); ld = length(den);
num = [zeros(1,ld-ln),num];
den = [zeros(1,ln-ld),den];
dencl = den + num;
term_mat = termpars(numcl,dencl);

end

if mode4 < 3 , tf_str = [tf_str,'(s)='];
else tf_str = [tf_str,'(t)=']; end

if mode1 > 1 & mode2 > 1 & mode3 == 1, % pid controller
if mode4 > 1,
if term_mat(4) == 40, term_mat = pid2pid(term_mat,1); end
term_mat = termpars(term_mat([3,1,2]),[1,0]);
end
end

% destroy present transfer function
axes(term_axis);
cla;

line_yloc = 0.5;
T = [];
txt = text(0,0.5,tf_str,'erase',ers,'horizontalalignment','left',...
'verticalalignment','middle','fontname',fontname,'color','k');
tf_ext = get(txt,'extent');

% initial locations of text for the numerator and denominator
num_btm = line_yloc+0.01;
den_btm = line_yloc-tf_ext(4)-0.01;
txt_lft = sum(tf_ext([1,3]))+0.01;
term_val = [1:8];

% mode1 - transfer function
% mode2 - controller type
% mode3 - component, open-loop, closed-loop
% mode4 - factored, coefficient, inverse laplace

if mode4 == 1,
if mode1 > 1 & mode2 == 2 & mode3 == 1, % pid form #1
p_gain = num2str(term_mat(1));
i_gain = num2str(term_mat(2));
d_gain = num2str(term_mat(3));
txt = text(txt_lft,0.5,[p_gain,' + '],'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'userdata',[1,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');
txt_ext = get(txt,'extent');
txt_lft = txt_lft+txt_ext(3);
txt = text(txt_lft,num_btm,i_gain,'erase',ers,...
'horizontalalignment','left','verticalalignment','bottom',...
'userdata',[2,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');
txt_ext = get(txt,'extent');
new_lft = txt_lft+txt_ext(3);
lin_lft = txt_lft; lin_rht = new_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
txt_mid = txt_lft + (lin_rht-lin_lft)/2;
txt = text(txt_mid,den_btm,'s','erase',ers,...
'horizontalalignment','center','verticalalignment','bottom',...
'userdata',[2,0],'fontname',fontname,...
'tag','0','color','k');
%           'buttondownfcn','pagemous(0)');
text(new_lft,0.5,[' + ',d_gain,'s'],'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'userdata',[3,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');

elseif mode1 > 1 & mode2 == 3 & mode3 == 1, % pid form #2

p_gain = num2str(term_mat(1));
i_gain = num2str(abs(term_mat(2)));
d_gain = num2str(abs(term_mat(3)));

if term_mat(2) >= 0, p_gain = [p_gain,' + '];
else p_gain = [p_gain,' - ']; end

if term_mat(3) >= 0, d_gain = [' + ',d_gain];
else d_gain = [' - ',d_gain]; end

txt = text(txt_lft,0.5,['(1',d_gain,'s)'],'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'userdata',[3,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');
txt_ext = get(txt,'extent');
txt_lft = txt_lft+txt_ext(3);

txt = text(txt_lft,0.5,['(',p_gain],'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'userdata',[1,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');
txt_ext = get(txt,'extent');
txt_lft = txt_lft+txt_ext(3);

txt = text(txt_lft,num_btm,i_gain,'erase',ers,...
'horizontalalignment','left','verticalalignment','bottom',...
'userdata',[2,0],'fontname',fontname,...
'tag','0','color','k');
%            'buttondownfcn','pagemous(0)');
txt_ext = get(txt,'extent');
new_lft = txt_lft+txt_ext(3);
lin_lft = txt_lft; lin_rht = new_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
txt_mid = txt_lft + (lin_rht-lin_lft)/2;
txt = text(txt_mid,den_btm,'s','erase',ers,...
'horizontalalignment','center','verticalalignment','bottom',...
'userdata',[2,0],'fontname',fontname,...
'tag','0','color','k');
%           'buttondownfcn','pagemous(0)');
text(new_lft,0.5,')','erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'userdata',[2,0],'fontname',fontname,...
'tag','0','color','k');

else
for k = term_val,
term_loc=find(k==term_mat(:,4));
if length(term_loc),
for h=1:length(term_loc),

if k==1, % Gain

gain = num2str(term_mat(1,1));
txt = text(txt_lft,0.5,gain,'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'fontname',fontname,'color','k');
txt_ext = get(txt,'extent');

if mode3 == 1 & mode4 == 1,
set(txt,'userdata',term_loc(h),'tag','0');
%       set(txt,'userdata',term_loc(h),'buttondownfcn','pagemous(0)');
else
set(txt,'tag','9');
end

txt_lft = txt_lft + txt_ext(3)+0.01;

elseif k==2,

integ = term_mat(term_loc(h),1);
if integ~=0,
if integ > 0,
txt1_btm = den_btm; txt2_btm = num_btm;
else
txt1_btm = num_btm; txt2_btm = den_btm;
end

coeffs = [1,zeros(1,abs(integ))];
[txt_han,new_lft] = coefdisp(txt_lft,txt1_btm,coeffs,0,term_loc(h));

lin_lft = txt_lft; lin_rht = new_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
txt_mid = txt_lft + (lin_rht-lin_lft)/2;
txt = text(txt_mid,txt2_btm,'1','erase',ers,...
'horizontalalignment','center','verticalalignment','bottom',...
'fontname',fontname,'color','k');
set(txt,'userdata',term_loc(h));
set(lin,'userdata',[txt_han,txt]);

if mode3 == 1 & mode4 == 1,
set([txt,txt_han],'tag','0');
%        set([txt,txt_han],'buttondownfcn','pagemous(0)');
else
set([txt,txt_han],'tag','9');
end

txt_lft = new_lft + 0.01;
end

elseif any(k==[4,5]), % real pole/zero

if k==4,
txt1_btm = den_btm; txt2_btm = num_btm;
else
txt1_btm = num_btm; txt2_btm = den_btm;
end

coeffs = [1,term_mat(term_loc(h),1)];
[txt_han,new_lft] = coefdisp(txt_lft,txt1_btm,coeffs,1,term_loc(h));

lin_lft = txt_lft; lin_rht = new_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
txt_mid = txt_lft + (lin_rht-lin_lft)/2;
txt = text(txt_mid,txt2_btm,'1','erase',ers,...
'horizontalalignment','center','verticalalignment','bottom',...
'fontname',fontname,'color','k');
set(txt,'userdata',term_loc(h));

if mode3 == 1 & mode4 == 1,
set([txt,txt_han],'tag','0');
%       set([txt,txt_han],'buttondownfcn','pagemous(0)');
else
set([txt,txt_han],'tag','9');
end

set(lin,'userdata',[txt_han,txt]);
txt_lft = new_lft + 0.01;

elseif any(k==[6,7]), % complex pole/zero

if k==6,
txt1_btm = den_btm; txt2_btm = num_btm;
else
txt1_btm = num_btm; txt2_btm = den_btm;
end

zeta = term_mat(term_loc(h),1);
wn = term_mat(term_loc(h),2);
coeffs = [1,2*zeta*wn,wn^2];
[txt_han,new_lft] = coefdisp(txt_lft,txt1_btm,coeffs,1,term_loc(h));

lin_lft = txt_lft; lin_rht = new_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
txt_mid = txt_lft + (lin_rht-lin_lft)/2;
txt = text(txt_mid,txt2_btm,'1','erase',ers,...
'horizontalalignment','center','verticalalignment','bottom',...
'fontname',fontname,'color','k');
set(txt,'userdata',term_loc(h));

if mode3 == 1 & mode4 == 1,
set([txt,txt_han],'tag','0');
%       set([txt,txt_han],'buttondownfcn','pagemous(0)');
else
set([txt,txt_han],'tag','9');
end

set(lin,'userdata',[txt_han,txt]);
txt_lft = new_lft + 0.01;

phase = term_mat(term_loc(h),1);
freq = term_mat(term_loc(h),2);

zero_str = num2str(zero);
pole_str = num2str(pole);

if zero > 0,
else
end

if pole > 0,
lag = ['(s+',pole_str,')'];
else
lag = ['(s',pole_str,')'];
end

'horizontalalignment','left','verticalalignment','bottom',...
'fontname',fontname,'color','k');
set(txt1,'userdata',term_loc(h));

txt_ext = get(txt1,'extent');
lin_lft = txt_lft; lin_rht = txt_lft+txt_ext(3);
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');

txt2 = text(txt_lft,den_btm,lag,'erase',ers,...
'horizontalalignment','left','verticalalignment','bottom',...
'fontname',fontname,'color','k');
set(txt2,'userdata',term_loc(h));
set(lin,'userdata',[txt1,txt2]);

if mode3 == 1 & mode4 == 1,
set([txt1,txt2],'tag','0');
%       set([txt1,txt2],'buttondownfcn','pagemous(0)');
else
set([txt1,txt2],'tag','9');
end

txt_lft = txt_lft + txt_ext(3) + 0.01;

end % end else-ifs
end % end for h = loop
end % end of if length(term_loc)
end % end of for k = loop

if term_mat(1,2)~=0,
e_str = 'e';
txt1=text(txt_lft,line_yloc,e_str,'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'fontname',fontname,'color','k');
ext_txt = get(txt1,'extent');
txt_lft = txt_lft + ext_txt(3);
if term_mat(1,2) > 0,
delay_str = ['-',num2str(term_mat(1,2)),'s'];
else
delay_str = [num2str(-term_mat(1,2)),'s'];
end
txt2=text(txt_lft,line_yloc,delay_str,'erase',ers,...
'horizontalalignment','left','verticalalignment','bottom',...
'fontname',fontname,'color','k');
if mode3 == 1 & mode4 == 1,
set([txt1,txt2],'userdata',[0,1],'tag','0');
%       set([txt1,txt2],'buttondownfcn','pagemous(0)');
else
set([txt1,txt2],'tag','9');
end
end
end

elseif mode4 == 2, % coefficient

[num,den] = termextr(term_mat);
num = num/term_mat(1,1);

gain = num2str(term_mat(1,1));
txt = text(txt_lft,0.5,gain,'erase',ers,...
'horizontalalignment','left','verticalalignment','middle',...
'fontname',fontname,'color','k');
txt_ext = get(txt,'extent');
set(txt,'userdata',1);
txt_lft = txt_lft + txt_ext(3)+0.01;

[txt_han1,new_lft1] = coefdisp(txt_lft,num_btm,num,0,[0,0]);
[txt_han2,new_lft2] = coefdisp(txt_lft,den_btm,den,0,[0,0]);
min_lft = min(new_lft1,new_lft2); max_lft = max(new_lft1,new_lft2);
shft = (max_lft - min_lft)/2;
if new_lft1 < new_lft2,
for k = length(txt_han1):-1:1,
txt_pos = get(txt_han1(k),'pos');
set(txt_han1(k),'pos',txt_pos+[shft,0,0]);
end
elseif new_lft2 < new_lft1,
for k = length(txt_han2):-1:1,
txt_pos = get(txt_han2(k),'pos');
set(txt_han2(k),'pos',txt_pos+[shft,0,0]);
end
end
lin_lft = txt_lft; lin_rht = max_lft;
lin = line([lin_lft,lin_rht],[line_yloc,line_yloc],'erase',ers,'color','k');
set(lin,'userdata',[txt_han1,txt_han2]);
set([txt_han1,txt_han2],'tag','9');

elseif mode4 == 3, % Inverse Laplace Transform

residisp(term_mat,tf_ext);

end```