* Bug #12174 fixed - The function "routh_t" gave incorrect output for all denominators 22/10422/5
Charlotte HECQUET [Thu, 7 Feb 2013 13:52:59 +0000 (14:52 +0100)]
                     that include gain value "k".

Change-Id: I490b1dabdd130266314b647c1f97439acd1f17fd

SEP/INDEX
SEP/SEP_089_routh_t.odt [new file with mode: 0644]
scilab/CHANGES_5.4.X
scilab/modules/cacsd/help/en_US/routh_t.xml
scilab/modules/cacsd/macros/routh_t.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_12174.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_12174.tst [new file with mode: 0644]
scilab/modules/cacsd/tests/unit_tests/routh_t.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/unit_tests/routh_t.tst [new file with mode: 0644]

index 9264972..60f8486 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -83,4 +83,6 @@ SEP #083: example_run function
 SEP #084: fft improvements
 SEP #085: cond improvements
 SEP #086: Improvement of the regexp function
-SEP #087: New binaries: xcos scinotes
\ No newline at end of file
+SEP #087: New binaries: xcos scinotes
+SEP #088: /* RESERVED IN MASTER */
+SEP #089: New parameter added at routh_t function (normalized).
diff --git a/SEP/SEP_089_routh_t.odt b/SEP/SEP_089_routh_t.odt
new file mode 100644 (file)
index 0000000..c412003
Binary files /dev/null and b/SEP/SEP_089_routh_t.odt differ
index eabb216..e918e56 100644 (file)
@@ -382,6 +382,9 @@ Bug fixes
 
 * Bug #12168 fixed - matfile_listvar crashed when listing variables of a closed MAT-file.
 
+* Bug #12174 fixed - The function "routh_t" gave incorrect output for all denominators
+                     that include gain value "k".
+
 * Bug #12179 fixed - Fix an incompatibility with MPI version of HDF5.
 
 * Bug #12184 fixed - Performances of the function 'derivat' improved.
index 91fdf59..689eac6 100644 (file)
@@ -19,6 +19,7 @@
         <title>Calling Sequence</title>
         <synopsis>r=routh_t(p)
             r=routh_t(h [,k])
+            r=routh_t(h [,k] [,normalized])
         </synopsis>
     </refsynopsisdiv>
     <refsection>
                 </listitem>
             </varlistentry>
             <varlistentry>
+                <term>normalized</term>
+                <listitem>
+                    <para>a boolean (%t (default value) or %f)</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
                 <term>r</term>
                 <listitem>
                     <para>a matrix</para>
             <literal>k</literal>.
         </para>
         <para>
-            If <literal>k=poly(0,'k')</literal> we will have a polynomial matrix
-            with dummy variable <literal>k</literal>, formal expression of the Routh
-            table.
+            If <literal>k=poly(0,'k')</literal> we will have a polynomial or
+            a rational matrix with dummy variable <literal>k</literal>, 
+            formal expression of the Routh table.
+        </para>
+        <para>
+            If <literal>normalized=%f</literal> we will have a polynomial matrix
+            with non normalized elements. In the other case, we will have a rational
+            and normalized matrix.
         </para>
     </refsection>
     <refsection>
@@ -75,9 +87,12 @@ s=%s;
 P=5*s^3-10*s^2+7*s+20;
 routh_t(P)
 
-//transfer function with formal feedback
+// Transfer function with formal feedback, normalized case
 routh_t((1+s)/P,poly(0,'k'))
     
+// Transfer function with formal feedback, non normalized case
+routh_t((1+s)/P,poly(0,'k'),%f)
+
 // One of the coefficients in the polynomial equals zero
 P1=2*s^3-24*s+32; 
 routh_t(P1)
@@ -85,6 +100,8 @@ routh_t(P1)
 // A row full of zeros
 P2=s^4-6*s^3+10*s^2-6*s+9;
 routh_t(P2)
+
+//
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -110,4 +127,13 @@ routh_t(P2)
             Control, IEEE T.A.C Volume 25, Issue 1, Feb 1980 Page(s): 132 - 133
         </para>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+           <revision>
