1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA - Serge Steer
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution. The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
function [kp,s]=krac2(sys)
//The denominator of the closed loop system is den(s)+K*num(s). So the
// the closed loops poles verify K(s)=-den(s)/num(s)
//The real axis breakaway points occurs at the extrema of the K(s)
// so at the point where K'=dK/ds = 0
// K'=-(den'*num-den*num')/num^2
// K'= 0 --> den'*num-den*num'=0
// http://www.scribd.com/doc/21374148/An-Introduction-to-Control-Systems
select typeof(sys)
case "rational" then
case "state-space" then
sys=ss2tf(sys);
else
error(msprintf(gettext("%s: Wrong type for input argument #%d: Linear state space or a transfer function expected.\n"),"krac2",1))
end
if size(sys,"*")<>1 then
error(msprintf(gettext("%s: Wrong size for input argument #%d: Single input, single output system expected.\n"),"krac2",1))
end
num=sys.num
den=sys.den
s=roots(derivat(num)*den-derivat(den)*num,"e")
//collect the real roots only
i=find(abs(imag(s))<=10*%eps)
if i==[] then kp=[],s=[];return,end
s=s(i)';
s=s(horner(num,s)<>0);
kp=-real(freq(den,num,real(s)));
i=find(kp>=0);
kp=kp(i)
s=s(i)
endfunction
|