1 ## Copyright (C) 2009 Lukas F. Reichlin
3 ## This file is part of LTI Syncope.
5 ## LTI Syncope is free software: you can redistribute it and/or modify
6 ## it under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation, either version 3 of the License, or
8 ## (at your option) any later version.
10 ## LTI Syncope is distributed in the hope that it will be useful,
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ## GNU General Public License for more details.
15 ## You should have received a copy of the GNU General Public License
16 ## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>.
19 ## Minimal realization of TF models.
21 ## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
22 ## Created: October 2009
25 function sys = __minreal__ (sys, tol)
27 ## TODO: Once ZPK models are implemented, convert TF to ZPK,
28 ## do cancellations over there and convert back to TF
30 sqrt_eps = sqrt (eps); # treshold for zero
36 sisosys = __sys_prune__ (sys, ny, nu);
38 [zer, gain] = zero (sisosys);
41 for k = length (zer) : -1 : 1 # reversed because of deleted zeros
42 [~, idx] = min (abs (zer(k) - pol)); # find best match
45 if (abs (zer(k)) < sqrt_eps) # catch case zer(k) = 0
48 t = 1000 * abs (zer(k)) * sqrt_eps;
54 if (abs (zer(k) - pol(idx)) < t)
60 num = real (gain * poly (zer));
61 den = real (poly (pol));
63 num_idx = find (abs (num) < sqrt_eps); # suppress numerical noise
64 den_idx = find (abs (den) < sqrt_eps); # in polynomial coefficients
69 sys.num{ny, nu} = tfpoly (num);
70 sys.den{ny, nu} = tfpoly (den);