bug 14192 fix + 0 divide bug fix 21/18221/2
Serge Steer [Mon, 6 Jun 2016 13:53:14 +0000 (15:53 +0200)]
Change-Id: I88adc7886c573f6ccf29653b3460999061580c93

scilab/CHANGES.md
scilab/modules/cacsd/macros/g_margin.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_14192.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_14192.tst [new file with mode: 0644]

index 2e63eba..06b80d9 100644 (file)
@@ -223,8 +223,11 @@ Bug Fixes
 ### In 6.0.0:
 
 * [Bug #13597](http://bugzilla.scilab.org/show_bug.cgi?id=13597) fixed - `help format` claimed setting a number of digits instead of characters
+* [Bug #14192](http://bugzilla.scilab.org/show_bug.cgi?id=14192) fixed - `g_margin` error-ed for double integrator.
 * [Bug #14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557) fixed - csim failed when the system has no state.
 * [Bug #14587](http://bugzilla.scilab.org/show_bug.cgi?id=14587) fixed - Datatip textbox wrong clipping when loaded from *.scg file.
+* [Bug #14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557) fixed - csim failed when the system has no state.
 
 ### In 6.0.0 beta-2 and earlier:
 
index fe9f5c0..3bb52ae 100644 (file)
@@ -1,8 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
-// Copyright (C) INRIA -  Author: Serge Steer
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) ???? - 2016 - INRIA -  Serge Steer
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
 // along with this program.
 
 function [gm,fr] = g_margin(h)
-    // Compute the gain margin of a SISO transfer function
+// Compute the gain margin of a SISO transfer function
 
-    if argn(2) < 1 then
-        error(msprintf(_("%s: Wrong number of input argument(s): %d expected.\n"),"g_margin",1));
-    end
+  if argn(2) < 1 then
+    error(msprintf(_("%s: Wrong number of input argument(s): %d expected.\n"),"g_margin",1));
+  end
+  if and(typeof(h)<>["state-space","rational"]) then
+    error(msprintf(gettext("%s: Wrong type for input argument: Linear dynamical system expected.\n"),"g_margin",1))
+  end
+  if size(h,"*")<>1 then
+    error(msprintf(gettext("%s: Wrong size for input argument #%d: Single input, single output system expected.\n"),"g_margin",1))
+  end
 
-    select typeof(h)
-    case "rational" then
-    case "state-space" then
-        h=ss2tf(h)
-    else
-        error(97,1),
-    end;
-    if or(size(h)<>[1 1]) then
-        error(msprintf(_("%s: Wrong size for input argument #%d: Single input, single output system expected.\n"),"g_margin",1))
-    end
+  if typeof(h)=="state-space" then
+    h=ss2tf(h)
+  end
+
+
+    ieee_save=ieee();ieee(2);
     //
     epsr=1.e-7;//used for testing if complex numbers are real
     eps1=1.e-7;//used for testing if complex numbers have a modulus near 1
@@ -40,10 +39,14 @@ function [gm,fr] = g_margin(h)
         den=real(horner(h.den,s)*conj(horner(h.den,s)))
         //necessary condition
         w=roots(num,"e");
-        ws=real(w(abs(imag(w))<epsr&real(w)<=0)) //points where phase is -180°
-
-        //remove nearly singular points
-        ws(abs(horner(num,ws))>=epssing*abs(horner(den,ws)))=[]
+        ws=[];
+        if w<>[] then
+          ws=real(w(abs(imag(w))<epsr&real(w)<=0)) //points where phase is -180°
+        end
+        if ws<>[] then
+          //remove nearly singular points
+          ws(abs(horner(num,ws))>=epssing*abs(horner(den,ws)))=[]
+        end
         if ws==[] then gm=%inf,fr=[],return,end
         mingain=real(freq(h.num,h.den,%i*ws))
     else  //discrete time case
@@ -54,15 +57,21 @@ function [gm,fr] = g_margin(h)
         sm=simp_mode();simp_mode(%f);hh=h-horner(h,1/z);simp_mode(sm)
         //find the numerator roots
         z=roots(hh.num,"e");
-        z(abs(abs(z)-1)>eps1)=[]// retain only roots with modulus equal to 1
-
-        //remove nearly singular points
-        z(abs(horner(hh.num,z))>=epssing*abs(horner(hh.den,z)))=[];
-
-        w=log(z)/(%i*dt)
-        ws=real(w(abs(imag(w))<epsr)) //points where phase is -180°
+        if z<>[] then
+          z(abs(abs(z)-1)>eps1)=[]// retain only roots with modulus equal to 1
+        end
+        if z<>[] then
+          //remove nearly singular points
+          z(abs(horner(hh.num,z))>=epssing*abs(horner(hh.den,z)))=[];
+        end
+        ws=[];
+        if z<>[] then
+          w=log(z)/(%i*dt)
+          ws=real(w(abs(imag(w))<epsr)) //points where phase is -180°
+        end
         if ws==[] then gm=%inf,fr=[],return,end
         mingain=real(horner(h,exp(%i*ws*dt)))
+        ieee(ieee_save)
     end
 
     k=find(mingain<0)
@@ -74,4 +83,5 @@ function [gm,fr] = g_margin(h)
     [gm,k]=min(gm);ws=ws(k);//select the minimum
 
     fr=ws/(2*%pi) //transform in Hz
+    ieee(ieee_save)
 endfunction
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_14192.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_14192.dia.ref
new file mode 100644 (file)
index 0000000..b9b9c3f
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clément DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14192 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14192
+//
+// <-- Short Description -->
+// When the transfer function is just a double integrator 1/s^2, g_margin()
+// gives error. It works fine with other functions.
+//
+s=%s;
+G=syslin("c",1/s^2);
+g_margin(G)
+ ans  =
+   Inf
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_14192.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_14192.tst
new file mode 100644 (file)
index 0000000..0450402
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Clément DAVID
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14192 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14192
+//
+// <-- Short Description -->
+// When the transfer function is just a double integrator 1/s^2, g_margin()
+// gives error. It works fine with other functions.
+//
+
+s=%s;
+G=syslin("c",1/s^2);
+g_margin(G)
+