* Bug #13482 fixed - pfss changed the variable of the rational fractions 22/14722/6
Samuel Gougeon [Mon, 23 Jun 2014 09:28:07 +0000 (11:28 +0200)]
varn also corrected to keep variable "dt" on rational fractions

Change-Id: I0b99c4764f2d7413d15004a1e28a7894146212e7

scilab/CHANGES_5.5.X
scilab/modules/cacsd/macros/pfss.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_13482.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_13482.tst [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_3967.tst
scilab/modules/overloading/macros/%r_varn.sci
scilab/modules/overloading/tests/nonreg_tests/bug_13481.dia.ref
scilab/modules/overloading/tests/nonreg_tests/bug_13481.tst

index cbcc377..f8a2335 100644 (file)
@@ -197,6 +197,9 @@ Scilab Bug Fixes
 
 * Bug #13481 fixed - varn did not work on rational fractions
 
+* Bug #13482 fixed - pfss changed the variable of the rational fractions.
+                     varn also modified to keep variable "dt" of rational fractions
+
 * Bug #13491 fixed - intg now properly returns when the user function produces an error.
 
 * Bug #13501 fixed - Typos fixed in English help pages.
index 83715f6..41f1a70 100644 (file)
@@ -1,5 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA -
+// Copyright (C) INRIA
+// Copyright (C) - 2014 - Samuel GOUGEON <sgougeon@free.fr>
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function elts=pfss(S,rmax,cord)
-    //Syntax : elts=pfss(S)
+function elts = pfss(S, rmax, cord)
+    //Syntax : elts = pfss(S)
     //Partial fraction decomposition of the linear system S (in state-space form):
     // elts is the list of linear systems which add up to S
-    // i.e. elts=list(S1,S2,S3,...,Sn) with S1 + S2 +... +Sn = S
+    // i.e. elts = list(S1, S2, S3, ..., Sn) with S1 + S2 +... +Sn = S
     // Each Si contains some poles of S according to the block-diagonalization
     // of the A matrix of S.
     // If S is given in transfer form, it is first converted into state-space
     // and each subsystem is then converted in transfer form.
-    //!
+
     select argn(2)
     case 1 then
-        rmax=[];cord=[]
+        rmax = [];
+        cord = [];
     case 2 then
-        if type(rmax)==10 then cord=rmax;end
-        if type(rmax)==1 then cord=[];end
+        if type(rmax) == 10 then cord = rmax; end
+        if type(rmax) == 1 then cord = []; end
     end
 
-    if and(typeof(S)<>["rational","state-space"]) then
-        error(msprintf(gettext("%s: Wrong type for input argument #%d: Linear state space or a transfer function expected.\n"),"pfss",1))
+    if and(typeof(S) <> ["rational", "state-space"]) then
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Linear state space or a transfer function expected.\n"), "pfss", 1))
     end
-    if typeof(S)=="rational" then
-        S=tf2ss(S),flag=%T
+    if typeof(S) == "rational" then
+        flag = varn(S("num"))
+        S = tf2ss(S)
     else
-        flag=%F
+        flag = ""
     end
 
-    [f,g,h,dd,dom]=S([2:5,7]);
-    [n,n]=size(f);
-    if rmax==[] then
-        [f,x,bs]=bdiag(f);
+    [f, g, h, dd, dom] = S([2:5, 7]);
+    [n, n] = size(f);
+    if rmax == [] then
+        [f, x, bs] = bdiag(f);
     else
-        [f,x,bs]=bdiag(f,rmax);
+        [f, x, bs] = bdiag(f, rmax);
     end
-    h=h*x;g=x\g;
-    k=1;ll=0;
-    elts=list();
-    for l=bs',
-        ind=k:k+l-1;
-        f1l=f(ind,ind);
-        gl=g(ind,:);
-        hl=h(:,ind);
-        elts(ll+1)=syslin("c",f1l,gl,hl)
-        ll=ll+1;k=k+l;
+    h = h*x; g = x\g;
+    k = 1; ll = 0;
+    elts = list();
+    for l = bs',
+        ind = k:k+l-1;
+        f1l = f(ind, ind);
+        gl = g(ind, :);
+        hl = h(:, ind);
+        elts(ll+1) = syslin("c", f1l, gl, hl)
+        ll = ll+1; k = k+l;
     end;
-    if argn(2)==2  then
+    if argn(2) == 2  then
         select cord
         case "c"
-            nb=size(bs,"*");
-            class=[];
-            for k=1:nb
-                oneortwo=bs(k);ss=elts(k);A=ss(2);
-                if oneortwo==1 then
-                    class=[class,real(spec(A))];
+            nb = size(bs, "*");
+            class = [];
+            for k = 1:nb
+                oneortwo = bs(k); ss = elts(k); A = ss(2);
+                if oneortwo == 1 then
+                    class = [class, real(spec(A))];
                 end
-                if oneortwo>1 then
-                    class=[class,min(real(spec(A)))];
+                if oneortwo > 1 then
+                    class = [class, min(real(spec(A)))];
                 end
             end;
-            [cl,indi] = gsort(-class);
-            elts1=elts;
-            for k=1:size(elts);
-                elts(k)=elts1(indi(k));
+            [cl, indi] = gsort(-class);
+            elts1 = elts;
+            for k = 1:size(elts);
+                elts(k) = elts1(indi(k));
             end
         case "d"
-            nb=size(bs,"*");
-            class=[];
-            for k=1:nb
-                oneortwo=bs(k);ss=elts(k);A=ss(2);
-                if oneortwo==1 then
-                    class=[class,abs(spec(A))];
+            nb = size(bs, "*");
+            class = [];
+            for k = 1:nb
+                oneortwo = bs(k); ss = elts(k); A = ss(2);
+                if oneortwo == 1 then
+                    class = [class, abs(spec(A))];
                 end
-                if oneortwo>1 then
-                    class=[class,max(abs(spec(A)))];
+                if oneortwo > 1 then
+                    class = [class, max(abs(spec(A)))];
                 end
             end;
-            [cl,indi] = gsort(-class);
-            elts1=elts;
-            for k=1:size(elts);
-                elts(k)=elts1(indi(k));
+            [cl, indi] = gsort(-class);
+            elts1 = elts;
+            for k = 1:size(elts);
+                elts(k) = elts1(indi(k));
             end
         end
     end
-    if type(dd)==1 then
-        if norm(dd,"fro")<>0 then elts(ll+1)=dd,end
+    if type(dd) == 1 then
+        if norm(dd, "fro") <> 0 then elts(ll+1) = dd, end
     end
-    if type(dd)==2 then
-        if norm(coeff(dd),1) > %eps then elts(ll+1)=dd,end
+    if type(dd) == 2 then
+        if norm(coeff(dd), 1) > %eps then elts(ll+1) = dd, end
     end
-    if flag then
-        k=size(elts);
-        for kk=1:k,elts(kk)=ss2tf(elts(kk));end
+    if flag ~= "" then
+        k = size(elts)
+        for kk = 1:k
+            elts(kk) = varn(ss2tf(elts(kk)), flag)
+        end
     end
 endfunction
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_13482.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_13482.dia.ref
new file mode 100644 (file)
index 0000000..325521c
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13482 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13482
+//
+// <-- Short Description -->
+// pfss changed the variable of the rational fractions
+//
+// <-- CLI SHELL MODE -->
+f = %z / (2-%z) / (%z+1);
+d = pfss(f);
+// f and d must have the same variable name
+assert_checkequal(varn(f), varn(d(1)));
+assert_checkequal(varn(f), varn(d(2)));
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_13482.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_13482.tst
new file mode 100644 (file)
index 0000000..49cd209
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13482 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13482
+//
+// <-- Short Description -->
+// pfss changed the variable of the rational fractions
+//
+// <-- CLI SHELL MODE -->
+
+f = %z / (2-%z) / (%z+1);
+d = pfss(f);
+
+// f and d must have the same variable name
+assert_checkequal(varn(f), varn(d(1)));
+assert_checkequal(varn(f), varn(d(2)));
index 7a73220..0bed3f7 100644 (file)
 //    when called with a transfer function, pfss returns a set of state-space systems as a result. 
 //    pfss used to return a transfer functions when called with a transfer function (verified of 4.1.2).
 //    When called with a tf, pfss should of course return a tf. 
+//
+// <-- CLI SHELL MODE -->
 
 tf = syslin("c", 1/%s);
 ss = tf2ss(tf);
 
 if pfss(tf)<>list(tf) then pause;end
 if pfss(ss)<>list(ss) then pause;end
-
-
-
-
index b1523fb..31fcaa6 100644 (file)
@@ -9,8 +9,8 @@
 
 function  rep = %r_varn(p, varname)
     if argn(2)==1 then
-        rep = varn(p("num"))
+        rep = varn(p("num"));
     else
-        rep = rlist(varn(p.num, varname), varn(p.den, varname), [])
+        rep = rlist(varn(p.num, varname), varn(p.den, varname), p.dt);
     end
 endfunction
index 0635d42..e5a0952 100644 (file)
@@ -19,10 +19,15 @@ x = poly(0, "x");
 num = 3 + x + x^2;
 den = 1 - x + 2*x^2;
 R = num / den;
+R.dt = 'c';
 assert_checkequal("x", varn(R));
 num = varn(num, "z");
 den = varn(den, "z");
-assert_checkequal(num / den, varn(R, "z"));
+R2 = varn(R, "z");
+// Check varn created the same num and den
+assert_checkequal(num / den, R2.num / R2.den);
+// Check dt is kept with varn
+assert_checkequal(R.dt, R2.dt);
 // Test on matrix of rationals
 matrix_R = [R, 2*R + x, R.den/R.num];
 assert_checkequal(varn(matrix_R), "x");
index ee6b920..8fa37c1 100644 (file)
@@ -22,12 +22,20 @@ num = 3 + x + x^2;
 den = 1 - x + 2*x^2;
 
 R = num / den;
+R.dt = 'c';
+
 assert_checkequal("x", varn(R));
 
 num = varn(num, "z");
 den = varn(den, "z");
 
-assert_checkequal(num / den, varn(R, "z"));
+R2 = varn(R, "z");
+
+// Check varn created the same num and den
+assert_checkequal(num / den, R2.num / R2.den);
+
+// Check dt is kept with varn
+assert_checkequal(R.dt, R2.dt);
 
 // Test on matrix of rationals
 matrix_R = [R, 2*R + x, R.den/R.num];