0 Labs For System Identification Course
0 Labs For System Identification Course
ﮔﺮوه ﻛﻨﺘﺮل
ﺳﻌﻴﺪ ﺳﻴﺪﻃﺒﺎﻳﻲ
System identification Labs
ﺑﺮاي ﺳﻬﻮﻟﺖ ﺑﻬﺘﺮ اﺳﺖ ﺑﺮاي ﻫﺮ ﺳﻮال ﻳﻚ m-fileﺑﻨﻮﻳﺴﻴﺪ اﻳﻨﮕﻮﻧﻪ ﻛﺎر ﺷﻤﺎ در ﺻﻮرت ﻧﻴﺎز ﺑﻪ ﺗﻜﺮار آزﻣﺎﻳﺶ ﺳﺎده ﺗﺮ ﻣﻲ ﺷﻮد.
روش ﺳﻮم
;)'Ts=-1; z=tf('z',Ts,'Variable','z^-1
)G=z^-2/(1-0.9*z^-1+0.5*z^-2); H=1/(1-0.7*z^-1
y1=lsim(G,u);v=lsim(H,e);y=y1+v
روش ﭼﻬﺎرم TOOL box :ﺷﻨﺎﺳﺎﻳﻲ
;Ts=-1; e_var=0.3
;]A=1; B=[0 0 1];C=1;F=[1 -0.7 0.5]; D=[1 -0.7
;)T=idpoly(A,B,C,D,F
;)'u = idinput(1024,'rgs
;)e =sqrt(0.3)* randn(1024,1
;)]y = sim(T,[u e
وﺟـﻮد ﻧـﺪارد DFT .ﺗـﺎﺑﻊ ) UN(ωدر ﻓﺮﻛﺎﻧﺴـﻬﺎي ω=2π k/Nﻣﺤﺎﺳـﺒﻪ ﻣـﻲ ﻛﻨـﺪ. 1
N
دﻗﺖ ﻛﻨﻴﺪ در ﺗﻌﺮﻳﻒ DFTﺿﺮﻳﺐ
ﻣﻮﻗﻌﻴﺖ ﻣﻮﻟﻔﻪ ﻫﺎ را در ﻃﻴﻒ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .ﻣﺤﻮر اﻓﻘﻲ را ﻓﺮﻛﺎﻧﺲ دﻳﺠﻴﺘﺎل f/fsﻣﺪرج ﻛﻨﻴﺪ.
;]fs=4e3; f=[0:fs/512:fs/2-1
)))x1=x(1:512);xw=fft(x1,512);plot(f,abs(xw(1:256
.Dﻳﻜﺒﺎر دﻳﮕﺮ FFTﺑﻪ ﻃﻮل 4096را ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ .اﻧﺘﻈﺎر ﺷﻤﺎ از اﻳﻦ ﻧﻤﻮدار ﭼﻴﺴﺖ؟ ﭼﺮا ﻧﻤﻮدار ﻣﺘﻔﺎوت اﺳﺖ
4-1
Lab 3: Impulse-response identification.
ﻣﺪﻟﺴﺎزي اﻳﻦ آزﻣﺎﻳﺶ ﺑﺮ اﺳﺎس ﭘﺎﺳﺦ ﮔﺬراي ﺿﺮﺑﻪ اﺳﺖ .دﻳﺘﺎ ﻓﺎﻳﻞ اﻳﻦ آزﻣﺎﻳﺶ ﺑـﺮاي ﺳﻴﺴـﺘﻢ درﺟـﻪ lab3_order1_1.mat 1
اﺳﺖ .ﺳﺘﻮن اول زﻣﺎن ،ﺳﺘﻮن دوم ورودي و ﺳﺘﻮن ﺳﻮم ﺧﺮوﺟﻲ اﺳﺖ.
load lab3_order1_1.mat
.Aاز ﺳﺘﻮن اول data_arrayﭘﺮﻳﻮد ﻧﻤﻮﻧﻪ ﺑﺮداري را ﺑﺪﺳﺖ آورﻳﺪTs
.Bدﻳﺘﺎي dataرا رﺳﻢ ﻛﻨﻴﺪ
.Cدﻳﺘﺎي ورودي و ﺧﺮوﺟﻲ از 31ﺗﺎ 130را ﺑﻪ ﻓﺮﻣﺖ iddataﺑﺒﺮﻳﺪ d1
)y=data_array(31:130,3);u=data_array(31:130,2
)d1=iddata(y,u,0.2
.Dورودي و ﺧﺮوﺟﻲ را رﺳﻢ ﻛﻨﻴﺪ )plot(d1
.Eﺑﺮاي ﻓﻴﺖ ﻛﺮدن ﻣﺪل درﺟﻪ 1ﺑﻪ آن
k
= )G(s
Ts + 1
ﭘﺎﺳﺦ ﺿﺮﺑﻪ اﻳﻦ ﺳﻴﺴﺘﻢ را ﻧﻮﺷﺘﻪ و از ﺗﻄﺒﻴﻖ ﺑﺎ ﻧﻤﻮدار ﻣﺪل را ﺑﺪﺳﺖ آورﻳﺪ k) .ﺑﺮاﺑﺮ ﺗﻘﺴﻴﻢ ﻣﻘﺪار ﻧﻬﺎﻳﻲ ﺧﺮوﺟﻲ ﺑﻪ ﻧﻬﺎﻳﻲ ورودي و
Tﺗﺎ زﻣﺎﻧﻲ اﺳﺖ ﻛﻪ ﭘﺮش ورودي ﺑﻪ 0.38ﻣﺎﻛﺰﻳﻤﻢ اﻓﺖ ﻛﻨﺪ( .داﻣﻨﻪ ﺿﺮﺑﻪ ورودي ﺑﺮاﺑﺮ ﺿﺮب داﻣﻨﻪ ورودي در ﭘﺮﻳﻮد ﻧﻤﻮﻧﻪ ﺑـﺮداري
اﺳﺖ.
k
ﺗﺨﻤﻴﻨﻲ را ﺑﺪﺳﺖ آورده ﺑﺎ ﻧﻤﻮﻧﻪ دوم ﭘﺎﺳﺦ )ﺑﻴﻦ 131ﺗﺎ (230ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ. G(s) = .Fﭘﺎﺳﺦ ﺿﺮﺑﻪ ﻓﻴﻠﺘﺮ
Ts + 1
)h2=impulse(G,0:0.2:20
)]plot([h2(1:100),y-3
.Gﺑﺎ دﺳﺘﻮر lsqcurvefitﺑﻪ دﻳﺘﺎي درﺟﻪ 1ﺗﺎﺑﻊ ) y=k.exp(-t/τرا ﻓﻴـﺖ ﻛﻨﻴـﺪ ﺑـﺎ ﺑﺪﺳـﺖ آوردن kو τﺗـﺎﺑﻊ ﺗﺒـﺪﻳﻞ آﻧـﺮا
ﺑﻨﻮﻳﺴﻴﺪ .ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺠﻬﻮل را ﻫﻢ ﺑﺎ ﺑﻬﻴﻨﻪ ﺳﺎزي ﻏﻴﺮ ﺧﻄﻲ و ﻫﻢ ﺧﻄﻲ ﺑﺮ اﺳﺎس log(y)=log(k)-t/τﻣﻲ ﺗﻮان ﺗﺨﻤـﻴﻦ
زد
function appr
;t=[0:99]*0.2
load lab3_order1_1.mat
;')y=data_array(31:130,3
;]x0=[3;3
)[x,resnorm] = lsqcurvefit(@myfun,x0,t,y-3
;y1=x(1)*exp(-t./x(2))+3
)]'plot([y',y1
)function F=myfun(x,xdata
;))F=x(1)*exp(-xdata/x(2
kωn2
G(s) = 2را ﺳﻴﺴـﺘﻢ درﺟـﻪ 2 .Hﻓﺎﻳﻞ lab3_order2_1.matرا اﻧﺘﺨﺎب ﻛﻨﻴـﺪ .ﺑـﻪ روش ﻓـﻮق ﭘﺎراﻣﺘﺮﻫـﺎي
s + 2ςωn s + ωn2
ﺗﺨﻤﻴﻦ ﺑﺰﻧﻴﺪ .ﭘﺎﺳﺦ ﺿﺮﺑﻪ اﻳﻦ ﺳﻴﺴﺘﻢ ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ:
6-1
ETFE
ﺳﻴﺴﺘﻢ ﺑﺎ ﺗﻮاﺑﻊ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .ﻓﺮﻛﺎﻧﺲ ﻧﻤﻮﻧﻪ ﺑﺮداري 1ﻫﺮﺗﺰ اﺳﺖ .ﻧﻮﻳﺰ ) e∈N(0,1اﺳﺖ .ﻃﻮل ﺳﻴﮕﻨﺎل ورودي N=1024
در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ u.ﻧﻴﺰ ﻧﻮﻳﺰ ﺳﻔﻴﺪ ﺑﺎ وارﻳﺎﻧﺲ 4اﺳﺖ.
را دارد ﻛﻪ ﻣﻄﺎﺑﻖ ﺷﻜﻞ در ﻣﻌﺮض اﺧﺘﻼل ) e(tاﺳﺖ .درﺟﻪ ﺳﻴﺴﺘﻢ nدر دﻳﺘﺎي آزﻣﺎﻳﺶ داده ﺷﺪه اﺳﺖ .اﻟﺒﺘﻪ درﺟﻪ ﺻﻮرت ﻣﻤﻜﻦ
اﺳﺖ ﻛﻤﺘﺮ ﺑﺎﺷﺪ
.Dروش IVرا ﺑﺎ اﻳﻨﺴﺘﺮوﻣﻨﺖ ﺳﺎده زﻳﺮ و nداده ﺷﺪه اﻧﺠﺎم و ﺑﺎ ARXﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ .ﻃﻮل اﻳﻨﺴﺘﺮوﻣﻨﺖ ﺑﺎﻳـﺪ ﻃـﻮل ﺧﺮوﺟـﻲ
ﺑﺎﺷﺪ
;)g2=tf(marx.B,marx.A,1,'variable','z^-1'); hat=lsim(g2,id.u
)tic;mivx=ivx(id,[2 2 1],-hat);toc; compare(val,marx,mivx
xﻳﻚ ﺑﺮدار ﻫﻢ ﻃﻮل ﺧﺮوﺟﻲ ) (lenاﺳﺖ .اﺑﺘﺪا arxرا اﺟﺮا ﻛﻨﻴﺪ و Âرا ﺑﺪﺳﺖ آورده و –Âرا در ﺧﺎﻧﻪ ﻫﺎي اول xﺟﺎي دﻫﻴﺪ
.Fﺑﺎ اﺟﺮاي دﺳﺘﻮر IV4ﻛﻪ ﺧﻮدﻛﺎر اﻳﻨﺴﺮوﻣﻨﺖ را اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ ﺳﻴﺴﺘﻢ را ﺷﻨﺎﺳﺎﻳﻲ و ﻧﺘﻴﺠﻪ را ﺑﺎ ﻧﺘﺎﻳﺞ ﻗﺒﻠﻲ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ
)tic;miv4=iv4(id,[2 2 1]);toc; compare(val,miv4,marx,mivx
.Gﻳﻚ ﻣﺪل ARMAXﺗﺨﻤﻴﻦ ﺑﺰﻧﻴﺪ و ﻧﺘﻴﺠﻪ راﺑﺎ ﺑﻬﺘﺮﻳﻦ IVﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ
)tic; marmax = armax(id,[na nb nk]);toc;compare(val,marmax
.Hآﻧﻬﺎ را ﺑﺮ ﺣﺴﺐ ﺳﺮﻋﺖ اﺟﺮا ﻣﺮﺗﺐ ﻛﻨﻴﺪ.
Lab 10: Recursive identification. Model validation using correlation tests (PDF). 2-3
rarx, idpoly, resid, plot, compare .Aدﺳﺘﻮرات ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .دﻳﺘﺎ ﻓﺎﻳﻞ اﻳﻦ آزﻣـﺎﻳﺶ lab10_1.mat
اﺳﺖ ﻛﻪ ﺣﺎوي idو valو درﺟﻪ واﻗﻌﻲ ﺳﻴﺴﺘﻢ nاﺳﺖ ﺿﻤﻨﺎ ﺳﻴﺴﺘﻢ OEاﺳﺖ
.Bﺑﺮاي اﻳﻦ ﺳﻴﺴﺘﻢ ARXدرﺟﻪ ﺑﺎﻻ ﺑﺎ na = nb = 3nﺗﺨﻤﻴﻦ زده ﻣﻲ ﺷﻮد
=) P-1(0اﺟﺮا ﻛﻨﻴﺪ .ﻳﻜﺒﺎر از 10%وﺑﺎر دﻳﮕﺮ از .Cدستور rarxرا روي دﻳﺘﺎي idﺑﺎ
ﻛﻞ دﻳﺘﺎ ﺑﺮاي ﺷﻨﺎﺳﺎﻳﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺎ دﺳﺘﻮر idpolyو ﭘﺎراﻣﺘﺮﻫﺎي ﺗﺨﻤﻴﻦ زده ﺷﺪه دو ﺳﻴﺴﺘﻢ ﺑﺴﺎزﻳﺪ و ﻛﻴﻔﻴﺖ اﻳـﻦ دو
را روي valرا ﺑﺎ دﺳﺘﻮر compareﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ
-1
What the rarx function denotes P is actually the inverse matrix P from the lecture.
ﺗﻜﺮار ﻛﻨﻴﺪو ﻧﺘﺎﻳﺞ را ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ .Dآزﻣﺎﻳﺶ را ﺑﺎ
ﺑﺎ دﺳﺘﻮر idpolyﻣﺪل arxﺑﺎ درﺟﻪ na = nb = nﺗﺨﻤﻴﻦ ﺑﺰﻧﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر residﺗﺨﻤﻴﻦ را اﻋﺘﺒﺎر ﺳﻨﺠﻲ ﻛﻨﻴﺪ. .I
Tsﻫﻤﺎن ﭘﺮﻳﻮد ﻧﻤﻮﻧﻪ ﺑﺮداري دﻳﺘﺎ ﺑﺎﺷﺪ
.Jﺑﺎ دﺳﺘﻮر idpolyﻣﺪل oeﺑﺎ درﺟﻪ na = nb = nﺗﺨﻤﻴﻦ ﺑﺰﻧﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر residﺗﺨﻤﻴﻦ را اﻋﺘﺒﺎر ﺳﻨﺠﻲ ﻛﻨﻴﺪ.
ﻧﺘﺎﻳﺞ راﺑﺎ ﻣﺪل arxﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ
Sample code
)sys = idpoly(A,B,C,D,F,NoiseVariance,T
;)mARX = arx(id, [3, 3, 1]); resid(mARX, id
3-3ﺟﻤﻊ آوري دﻳﺘﺎ و ﻧﻤﻮﻧﻪ ﺑﺮداري از ﺳﻴﺴﺘﻢ آﻧﺎﻟﻮگ
3s + 1 1
= ) Ga ( s = )H a (s
s2 + s + 1 s + 0.4
.Aﺑﺎ دﺳﺘﻮر randnﺳﻴﮕﻨﺎل ﻧﻮﻳﺰي ﺑﺮاي eو uﺗﻮﻟﻴﺪ ﻛﻨﻴﺪ .ﺳﻴﮕﻨﺎل eﻣﻴﺎﻧﮕﻴﻦ ﺻﻔﺮ و وارﻳﺎﻧﺲ 1و ﺳـﻴﮕﻨﺎل uﻣﻴـﺎﻧﮕﻴﻦ 1و
وارﻳﺎﻧﺲ 1دارد.
.Bﺑﺎ دﺳﺘﻮر lsimﺳﻴﮕﻨﺎل ﺧﺮوﺟﻲ yﺳﻴﺴﺘﻢ Aرا ﺗﻮﻟﻴﺪﻛﺮده آﻧﺮا رﺳﻢ ﻛﻨﻴﺪ.
.Cﭘﺎﺳﺦ ﭘﻠﻪ ﺳﻴﺴﺘﻢ ﻫﺮ دو ﺳﻴﺴﺘﻢ Gو Hرا رﺳﻢ ﻛﻨﻴﺪ .ﭘﺮﻳﻮد ﻧﻤﻮﻧـﻪ ﺑـﺮداري را ﺑـﻪ ﻧﺤـﻮي اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ ﻛـﻪ در زﻣـﺎن ﻧﻤـﻮ
ﺳﺮﻳﻌﺘﺮﻳﻦ Gو Hﺣﺪود 4ﺗﺎ 6ﻧﻤﻮﻧﻪ ﺟﺎي داده ﺷﻮد) .ﻓﺼﻞ (10
4-3ﻣﺪل ﮔﺴﺴﺘﻪ
Impulse invarianceرا ﺑﺎ دﺳﺘﻮر cdﺑﺪﺳﺖ آورﻳﺪ .اﻟﺒﺘﻪ ﺑﻬﺮه در z=1ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺑﻬﺮه در s=0ﺑﺎﺷﺪ ﻛﻪ اﺣﺘﻤﺎﻻ ﺑﺎﻳﺪ دﺳـﺘﻲ
ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ.
Nonlinear system identificationLAB4 4
y=ϕ’θ وﺟﻮد داردid ﺗﻌﺪاد ﻧﻘﺎﻃﻲ از ﻣﻨﺤﻨﻲ اﺳﺖ ﻛﻪ در ﻓﺎﻳﻞ دﻳﺘﺎي1681 ﻫﺎ وRBF ﻣﻌﺮف ﺗﻌﺪاد36 ﻛﻪ36 *1681 ﺑﺎ ﺳﺎﻳﺰϕ ﺗﻮﻟﻴﺪ ﻣﺎﺗﺮﻳﺲ.2
for k=1:1681
phi(:,k) = app.phi(app, id.Xflat(:, k));
end
. ﭘﺎراﻣﺘﺮ را ﺑﺮاي ﻓﻴﺖ ﺷﺪن دﻳﺘﺎ ﺑﻪ ﻣﺪل ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﻛﻨﺪLS اﻳﻦ دﺳﺘﻮر ﺑﺎθ=ϕ’\y ﺑﺎ دﺳﺘﻮرθ ﻣﺤﺎﺳﺒﻪ.3
theta=(phi')\id.Yflat';
. و ﺧﻄﺎي ﺗﻘﺮﻳﺐ ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﺷﻮد. ﺑﺎ ﺳﺎﻳﺰ ﻣﺘﻔﺎوت ﭼﻚ ﻣﻲ ﺷﻮدval ﻋﻤﻠﻜﺮد در راﺑﻄﻪ ﺑﺎ دﻳﺘﺎيθ ﺣﺎل ﺑﺮ اﺳﺎس ﻣﺤﺎﺳﺒﻪ.4
theta=(phi')\id.Yflat';
Yhat=0;
for k=1:5041
Yhat(k) = app.eval(app, val.Xflat(:, k), theta);
end
error=sum((Yhat-val.Yflat).^2)
ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﺪ71*71 را ﺑﺼﻮرت ﻣﺎﺗﺮﻳﺴﻲ1*5041 دﻳﺘﺎي ﺑﺮداريreshape دﺳﺘﻮر
Yhat = reshape(Yhat, val.dims);
mesh(val.X{1}, val.X{2}, val.Y);
hold on
mesh(val.X{1}, val.X{2}, Yhat);
hold off
2-4ﺷﺒﻴﻪ ﺳﺎزي ﻳﻚ ﺳﻴﺴﺘﻢ ﻏﻴﺮﺧﻄﻲ
.Aﺳﻴﺴﺘﻢ :Aﺳﻴﺴﺘﻢ ﻏﻴﺮ ﺧﻄﻲ زﻳﺮ a= -0.5, b=1را ﺑﺎ ورودي ﻧﻮﻳﺰي ) N(0,1و اﺧﺘﻼل ) N(0,1ﺗﺤﺮﻳﻚ و دﻳﺘﺎي ورودي-
ﺧﺮوﺟﻲ را رﺳﻢ ﻛﻨﻴﺪ .ﺗﻌﺪاد ﻧﻤﻮﻧﻪ 1024ﺑﺎﺷﺪ
x1 = x 2 + e1
x 2 = 1000 ( a − bx12 ) x 2 − x1 + u + e2
y = x2
.Bﭘﺎﺳﺦ ﭘﻠﻪ آﻧﺮا رﺳﻢ و ﭘﺮﻳﻮد ﻧﻤﻮﻧﻪ ﺑﺮداري ﻣﻨﺎﺳﺐ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
.Cﺑﺎ دﺳﺘﻮر iddataدﻳﺘﺎي ﺑﺮاي ﺷﻨﺎﺳﺎﻳﻲ آﻣﺎده ﻧﻤﺎﻳﻴﺪ.
Sample codes
;ua=7 % step amplitude
;t1=5 %step end time
;]tspan=[0 10 %time span
;y0=0 % initial condition
[t,y] = ode45(@(t,y) diff10(t,y,ua,t1),tspan,y0); %others such as ode23 and so on
;)'plot(t,y(:,1),'-o
ﺳﭙﺲ ﻓﺎﻳﻞ diff10را ﺟﺪاﮔﺎﻧﻪ ﺑﻨﻮﻳﺴﻴﺪ
)function dv=diff10(t,v,ua,t1
if t<t1 u=ua; else u=0; end
;dv=-v*abs(v)+u
antialiasing فيلتر
m3 = tfest(ze, 3, 1, 0.2)
h = iopzplot(m1,'b',m2,'r',m3,'c');
deviations.showConfidence(h,3);
showConfidence(nyquistplot(m1,'b',m2,'r',m3,'c',gs,'g'),3)