# Techniques of Model Based Control

### Coleman Brosilow (view profile)

01 May 2003 (Updated )

Software for design and tuninig of SISO and MIMO contol systems.

Epsilon=mimo_tune(fun,f,Mp,y,vub,vlb,E_handle,ps,ms,qs,order,...
```function Epsilon=mimo_tune(fun,f,Mp,y,vub,vlb,E_handle,ps,ms,qs,order,...
% This function bring the magnitude of the worse plant, Mp, of the diagonal elements
% to the reqiured Mp.
global Xwc_ub_w Tune_flag Epsilon
if strcmp(fun,'mimo1sen') | strcmp(fun,'mimo2sen')
errordlg('No tuning available for this frequency response');
n=length(order);
for i=1:n
Epsilon{1}(i)=str2num(get(E_handle(i),'String'));
if strcmp(fun,'mimo2com') | strcmp(fun,'mimo2sen')| strcmp(fun,'mimopartial')
Epsilon{2}(i)=str2num(get(E_handle(n+i),'String'));
end
end
return
end
n=length(order);
if tune_index==2 & (isempty(Tune_flag) | ~all(Tune_flag))
errordlg(['To tune the Mp of the diagonal elements by the SIMPLE tuning, ALL',...
' DIAGONAL ELEMENTs of the upper bound must be re-computed first!']);
for i=1:n
Epsilon{1}(i)=str2num(get(E_handle(i),'String'));
end
return
end
if tune_index==1 & (isempty(Tune_flag) | ~all(Tune_flag))
for i=1:n
Tune_flag(i)=i;
end
end
figure(f);
Mp=Mp(find(Tune_flag));
temp1=max(Mp);
for i=1:n
Epsilon{1}(i)=str2num(get(E_handle(i),'String'));
if strcmp(fun,'mimo2com') | strcmp(fun,'mimopartial')
Epsilon{2}(i)=str2num(get(E_handle(n+i),'String'));
mq{i}=mq_gen(1,1,dec_M(i),1,1,order(i),y);
[qd{i,i},qdnum{i,i},qdden{i,i}]=qd_mat(pd_prime{i,i},mq{i},Epsilon{2}(i),order(i),y);
qd{i,i}=strrep(qd{i,i},'e',['e(' num2str(i) ')']);
end
if Tune_flag(i)
temp1=max([temp1 ; Xwc_ub_w{i,i}(:,1)]);
end
end
y_limit=[min(Mp)-0.1 round(100*(temp1+0.05))/100];
if length(y_limit)==2
set(L_handle(1),'String',num2str(y_limit(2)));
set(L_handle(2),'String',num2str(y_limit(1)));
temp=axis;
axis([temp(1:2) y_limit]);
end
% Tune_flag
for i=1:n
if Tune_flag(i)
[temp,temp1]=max(Xwc_ub_w{i,i}(:,1));
xwc(i,:)=Xwc_ub_w{i,i}(temp1,2:end);
else
xwc(i,:)=[1 (vub+vlb)/2];
end
end
option=optimset('LargeScale','off','Display','off');
if tune_index==2
solver='tune_solve';
if strcmp(fun,'mimo1com')
qds='';
Epsilon{1}
Epsilon{1}=fsolve(solver,4*Epsilon{1},option,...
fun,xwc,Mp,vub,vlb,y,ps,ms,qs,order,input_delay,pds,qds);
for i=1:n
set(E_handle(i),'String',num2str(Epsilon{1}(i)));
end
else
qds=cell2str(qd);
if strcmp(fun,'mimopartial')
Epsilon{2}=fsolve(solver,Epsilon{2},option,...
fun,xwc,Mp,vub,vlb,y,ps,ms,qs,order,input_delay,pds,qds);
for i=1:n
set(E_handle(n+i),'String',num2str(Epsilon{2}(i)));
end
else
Epsilon{1}=fsolve(solver,Epsilon{1},option,...
fun,xwc,Mp,vub,vlb,y,ps,ms,qs,order,input_delay,pds,qds);
for i=1:n
set(E_handle(i),'String',num2str(Epsilon{1}(i)));
end
end
end
% Plot the frequency response of the worse case plants
% after the filetr time constant is changed.
for i=1:n
bg_color=get(M1_handle(n*(i-1)+i),'Backgroundcolor');
if Tune_flag(i)
freq=Xwc_ub_w{i,i}(:,2)';
[temp,temp1]=max(Xwc_ub_w{i,i}(:,1)');
x=Xwc_ub_w{i,i}(temp1,3:end);
data{i}=zeros(1,length(freq));
for k=1:length(freq)
data{i}(k)=feval(fun,x,y,Epsilon,1,freq(k),...
ps,ms,qs,order,i,i,input_delay,pds,qds);
end
end
end
else % if tune index==1 (Use the intensive tuning)
if strcmp(fun,'mimo1com')
qds='';
[Epsilon,XWC]=tune_solve1(Epsilon,fun,xwc,Mp,vub,vlb,y,ps,ms,qs,...
order,input_delay,pd_prime,pds,qds,E_handle,tole);
for i=1:n
set(E_handle(i),'String',num2str(Epsilon{1}(i)));
end
else
%qds=cell2str(qd);
[Epsilon,XWC]=tune_solve1(Epsilon,fun,xwc,Mp,vub,vlb,y,ps,ms,qs,...
order,input_delay,pd_prime,pds,mq,E_handle,tole);
if strcmp(fun,'mimopartial')
for i=1:n
set(E_handle(n+i),'String',num2str(Epsilon{2}(i)));
end
else
for i=1:n
set(E_handle(i),'String',num2str(Epsilon{1}(i)));
end
end
end
% Plot the frequency response of the worse case plants
% after the filetr time constant is changed.
for i=1:n
bg_color=get(M1_handle(n*(i-1)+i),'Backgroundcolor');
freq=Xwc_ub_w{i,i}(:,2)';
data{i}=zeros(1,length(freq));
temp=length(XWC(i,:));
for k=1:length(freq)
data{i}(k)=feval(fun,XWC(i,1:temp-1),y,Epsilon,1,freq(k),...
ps,ms,qs,order,i,i,input_delay,pds,qds);
end
Tune_flag(i)=i;
end
end
figure(f);
for i=1:n
bg_color=get(M1_handle(n*(i-1)+i),'Backgroundcolor');
if Tune_flag(i)
set(g,'color',bg_color);
set(h,'color',bg_color,'VerticalAlignment','bottom');
end
if i==1
hold on
end
end
hold off
y_limit=get(gca,'YLim');
temp=(log(y_limit(2))-log(y_limit(1)))/20;
h=text(10.^decade(1)*1.2,exp(log(y_limit(2))-temp),'- - - - - Expected worse case response with the new filter time constants');
set(h,'color',bg_color,'VerticalAlignment','bottom');