File: frep2tf.sci

package info (click to toggle)
scilab 5.2.2-9
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 334,832 kB
  • ctags: 52,586
  • sloc: xml: 526,945; ansic: 223,590; fortran: 163,080; java: 56,934; cpp: 33,840; tcl: 27,936; sh: 20,397; makefile: 9,908; ml: 9,451; perl: 1,323; cs: 614; lisp: 30
file content (134 lines) | stat: -rw-r--r-- 3,911 bytes parent folder | download
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA - Serge Steer
// Copyright (C) ENPC - 
// 
// 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-en.txt

function [best_h,best_w]=frep2tf(frq,repf,dg,dom,tols,weight)
// iterative use of frep2tf_b jpc fd 1997 

// Copyright INRIA
  [lhs,rhs]=argn(0);
  if rhs <= 3 then dom='c' ; end 
  if rhs <= 4 then 
    rtol=1.e-2; atol=1.e-4, N=10;
  else 
    rtol=tols(1);atol=tols(2);N=tols(3);
  end
  if dom==[] then dom='c';end 
  if dom=='d' then dom=1;end
  if rhs <=5  then
    [h,err]=frep2tf_b(frq,repf,dg,dom);
    best_w = [];
  else
    [h,err]=frep2tf_b(frq,repf,dg,dom,weight);
    best_w = weight;
  end
  best_h = h ;
  for k=1:N
    if dom=='c' then   
      //    weight=(1)./abs(freq(h('den'),1,%i*frq*2*%pi));
      weight=(1)./horner(h('den'),%i*frq*2*%pi);
    else
      weight=(1)./horner(h('den'),exp(dom*%i*frq*2*%pi));
    end
    [h,err1]=frep2tf_b(frq,repf,dg,dom,weight);
    if ( (abs(err-err1) < rtol *err & err > err1 )| err1 < atol) then break;end;
    if err1 < err then best_err = err1 ; best_h = h; end 
    err=err1;
    mprintf(gettext("%s: Iteration %s, error=%s.\n"), "frep2tf", part(string(k+1),1:5), string(err1));
  end
endfunction

function [h,err]=frep2tf_b(frq,repf,dg,dom,weight)
// steer, jpc, fd 1997 (Nov)
//============================
  [lhs,rhs]=argn(0);
  // test the system type 'c' 'd' or dt 
  if rhs <= 3 then dom='c' ; end 
  if rhs <= 4 then weight=[];end 
  if dom==[] then dom='c';end 
  if dom=='d' then dom=1;end
  n=size(frq,'*');
  if dom=='c' then 
    w=2*%i*%pi*matrix(frq,n,1);
  else
    w=exp(2*%i*%pi*dom*matrix(frq,n,1));
  end 
  //initialization
  m=2*dg
  //We compute the linear system to be solved: 
  //w(k)=%i* frq(k)*2pi 
  //for k=1,n  sum(a_i*(w(k))^i,i=1,dg)
  //		-repf(k)*sum(b_i*(w(k))^i,i=1,dg) = 0 
  //with sum x_i = 1
  //building Van der monde matrix ( w_i^j ) i=1,n j=0:dg-1
  a1=w.*.[ones(1,dg)];
  //0.^0 is not accepted in Scilab....
  a1=[ones(n,1),a1.^(ones(n,1).*.[1:(dg)])];
  a2=a1; for k=1:n; a2(k,:)= -repf(k)*a2(k,:);end 
  a=[a1,a2];
  // Computing constraints
  // We impose N(i wk) - repfk D(i wk) =0 for k=imax
  // as follows:
  // N(i wk) = repfk*(1+%i*b)
  // D(i wk) = 1+%i*b
  // L*[x;b]=[repfk;1]
  // Least squ. pb is  min norm of [A,0] [x;b]
  //  under constraint         L*[x;b]=[repfk;1]              
  [rmax,imax]=maxi(abs(repf))
  L2=a(imax,1:dg+1);
  L=[zeros(L2),L2,%i;
     L2,zeros(L2),repf(imax)*%i];
  BigL=[real(L);imag(L)]
  c=[1;repf(imax)];
  Bigc=[real(c);imag(c)];
  [ww,dim]=rowcomp(BigL);
  BigL=ww*BigL;Bigc=ww*Bigc;
  BigL=BigL(1:dim,:);Bigc=Bigc(1:dim,:);

  a=[a,zeros(size(a,1),1)];
  // auto renormalization : if weight is not given 
  if dom == 'c' then 
    if weight==[] then
      nn= sqrt(sum(abs(a).^2,'c'))+ones(n,1);
      a=a./(nn*ones(1,size(a,2)));
    end	
  end    
  // user given renormalization
  if weight<>[] then 
    if size(frq,'*')<>size(weight,'*') then
      error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same numbers of elements expected.\n"),"frep2tf",1,5))
    end
    w1=weight(:)*ones(1,size(a,2));
    a= w1.*a;
  end
  BigA=[real(a);imag(a)];
  // Constraints BigL x =Bigc
  // 
  x=LSC(BigA,BigL,Bigc);
  x=x(1:$-1);

  h=syslin(dom,poly(x(1:dg+1),'s','c'),poly([x((dg+2):$)],'s','c'))
  if lhs==2 then
    repf1=repfreq(h,frq);
    err = sum(abs(repf1(:)-repf(:)))/n;
  end
endfunction

function [x]=LSC(A,L,c)
// Ax=0 Least sq. + Lx = c
  [W,rk]=colcomp(L);
  LW=L*W;
  Anew=A*W
  A1=Anew(:,1:($-rk))
  A2=Anew(:,($-rk+1:$));
  x2=inv(LW(:,$-rk+1:$))*c
  b= -A2*x2
  x1=A1\b
  x=W*[x1;x2]
endfunction