+                <revnumber>5.4.0</revnumber>
+                <revremark> A new parameter added: normalized (SEP 89).</revremark>
+           </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 64fb0a2..75a03aa 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - Serge STEER
 // Copyright (C) 1999 - Lucien.Povy@eudil.fr (to get a good table)
+// Copyright (C) 2013 - Charlotte HECQUET (new option)
 // 
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -8,7 +9,7 @@
 // are also available at    
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
-function r=routh_t(h,k)
+function r=routh_t(h,k,normalized)
 //r=routh_t(h,k) computes routh table of denominator of the
 //system described by transfer matrix SISO continue h with the
 //feedback by the gain k
@@ -31,6 +32,15 @@ function r=routh_t(h,k)
   //http://controls.engin.umich.edu/wiki/index.php/RouthStability
   [lhs,rhs]=argn(0);
   h1=h(1);
+  flag=1;
+  if rhs==3 then
+      if normalized==%t then
+          flag=1;
+      else
+          flag=0;
+      end
+      rhs=2;
+  end
   if rhs==2 then
     if typeof(h)<>'rational' then
       error(msprintf(gettext("%s: Wrong type for input argument #%d: rational fraction array expected.\n"),"routh_t",1));
@@ -64,7 +74,11 @@ function r=routh_t(h,k)
   if rhs==2 then
 
     for i=3:nd,
-      r(i,1:ncol-1)=[r(i-1,1),-r(i-2,1)]*[r(i-2,2:ncol);r(i-1,2:ncol)]
+        if flag==0 then
+        r(i,1:ncol-1)=[r(i-1,1),-r(i-2,1)]*[r(i-2,2:ncol);r(i-1,2:ncol)] 
+        else
+        r(i,1:ncol-1)=[1.,-r(i-2,1)/r(i-1,1)]*[r(i-2,2:ncol);r(i-1,2:ncol)]    
+        end
     end;
   else
     for i=3:nd,
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_12174.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_12174.dia.ref
new file mode 100644 (file)
index 0000000..6809cde
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 12174 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12174
+//
+// <-- Short Description -->
+// The function routh_t gives incorrect output for all denominators that include
+// gain value "k".
+s = poly(0, 's');
+k = poly(0,'k');
+P=s*(s+7)*(s+11);
+h=1/P;
+r_rat=routh_t(h,k,%t);
+r_poly=routh_t(h,k,%f);
+ref_rat=[1 77; 18 k;(1386-k)/18 0; k 0];
+numref=numer(ref_rat);
+numref(3)=1386 - k;
+denr=denom(r_rat);
+denr=horner(denr,1);
+denref=denom(ref_rat);
+denref(3)=18;
+ref_poly=[1 77; 18 k; 1386-k 0; 1386*k-k*k 0];
+assert_checkequal(numer(r_rat)/denr,numref/denref);
+assert_checkequal(r_poly,ref_poly);
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_12174.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_12174.tst
new file mode 100644 (file)
index 0000000..518753e
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 12174 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12174
+//
+// <-- Short Description -->
+// The function routh_t gives incorrect output for all denominators that include
+// gain value "k".
+
+s = poly(0, 's');
+k = poly(0,'k');
+P=s*(s+7)*(s+11);
+h=1/P;
+r_rat=routh_t(h,k,%t);
+r_poly=routh_t(h,k,%f);
+
+ref_rat=[1 77; 18 k;(1386-k)/18 0; k 0];
+numref=numer(ref_rat);
+numref(3)=1386 - k;
+denr=denom(r_rat);
+denr=horner(denr,1);
+denref=denom(ref_rat);
+denref(3)=18;
+ref_poly=[1 77; 18 k; 1386-k 0; 1386*k-k*k 0];
+
+assert_checkequal(numer(r_rat)/denr,numref/denref);
+assert_checkequal(r_poly,ref_poly);
diff --git a/scilab/modules/cacsd/tests/unit_tests/routh_t.dia.ref b/scilab/modules/cacsd/tests/unit_tests/routh_t.dia.ref
new file mode 100644 (file)
index 0000000..a8e259d
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// unit tests for routh_t() function
+// =============================================================================
+s=poly(0,'s');
+k=poly(0,'k');
+//Test with a polynomial
+P1=s*(s+7)*(s+11);
+assert_checkequal(routh_t(P1),[1 77; 18 0; 77 0; 0 0]);
+//Test with a transfert function
+h=1/P1;
+ref1=[1 77; 18 k;(1386-k)/18 0; k 0];
+numref1=numer(ref1);
+numref1(3)=1386 - k;
+denref1=denom(ref1);
+denref1(3)=18;
+assert_checkequal(numer(routh_t(h,k))/horner(denom(routh_t(h,k)),1),numref1/denref1);
+assert_checkequal(numer(routh_t(h,k,%t))/horner(denom(routh_t(h,k,%t)),1),numref1/denref1);
+assert_checkequal(routh_t(h,k,%f),[1 77; 18 k; 1386-k 0; 1386*k-k*k 0]);
+// One of the coefficients in the polynomial equals zero
+P2=2*s^2-24;
+assert_checkequal(routh_t(P2),[2 -24; 4 0; -24 0]);
+// A row full of zeros
+P3=s^4-6*s^3+10*s^2-6*s+9;
+assert_checkequal(routh_t(P3),[1 10 9; -6 -6 0; 9 9 0; 18 0 0; 9 0 0]);
+//Error messages
+assert_checkfalse(execstr("routh_t(P,%t)","errcatch")==0);
+assert_checkfalse(execstr("routh_t(P,k)","errcatch")==0);
+assert_checkfalse(execstr("routh_t()","errcatch")==0);
+assert_checkfalse(execstr("routh_t(h)","errcatch")==0);
+assert_checkfalse(execstr("routh_t(h,k,%t,%t)","errcatch")==0);
diff --git a/scilab/modules/cacsd/tests/unit_tests/routh_t.tst b/scilab/modules/cacsd/tests/unit_tests/routh_t.tst
new file mode 100644 (file)
index 0000000..f9b96b8
--- /dev/null
@@ -0,0 +1,44 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// unit tests for routh_t() function
+// =============================================================================
+
+s=poly(0,'s');
+k=poly(0,'k');
+
+//Test with a polynomial
+P1=s*(s+7)*(s+11);
+assert_checkequal(routh_t(P1),[1 77; 18 0; 77 0; 0 0]);
+
+//Test with a transfert function
+h=1/P1;
+ref1=[1 77; 18 k;(1386-k)/18 0; k 0];
+numref1=numer(ref1);
+numref1(3)=1386 - k;
+denref1=denom(ref1);
+denref1(3)=18;
+assert_checkequal(numer(routh_t(h,k))/horner(denom(routh_t(h,k)),1),numref1/denref1);
+assert_checkequal(numer(routh_t(h,k,%t))/horner(denom(routh_t(h,k,%t)),1),numref1/denref1);
+assert_checkequal(routh_t(h,k,%f),[1 77; 18 k; 1386-k 0; 1386*k-k*k 0]);
+
+// One of the coefficients in the polynomial equals zero
+P2=2*s^2-24;
+assert_checkequal(routh_t(P2),[2 -24; 4 0; -24 0]);
+
+// A row full of zeros
+P3=s^4-6*s^3+10*s^2-6*s+9;
+assert_checkequal(routh_t(P3),[1 10 9; -6 -6 0; 9 9 0; 18 0 0; 9 0 0]);
+
+//Error messages
+assert_checkfalse(execstr("routh_t(P,%t)","errcatch")==0);
+assert_checkfalse(execstr("routh_t(P,k)","errcatch")==0);
+assert_checkfalse(execstr("routh_t()","errcatch")==0);
+assert_checkfalse(execstr("routh_t(h)","errcatch")==0);
+assert_checkfalse(execstr("routh_t(h,k,%t,%t)","errcatch")==0);